Menu

HTML select 下拉列表:option、optgroup 与 multiple

如何用 <select> 和 <option> 在 HTML 中制作下拉列表:选项的值、默认选项或占位选项、required、选项分组、多选、在 JavaScript 中读取和设置值,以及自定义下拉箭头的样式。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

如何在 HTML 中制作下拉列表

下拉列表就是一个 <select> 元素,每个选项对应一个 <option>。每个选项的 value 是表单要发送的内容,标签之间的文字是用户看到的内容。选择一项,然后点击 Submit:

表单发送的是 language=js:select 的 name 和所选选项的 value。selected 设置默认选项;不加的话,默认选中第一个选项。如果某个选项没有 value,就会改为发送它的文字。

用 for 和 id 把标签和 select 关联起来(或者用标签把它包住),这样点击标签就能让下拉列表获得焦点,屏幕阅读器也会读出它。

select 和 option 的属性

元素属性作用
<select>name发送值时使用的键名
<select>required必须选择一个真正的选项,而不是空的第一个占位选项
<select>multiple可以选择多个选项
<select>size可见的行数(会把它变成列表框)
<select>disabled整个下拉列表被禁用,也不会被发送
<option>value选中它时发送的内容
<option>selected页面加载时被选中
<option>disabled显示出来,但不能选择
<optgroup>label这一组的标题

带 required 的占位选项

select 总是有一个值,所以如果没有占位选项,即使用户从没碰过下拉列表,第一个真正的选项也会被发送。一个空的第一选项可以解决这个问题,而 required 会在选中真正的选项之前阻止提交:

不做选择就点击 Continue:浏览器会拒绝提交,并提示你选择一项。占位选项设置了 value="",required 会把它当作空值;它还设置了 disabled,所以在选好国家之后,就不能再选回它。

用 optgroup 给选项分组

<optgroup label="..."> 给一组选项加上一个标题。这个标题不能被选择:

分组不能嵌套:一个列表只有一层标题,不能更多。给 <optgroup> 加上 disabled,会禁用组内的所有选项。

多选

multiple 让用户可以选择多个选项,并把下拉列表变成一个列表框。按住 Ctrl(Mac 上是 Cmd)可以逐个添加选项,按住 Shift 则可以选择一个范围:

表单发送的是 skills=html 和 skills=css:每个选中的选项各发送一次,名称都相同。很多人不知道 Ctrl 加点击这个操作,所以选项不多时,用一组复选框更好用。

在 JavaScript 中读取和设置值

select.value 可以读取和设置所选选项的值,用户选择了另一个选项时会触发 change 事件。一个常见用法是联动下拉列表:第二个下拉列表的选项取决于第一个:

new Option(text, value) 创建一个选项。select.selectedIndex 是所选选项的位置,select.selectedOptions 列出所有选中的选项,读取多选 select 的值就要用它。

select 的样式

下拉列表展开后的列表由浏览器和操作系统绘制,能设置样式的地方很少。收起时的框则可以:appearance: none 去掉原生箭头,再用背景图片放上你自己的箭头:

末尾额外的内边距给箭头留出空间,这样较长的选项文字不会跑到箭头下面。font: inherit 在这里和在按钮上一样重要:select 默认使用浏览器较小的表单字体。展开列表中的选项仍然保持原生外观。在 Chrome 中,用 appearance: base-select 主动开启后,展开的列表也能设置样式;不支持的浏览器会显示原生列表。要在所有浏览器中完全掌控外观,就得用 ARIA 自己做一个组件,要做好它,工作量比看起来大得多。

select、单选按钮还是 datalist?

用什么什么时候用
<select>从一长串选项中选一个,或者空间有限时
单选按钮从少量选项中选一个,并且所有选项都应该直接可见(参见 HTML 单选按钮)
带 <datalist> 的 <input>给出建议,但允许输入任何值

常见错误

  • 必选项没有占位选项。即使用户从没选过,第一个真正的选项也会被发送。
  • 占位选项带有真实的值,比如 value="none"。required 会把它当作有效的选择。请使用 value=""。
  • 文字较长或需要翻译时,选项没有 value。服务器收到的是显示的文字,而它会随语言变化。
  • 选项不多却用 multiple。复选框更好用。
  • 在选项上监听 click。请在 <select> 上监听 change,它在用键盘改变选择时也会触发。
  • 没有标签。只有占位选项的 select,一旦选中某个选项,就没有名称了。

常见问题

如何在 HTML 中创建下拉列表?

使用 <select>,每个选项写一个 <option>:<select name="color"><option value="red">Red</option><option value="blue">Blue</option></select>。再给 select 一个 name 和一个 <label>。

如何设置 select 的默认选项?

给那个选项加上 selected:<option value="blue" selected>Blue</option>。不加的话,默认选中第一个选项。在 JavaScript 中可以设置 select.value = 'blue'。

如何给 select 添加占位提示?

把第一个选项设为空值且不可选:<option value="" disabled selected>Choose a country</option>。再给 <select> 加上 required,这样在选中一个真正的选项之前,表单无法提交。

如何在 JavaScript 中获取 select 选中的值?

select.value 就是选中选项的值。要获取它显示的文字,用 select.selectedOptions[0].text;要在选择变化时做出响应,就监听 change 事件。对于多选的 select,遍历 select.selectedOptions 即可。

select 和 datalist 有什么区别?

<select> 只允许选择列出的选项。带 <datalist> 的 <input> 会在用户输入时给出建议,但接受任何文字。如果答案必须是你给定的选项之一,就用 select。

Coddy 编程语言插图

和 Coddy 一起学编程

开始