Menu

Select trong HTML: dropdown, option, optgroup và multiple

Cách tạo danh sách thả xuống (dropdown) trong HTML với <select> và <option>: value, lựa chọn mặc định hoặc placeholder, required, nhóm lựa chọn, chọn nhiều, đọc và gán giá trị bằng JavaScript, và định dạng mũi tên.

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 dropdown trong HTML

Danh sách thả xuống là một phần tử <select> với một <option> cho mỗi lựa chọn. value của mỗi option là thứ form gửi đi; chữ nằm giữa hai thẻ là thứ người dùng nhìn thấy. Hãy chọn một mục và nhấn Submit:

Form gửi language=js: name của select và value của option được chọn. selected đặt lựa chọn mặc định; nếu không có, option đầu tiên được chọn. Nếu option không có value, chữ của nó sẽ được gửi đi.

Nối label với select bằng for và id (hoặc bọc select bên trong label) để khi click vào label, dropdown nhận focus và trình đọc màn hình đọc được tên của nó.

Thuộc tính của select và option

Phần tửThuộc tínhTác dụng
<select>nameKhóa mà giá trị được gửi kèm
<select>requiredPhải chọn một option thật, không phải option placeholder rỗng ở đầu
<select>multipleCho phép chọn nhiều option
<select>sizeSố hàng hiển thị (biến dropdown thành hộp danh sách)
<select>disabledTắt cả dropdown và không gửi đi
<option>valueThứ được gửi đi khi option được chọn
<option>selectedĐược chọn khi trang tải
<option>disabledHiển thị nhưng không chọn được
<optgroup>labelTiêu đề của nhóm

Option placeholder cùng required

Select luôn có một giá trị, nên khi không có placeholder, option thật đầu tiên sẽ được gửi đi dù người dùng chưa hề chạm vào dropdown. Một option rỗng ở đầu khắc phục điều đó, và required chặn việc gửi form cho đến khi chọn một option thật:

Nhấn Continue trước khi chọn: trình duyệt từ chối và yêu cầu bạn chọn một mục. Placeholder có value="", giá trị mà required coi là rỗng, và có disabled để không thể chọn lại nó sau khi đã chọn một quốc gia.

Nhóm các option bằng optgroup

<optgroup label="..."> đặt một tiêu đề phía trên một nhóm option. Tiêu đề này không chọn được:

Không thể lồng nhóm vào nhau: một danh sách chỉ có một cấp tiêu đề, không hơn. disabled trên một <optgroup> sẽ tắt mọi option trong nhóm.

Chọn nhiều lựa chọn

multiple cho phép người dùng chọn nhiều option, và biến dropdown thành hộp danh sách. Giữ Ctrl (Cmd trên Mac) để thêm từng option, hoặc Shift để chọn một dải liền nhau:

Form gửi skills=html và skills=css: cùng một name lặp lại cho mỗi option được chọn. Nhiều người không biết thao tác Ctrl+click, nên khi chỉ có vài lựa chọn, một nhóm checkbox sẽ dễ dùng hơn.

Đọc và gán giá trị bằng JavaScript

select.value đọc và gán value của option được chọn, và sự kiện change xảy ra khi người dùng chọn một option khác. Một cách dùng phổ biến là dropdown thứ hai có các option phụ thuộc vào dropdown thứ nhất:

new Option(text, value) tạo một option. select.selectedIndex là vị trí của option được chọn, còn select.selectedOptions liệt kê các option được chọn, đó là cách đọc một select chọn nhiều.

Định dạng select

Danh sách mở ra của dropdown do trình duyệt và hệ điều hành vẽ, và phần lớn không định dạng được. Còn hộp đóng thì được: appearance: none bỏ mũi tên gốc, và một ảnh nền đặt mũi tên của riêng bạn vào chỗ đó:

Padding thêm ở cuối chừa chỗ cho mũi tên để chữ của option dài không chạy xuống dưới nó. font: inherit ở đây quan trọng không kém trên nút bấm: mặc định select dùng font form nhỏ của trình duyệt. Các option trong danh sách mở vẫn giữ giao diện gốc. Chrome cũng định dạng được danh sách mở khi bạn bật appearance: base-select; trình duyệt chưa hỗ trợ sẽ hiện danh sách gốc. Muốn kiểm soát hoàn toàn trên mọi trình duyệt thì phải tự dựng một widget với ARIA, và làm đúng khó hơn nhiều so với vẻ ngoài.

select, radio button hay datalist?

DùngKhi
<select>Chọn một trong danh sách dài, hoặc khi không gian chật
Radio buttonChọn một trong vài lựa chọn cần hiện ra hết (xem radio button trong HTML)
<input> có <datalist>Có gợi ý, nhưng cho phép gõ bất kỳ giá trị nào

Lỗi thường gặp

  • Không có placeholder cho một lựa chọn bắt buộc. Option thật đầu tiên được gửi đi dù người dùng chưa từng chọn nó.
  • Placeholder có giá trị thật, như value="none". required coi đó là một lựa chọn hợp lệ. Hãy dùng value="".
  • Option không có value khi chữ dài hoặc được dịch. Máy chủ nhận chữ hiển thị, và chữ này thay đổi theo ngôn ngữ.
  • multiple cho vài lựa chọn. Checkbox dễ dùng hơn.
  • Lắng nghe click trên option. Hãy dùng change trên <select>; sự kiện này cũng xảy ra khi thay đổi bằng bàn phím.
  • Không có label. Một select chỉ có placeholder sẽ không còn tên khi đã chọn một option.

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

Làm sao tạo danh sách thả xuống trong HTML?

Dùng <select> với một <option> cho mỗi lựa chọn: <select name="color"><option value="red">Red</option><option value="blue">Blue</option></select>. Đặt cho select một name và một <label>.

Làm sao đặt lựa chọn mặc định cho select?

Thêm selected vào option đó: <option value="blue" selected>Blue</option>. Nếu không có, option đầu tiên được chọn. Trong JavaScript, gán select.value = 'blue'.

Làm sao thêm placeholder cho select?

Cho option đầu tiên rỗng và không chọn được: <option value="" disabled selected>Choose a country</option>. Thêm required vào <select> để form không gửi được cho đến khi chọn một option thật.

Làm sao lấy giá trị đã chọn của select bằng JavaScript?

select.value là value của option đang được chọn. Để lấy chữ hiển thị, dùng select.selectedOptions[0].text, và lắng nghe sự kiện change để phản hồi khi lựa chọn thay đổi. Với select chọn nhiều, duyệt qua select.selectedOptions.

select và datalist khác nhau thế nào?

<select> chỉ cho phép chọn các option có trong danh sách. Một <input> có <datalist> gợi ý các lựa chọn khi người dùng gõ nhưng vẫn chấp nhận mọi đoạn chữ. Dùng select khi câu trả lời bắt buộc phải là một trong các lựa chọn của bạn.

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