<label> nối phần chữ mô tả với control.
Hai cách viết:
html
<!-- 1. explicit: for trỏ tới id của input -->
<label for="email">Email</label>
<input id="email" type="email">
<!-- 2. implicit: bọc input trong label -->
<label>Email <input type="email"></label>Ba thứ có được ngay:
1. Click vào chữ = focus/tick input — vùng bấm rộng ra rất nhiều trên mobile, đặc biệt với checkbox nhỏ.
2. Screen reader đọc đúng tên field khi focus tới.
3. Test bền hơn — getByLabelText('Email') không vỡ khi đổi class hay cấu trúc DOM.
Lỗi phổ biến nhất: dùng placeholder thay label.
html
<input type="email" placeholder="Email"> <!-- sai -->Placeholder biến mất ngay khi gõ, nên người dùng quên field này là gì; độ tương phản thấp; và một số screen reader không đọc. Placeholder là ví dụ định dạng (you@example.com), không phải nhãn.
Chốt: cần ẩn nhãn vì lý do thiết kế thì dùng CSS .sr-only, đừng bỏ hẳn <label>.