Cách tạo radio button trong HTML
Radio button cho người dùng chọn đúng một lựa chọn trong một nhóm. Mỗi lựa chọn là một <input type="radio">, và chính việc đặt cùng một name khiến chúng thành một nhóm. Hãy chọn một cỡ và nhấn Order:
Form gửi đi một cặp, size=m: name của nhóm và value của nút đang được chọn. Các thành phần:
- Cùng một
nametrên mọi nút của nhóm. Chọn một nút sẽ bỏ chọn các nút còn lại. - Một
valuekhác nhau trên mỗi nút. Đó là thứ máy chủ nhận được. Radio không cóvaluesẽ gửion, và máy chủ chẳng biết được gì từ giá trị đó. checkedtrên lựa chọn mặc định.- Một
<label>bọc quanh mỗi nút để chữ cũng bấm được, và một<fieldset>có<legend>để trình đọc màn hình đọc câu hỏi ("Size") cùng với từng lựa chọn.
Thuộc tính name tạo nên nhóm
Các radio có name khác nhau là những nhóm riêng, và mỗi nhóm có lựa chọn riêng. Ví dụ này có hai nhóm, cùng một bộ bị lỗi trong đó mỗi radio vô tình có name riêng:
Hãy click cả ba nút trong nhóm bị lỗi: cả ba đều được chọn và không nút nào tắt đi được nữa, tức là gánh cả nhược điểm của hai loại. Radio được nhóm theo name trong cùng một form, nên hai form có thể mỗi form có một nhóm name="size" riêng.
Nhóm bắt buộc chọn và không có mặc định
required trên bất kỳ radio nào trong nhóm nghĩa là phải chọn một nút trước khi form được gửi. Bỏ checked buộc người dùng tự chọn, điều này hợp lý khi không có lựa chọn mặc định nào thích hợp:
Nhấn Continue mà chưa chọn, trình duyệt sẽ chặn việc gửi form và hiện thông báo. Khi đã chọn bất kỳ lựa chọn nào, cả nhóm hợp lệ. Một nhóm không bắt buộc mà chưa được chọn sẽ không gửi gì cả, giống như một checkbox chưa được đánh dấu.
Click có thể chọn một radio nhưng không bao giờ bỏ chọn được. Nếu người dùng cần quay lại trạng thái "không trả lời" sau khi đã chọn, hãy thêm một lựa chọn riêng cho trường hợp đó.
Đọc giá trị đã chọn bằng JavaScript
form.elements.name trả về cả nhóm, và .value của nhóm là value của radio đang được chọn (chuỗi rỗng khi chưa có nút nào). Sự kiện change xảy ra trên radio vừa được chọn:
Trình xử lý sự kiện nằm trên form, nên nó bắt được thay đổi ở bất kỳ trường nào của form. Khi không có form, hãy tìm radio đang được chọn bằng document.querySelector('input[name="period"]:checked').
Dùng bàn phím với radio button
Một nhóm radio chỉ là một điểm dừng khi nhấn Tab. Tab đưa bạn vào nhóm, dừng ở radio đang được chọn (hoặc ở nút đầu tiên khi chưa có nút nào được chọn), và các phím mũi tên chuyển lựa chọn giữa các nút. Nhấn Tab lần nữa để rời nhóm. Bạn có sẵn hành vi này khi dùng input radio thật có chung name, và đó thêm một lý do để không tự dựng lại radio từ các phần tử <div>.
Định dạng radio button
accent-color đổi màu radio gốc của trình duyệt. appearance: none cho phép bạn tự vẽ vòng tròn. Và vì một radio bị ẩn vẫn có thể được chọn qua label của nó, một nhóm có thể trông như một bộ thẻ mà vẫn giữ nguyên mọi hành vi của radio:
Vòng tròn tùy chỉnh chỉ là một đường viền dày khi được chọn. Các thẻ ẩn input bằng opacity: 0 thay vì display: none, nên input vẫn nhận focus và phím mũi tên vẫn hoạt động, còn :has(input:checked) định dạng thẻ đang được chọn. :has() chạy được trên các phiên bản Chrome, Firefox và Safari hiện tại.
Radio, checkbox hay select?
| Dùng | Khi |
|---|---|
| Radio button | Chọn một trong vài lựa chọn (khoảng từ 2 đến 6) cần hiện ra hết |
| Checkbox | Chọn bao nhiêu cũng được, kể cả không chọn gì |
Một <select> | Chọn một trong danh sách dài, như danh sách quốc gia (xem select trong HTML) |
Lỗi thường gặp
- Các
namekhác nhau trong một nhóm. Radio nào cũng chọn được và không nút nào bỏ chọn được. - Không có
value. Máy chủ nhậnondù người dùng chọn gì. - Ẩn input bằng
display: nonetrong giao diện tùy chỉnh. Input không còn nhận focus hay dùng được bằng bàn phím. - Không có
<fieldset>và<legend>. Trình đọc màn hình đọc "Small, radio button" mà không có câu hỏi đi kèm. - Chỉ một radio button cho ô "Tôi đồng ý". Nút này không bao giờ bỏ chọn được; hãy dùng checkbox.
checkedtrên nhiều radio của một nhóm. Cuối cùng chỉ nút cuối được chọn.
Câu hỏi thường gặp
Làm sao để tạo radio button trong HTML?
Viết một <input type="radio"> cho mỗi lựa chọn, đặt cho tất cả cùng một name và mỗi nút một value khác nhau, rồi đặt từng nút trong một <label>: <label><input type="radio" name="size" value="m"> Medium</label>. Cái tên chung biến chúng thành một nhóm, trong đó chỉ chọn được một nút.
Vì sao chọn được nhiều radio button cùng lúc?
Các nút không có cùng name. Radio button chỉ thành một nhóm khi có name giống hệt nhau (trong cùng một form), và mỗi nhóm chỉ chọn được một nút.
Làm sao lấy giá trị radio button đã chọn bằng JavaScript?
Dùng form.elements.size.value, trong đó size là tên của nhóm; biểu thức này trả về value của nút đang được chọn, hoặc chuỗi rỗng nếu chưa nút nào được chọn. Khi không có form: document.querySelector('input[name="size"]:checked')?.value.
Làm sao đặt radio button được chọn mặc định?
Thêm checked vào một nút trong nhóm: <input type="radio" name="plan" value="free" checked>. Nếu nhiều nút cùng có thuộc tính này, nút cuối cùng sẽ được chọn.
Có bỏ chọn radio button được không?
Không thể bỏ chọn bằng cách click vào nút; click chỉ chọn. Hãy thêm một lựa chọn "Không", đặt lại form, hoặc gán button.checked = false bằng JavaScript. Nếu lựa chọn là tùy ý và có thể gỡ bỏ, checkbox hoặc select có thể phù hợp hơn.