Menu

Textarea trong HTML: rows, resize, maxlength và chữ mặc định

Cách tạo ô nhập chữ nhiều dòng bằng <textarea>: rows và cols, chữ mặc định giữa hai thẻ, đổi kích thước và tự giãn, maxlength kèm bộ đếm ký tự, xuống dòng trong dữ liệu gửi đi và cách định kiểu.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Cách tạo textarea

<textarea> là ô nhập chữ dành cho nhiều hơn một dòng: tin nhắn, bình luận, mô tả. rows đặt chiều cao hiển thị tính theo số dòng. Gõ vài dòng rồi nhấn Send:

Có hai điểm khác với <input>: textarea cần thẻ đóng, và chữ ban đầu nằm giữa hai thẻ chứ không nằm trong thuộc tính value. name của nó được gửi đi cùng với nội dung làm giá trị, kể cả các lần xuống dòng.

Thuộc tính của textarea

Thuộc tínhTác dụng
nameKhóa mà nội dung được gửi kèm
rowsChiều cao hiển thị tính theo dòng (mặc định 2)
colsChiều rộng hiển thị tính theo ký tự (mặc định 20); dùng width của CSS thường tốt hơn
placeholderGợi ý hiện ra khi ô còn trống
maxlength, minlengthGiới hạn độ dài tính theo ký tự
requiredKhông được để trống
readonlyChọn và sao chép được nhưng không sửa được; vẫn được gửi đi
disabledKhông dùng được; không được gửi đi
wrapsoft (mặc định) hoặc hard, xem bên dưới
spellchecktrue hoặc false

Chữ mặc định nằm giữa hai thẻ

Mọi thứ giữa <textarea> và </textarea> là chữ ban đầu, giữ nguyên như khi viết: cả dấu cách, tab và xuống dòng. Chỉ một lần xuống dòng ngay sau thẻ mở bị bỏ qua. Vì vậy thụt lề là một cái bẫy:

Textarea thứ hai bắt đầu bằng bốn dấu cách và kết thúc bằng một lần xuống dòng cùng hai dấu cách nữa, tất cả người đọc đều phải tự xóa. Hãy viết chữ mặc định sát vào hai thẻ.

HTML bên trong textarea không được hiển thị thành định dạng; <b>hi</b> đặt giữa hai thẻ sẽ hiện ra đúng nguyên văn như vậy.

Chiều rộng, đổi kích thước và tự giãn

Trình duyệt cho người đọc kéo góc để đổi kích thước textarea. Thuộc tính CSS resize giới hạn việc này, còn width: 100% cùng box-sizing: border-box giúp ô nhập lấp vừa khít phần tử chứa:

Ô cuối cùng đặt lại chiều cao rồi gán nó bằng scrollHeight (chiều cao của nội dung và padding) cộng với viền, sau mỗi lần gõ phím. Gõ vài dòng vào đó: nó không bao giờ hiện thanh cuộn. resize: vertical là mặc định thân thiện nhất: câu trả lời dài có thêm chỗ, và không ai kéo được ô nhập rộng hơn bố cục.

Trình duyệt Chromium có thể tự giãn chỉ bằng CSS với field-sizing: content. Trình duyệt không hỗ trợ sẽ bỏ qua dòng này và giữ kích thước bình thường, nên thêm vào là an toàn, nhưng hãy giữ đoạn script nếu muốn mọi người đọc đều có ô nhập tự giãn.

maxlength và bộ đếm ký tự

maxlength ngừng nhận chữ khi đạt một số ký tự nhất định. Dùng riêng thì nó không cảnh báo gì, nên người đọc chỉ nhận ra khi gõ không được nữa. Một bộ đếm giải quyết chuyện này:

aria-describedby khiến trình đọc màn hình đọc bộ đếm cùng với ô nhập, còn aria-live="polite" thông báo khi bộ đếm thay đổi giữa các lần gõ phím. maxlength chỉ được trình duyệt áp dụng, nên máy chủ cũng phải kiểm tra độ dài.

Xuống dòng trong dữ liệu gửi đi

Các lần xuống dòng của người đọc được gửi đi cùng nội dung. Trong dữ liệu gửi đi, mỗi lần xuống dòng trở thành một cặp ký tự về đầu dòng và xuống dòng (%0D%0A trong form mã hóa URL), đúng như hầu hết máy chủ mong đợi. Để hiển thị lại nội dung trên trang kèm các lần xuống dòng, hãy đổi chúng thành <br> khi xuất ra hoặc định kiểu phần tử với white-space: pre-line.

wrap="hard" (cần có cols) còn đi xa hơn: nó chèn thêm dấu xuống dòng ở những chỗ chữ tự xuống dòng khi hiển thị, nên máy chủ nhận được các dòng không dài quá cols ký tự. Mặc định wrap="soft" chỉ gửi những lần xuống dòng mà người đọc tự gõ.

Định kiểu textarea

Chrome và Firefox cho textarea font monospace cỡ khoảng 13px, đó là lý do textarea thường trông lạc lõng. font: inherit sửa được việc này. Nếu đổi viền, hãy giữ một kiểu focus dễ thấy:

Chữ placeholder nên có độ tương phản đủ để đọc; màu xám nhạt mà nhiều thiết kế dùng rất khó đọc. Và như mọi ô nhập khác, placeholder không thay được nhãn: nó biến mất ngay khi người đọc bắt đầu gõ. Nhãn được giải thích trong label trong HTML.

Lỗi thường gặp

  • <textarea value="...">. Không có thuộc tính value; hãy đặt chữ giữa hai thẻ.
  • Thụt lề chữ mặc định theo code HTML. Các dấu cách trở thành một phần của giá trị.
  • Viết tự đóng <textarea />. Nó không phải phần tử rỗng; thiếu </textarea> thì phần còn lại của trang bị nuốt vào trong nó thành chữ.
  • Không có font: inherit, nên ô nhập dùng font monospace cỡ nhỏ.
  • resize: none với chiều cao cố định nhỏ. Câu trả lời dài bị nhét vào một ô cuộn bé xíu.
  • Chỉ dựa vào maxlength. Hãy kiểm tra độ dài ở cả máy chủ.

Câu hỏi thường gặp

Làm sao tạo textarea trong HTML?

Viết <textarea name="message" rows="4"></textarea> bên trong một form, kèm một <label>. Khác với <input>, nó có thẻ đóng, và mọi thứ nằm giữa hai thẻ là chữ ban đầu.

Làm sao đặt giá trị mặc định cho textarea?

Đặt chữ giữa hai thẻ: <textarea name="bio">Hello</textarea>. Trong HTML, textarea không có thuộc tính value. Trong JavaScript, bạn đọc và gán textarea.value.

Làm sao chặn người dùng đổi kích thước textarea?

Đặt resize: none trong CSS. resize: vertical thường thân thiện hơn: người đọc vẫn kéo cao ô nhập khi viết dài, nhưng không thể làm vỡ bố cục bằng cách kéo rộng ra.

Làm sao giới hạn số ký tự trong textarea?

Thêm maxlength="280". Trình duyệt sẽ ngừng nhận chữ khi đạt độ dài đó. Hiển thị một bộ đếm bên cạnh, cập nhật theo sự kiện input, để người đọc biết còn bao nhiêu chỗ, và kiểm tra độ dài cả ở máy chủ.

Vì sao textarea dùng font chữ khác với trang?

Mặc định Chrome và Firefox cho textarea font monospace cỡ khoảng 13px. Thêm font: inherit để nó khớp với phần còn lại của trang.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu