Phần tử label làm gì
<label> đặt tên cho một trường form. Nối nó bằng for, gán bằng id của trường, và hai điều sẽ xảy ra: trình đọc màn hình đọc nhãn khi trường được focus, và nhấp vào chữ của nhãn sẽ focus vào trường. Nhấp thử vào cả hai dòng chữ bên dưới:
Nhấp vào "City" đặt con trỏ vào trường của nó. Nhấp vào "Country" không có tác dụng gì, và trình đọc màn hình khi focus vào trường thứ hai chỉ đọc "edit text", không có tên. Hai dòng trông giống hệt nhau; chỉ một dòng có nhãn.
Hai cách nối nhãn
Dùng for và id, hoặc đặt trường vào bên trong nhãn:
for và id | Bọc | |
|---|---|---|
Cần id | Có, duy nhất trên trang | Không |
| Nhãn và trường có thể nằm tách nhau | Có (một ô bảng, một lưới) | Không, trường nằm bên trong |
| Dễ hỏng do | Gõ sai hoặc trùng id | Đặt hai trường trong một nhãn |
for phải khớp với id của trường, không phải name. Hai giá trị này thường là cùng một từ, nên lỗi bị che đi cho đến khi ai đó đổi một trong hai. Làm cả hai cách (bọc và for) là ổn và rất phổ biến.
Một nhãn có thể nối với <input> (trừ type="hidden"), <select>, <textarea>, <button>, <meter>, <output> và <progress>. Một nhãn đặt tên cho một trường. Một trường có thể có nhiều nhãn, dù một nhãn rõ ràng thì dễ hiểu hơn cho mọi người.
Vùng nhấp lớn hơn cho checkbox và radio
Với các control nhỏ, nhãn quan trọng nhất: nhấp vào bất kỳ đâu trên nhãn đều bật/tắt ô, nên vùng nhấp là cả dòng chữ chứ không chỉ một ô vuông 13 pixel. Thêm style cho nhãn còn làm vùng nhấp lớn hơn nữa:
Nhấp vào phần đệm của mỗi hàng, cách xa ô. Hàng đầu tiên bật/tắt; hàng thứ hai không làm gì trừ khi bạn nhấp trúng chính cái ô. Tìm hiểu thêm về checkbox ở checkbox trong HTML.
Gợi ý và thông báo lỗi
Nhãn nên ngắn: chỉ là tên của trường. Hướng dẫn thêm và thông báo lỗi nằm ở các phần tử riêng, nối bằng aria-describedby, để trình đọc màn hình đọc nhãn trước rồi mới đọc phần mô tả:
Nhấn Create khi ô trống, rồi với AB, rồi với ada99. Nhờ aria-describedby, trình đọc màn hình sẽ đọc kiểu như "Username, required, edit text, 3 to 16 lowercase letters or digits, Enter a username." Dấu sao có aria-hidden vì thuộc tính required đã nói "required" rồi; nghe thêm "star" chẳng có ích gì.
Nhãn ẩn
Một số trường có dấu hiệu nhận biết khác ngoài nhãn chữ, chẳng hạn ô tìm kiếm cạnh nút Search. Nhãn vẫn cần thiết; hãy ẩn nó về mặt hiển thị nhưng giữ trong trang cho trình đọc màn hình:
Đừng ẩn bằng display: none hay visibility: hidden: chúng ẩn luôn với trình đọc màn hình, và không phải trình duyệt hay trình đọc màn hình nào cũng còn dùng nhãn bị ẩn làm tên. Lựa chọn còn lại là aria-label="Search courses" trên input, cách này đặt tên mà không cần phần tử label nào. Dù vậy, nhãn hiển thị vẫn là lựa chọn tốt nhất mỗi khi còn chỗ: ai cũng được lợi khi thấy rõ một trường dùng để làm gì.
Lỗi thường gặp
fortrỏ tớinamethay vìid. Không có gì được nối.- Trùng id.
fornối với phần tử đầu tiên có id đó, có thể là một trường trong form khác trên trang. - Dùng placeholder thay cho nhãn. Nó biến mất khi gõ và không phải là tên đáng tin cậy.
- Hai trường trong một nhãn. Một nhãn chỉ đặt tên cho một trường; trường thứ hai bị bỏ không có nhãn.
- Một liên kết bên trong nhãn của checkbox, như "I accept the terms" với "terms" là liên kết. Một phần dòng bật/tắt ô, một phần mở trang khác, rất dễ bấm nhầm. Hãy đặt liên kết ra ngoài nhãn.
- Ẩn nhãn bằng
display: none. Dùng một class ẩn về mặt hiển thị (visually-hidden). - Chữ cạnh trường nhưng không phải
<label>. Trông giống hệt và chẳng làm gì. Về form bao quanh các trường, xem form trong HTML.
Câu hỏi thường gặp
Thẻ label trong HTML dùng để làm gì?
Nó đặt tên cho một trường form. Trình đọc màn hình đọc nhãn khi trường được focus, và nhấp vào nhãn sẽ focus vào trường, hoặc bật/tắt trường đó nếu là checkbox hay radio button.
Thuộc tính for trong label là gì?
for chứa id của trường mà nhãn thuộc về: <label for="email">Email</label> <input id="email">. Giá trị phải khớp chính xác với id, không phải với name.
Nên đặt input bên trong label hay dùng for?
Cả hai đều hoạt động trên các trình duyệt và trình đọc màn hình hiện nay. Cách bọc không cần id; for và id cho phép nhãn và trường nằm ở những chỗ khác nhau trong markup, chẳng hạn hai ô bảng riêng. Nhiều nhóm vừa bọc vừa thêm for.
Placeholder có thay được label không?
Không. Placeholder biến mất ngay khi người đọc bắt đầu gõ, thường có độ tương phản thấp và không được đọc như tên của trường một cách đáng tin cậy. Hãy dùng một <label> hiển thị rõ, và chỉ giữ placeholder cho giá trị ví dụ nếu cần.
Làm sao ẩn label nhưng vẫn giữ cho trình đọc màn hình?
Giữ thẻ <label> và ẩn nó về mặt hiển thị bằng một class thu nó về 1 pixel và cắt đi, thay vì display: none, vốn ẩn luôn với trình đọc màn hình. Với một trường không còn chỗ cho bất kỳ nhãn nào, aria-label trên trường là lựa chọn thay thế.