Cách tạo checkbox trong HTML
Checkbox là một <input type="checkbox">. Đặt nó bên trong một <label> cùng với chữ, để nhấp vào chữ cũng bật tắt được ô. Chọn một hoặc cả hai ô rồi nhấn Save để xem form gửi gì:
Với trạng thái mặc định, form chỉ gửi updates=on. Hai quy tắc giải thích điều này:
- Ô được chọn gửi
name=value. Ô thứ hai không cóvalue, nên nó gửi giá trị mặc định,on. - Ô không được chọn không gửi gì cả. Không phải
newsletter=no, cũng không phải giá trị rỗng: tên của nó vắng mặt trong dữ liệu.
checked trong HTML đặt trạng thái ban đầu. Như mọi thuộc tính boolean, chỉ cần có mặt là đủ: checked="false" vẫn chọn ô.
Thuộc tính của checkbox
| Thuộc tính | Tác dụng |
|---|---|
name | Khóa được gửi khi ô được chọn |
value | Giá trị được gửi khi ô được chọn (mặc định on) |
checked | Được chọn khi trang tải |
required | Form không gửi được cho tới khi ô này được chọn |
disabled | Không bật tắt được và không được gửi |
Nhóm checkbox
Với kiểu "chọn bất kỳ trong số này", hãy cho mọi ô cùng một name và mỗi ô một value khác nhau. Bọc chúng trong một <fieldset> với <legend> để nhóm có tên:
Form gửi topic=html và topic=css: cùng một tên hai lần. Hầu hết framework phía máy chủ đọc được nó thành một danh sách. PHP là ngoại lệ: nó chỉ giữ giá trị cuối trừ khi tên kết thúc bằng cặp ngoặc vuông, name="topic[]". Trong JavaScript, new FormData(form).getAll('topic') trả về ['html', 'css'].
Gửi giá trị khi ô không được chọn
Khi máy chủ cần một giá trị "không" rõ ràng, hãy đặt một input ẩn cùng name trước checkbox. Khi không chọn, chỉ giá trị ẩn được gửi; khi chọn, cả hai được gửi và máy chủ lấy giá trị cuối:
Nhấn Continue: form từ chối gửi cho tới khi ô điều khoản được chọn, vì nó có required. Sau đó form gửi marketing=no và terms=accepted, hoặc marketing=no, marketing=yes và terms=accepted khi ô đầu được chọn. Các framework như Rails tạo ra đúng cặp input ẩn này. Hãy kiểm tra cách máy chủ của bạn đọc một tên lặp lại trước khi dựa vào nó.
Chọn tất cả và trạng thái indeterminate
Checkbox có hình dạng thứ ba, một dấu gạch ngang, cho trường hợp "một số nhưng không phải tất cả". Nó chỉ có trong JavaScript: đặt box.indeterminate = true. Ô "chọn tất cả" dùng nó khi một vài ô mà nó điều khiển đã được chọn:
indeterminate chỉ thay đổi hình dạng (và điều trình đọc màn hình đọc lên: "mixed" hoặc "partially checked"). Bên dưới, ô vẫn chỉ ở trạng thái được chọn hoặc không, và đó là thứ form gửi đi. Nhấp vào ô indeterminate sẽ xóa dấu gạch và bật tắt nó.
Dùng sự kiện change để phản hồi checkbox, và đọc box.checked để biết trạng thái. box.value không thay đổi khi ô được bật tắt.
Định dạng checkbox
Cách đổi nhanh nhất là accent-color, thuộc tính tô lại màu checkbox gốc mà vẫn giữ mọi hành vi của nó. Muốn giao diện hoàn toàn khác, appearance: none bỏ phần vẽ gốc và cho bạn định dạng input như mọi khung khác:
Ô tùy chỉnh vẫn là một checkbox thật: nó bật tắt khi nhấp và khi nhấn Space, được gửi cùng form và được đọc là checkbox. Hãy vẽ nó bằng :checked và giữ một kiểu :focus-visible, vì khi bỏ phần vẽ gốc thì không còn vòng focus nào ngoài cái bạn tự thêm.
Công tắc bật tắt
Công tắc là một checkbox mang nghĩa "bật/tắt ngay lúc này" thay vì "bao gồm mục này". Vẽ nó bằng appearance: none và thêm role="switch" để trình đọc màn hình đọc là một công tắc đang bật hoặc tắt thay vì một checkbox được chọn:
inset-inline-start đặt núm công tắc tính từ đầu dòng, nên trên trang viết từ phải sang trái công tắc trượt theo chiều ngược lại, đúng như mong muốn. Với các lựa chọn có/không theo nhóm mà chỉ được chọn một, xem radio button HTML.
Lỗi thường gặp
- Mong ô không được chọn gửi
false. Không có gì được gửi. Hãy coi tên bị thiếu là "tắt" ở phía máy chủ, hoặc thêm input ẩn. checked="false". Nó vẫn chọn ô. Hãy xóa thuộc tính.- Checkbox không có nhãn, hoặc có chữ bên cạnh nhưng không phải
<label>. Khi đó ô nhỏ là chỗ nhấp duy nhất và trình đọc màn hình chỉ đọc "checkbox" mà không có tên. Xem nhãn HTML. - Quên
value, khiến mọi ô trong nhóm đều gửionvà máy chủ không phân biệt được. - Đọc
box.valueđể xem ô có được chọn không. Hãy dùngbox.checked. - Dùng checkbox cho kiểu "chọn một". Đó là việc của radio button.
Câu hỏi thường gặp
Làm sao tạo checkbox trong HTML?
Dùng <input type="checkbox"> bên trong một nhãn: <label><input type="checkbox" name="terms" value="yes"> I agree</label>. Nhãn giúp phần chữ cũng nhấp được.
Làm sao để checkbox được chọn sẵn?
Thêm thuộc tính checked: <input type="checkbox" name="news" checked>. Chỉ cần có mặt là đủ, nên checked="false" vẫn chọn ô. Trong JavaScript, đặt box.checked = true hoặc false.
Checkbox không được chọn gửi giá trị gì?
Không gì cả. Checkbox không được chọn bị bỏ hẳn khỏi dữ liệu gửi đi. Checkbox được chọn gửi value của nó, hoặc on nếu không có value. Nếu máy chủ cần một giá trị "không" rõ ràng, hãy đặt một input ẩn cùng name trước checkbox.
Làm sao lấy giá trị checkbox bằng JavaScript?
Đọc box.checked, giá trị này là true hoặc false. box.value là giá trị mà ô sẽ gửi, và nó giữ nguyên dù ô có được chọn hay không. Lắng nghe sự kiện change để phản hồi khi ô được bật tắt.
Làm sao đổi màu checkbox?
Đặt accent-color cho nó: input[type=checkbox] { accent-color: #16a34a; }. Muốn giao diện hoàn toàn riêng, đặt appearance: none rồi tự vẽ ô và dấu tích bằng CSS.