在网页表单里,下拉框通常一次只能选择一个选项,这是select标签的默认行为。但有些场景下我们需要用户同时选中多项,比如选择兴趣爱好、挑选多个标签、设置权限范围等。HTML其实早就为这种情况提供了原生支持,只要给select标签加上multiple属性,普通的单选下拉框就会变成一个可多选的列表框,用户按住Ctrl键(Mac上是Command键)点击即可选中多个选项,按住Shift键还能实现范围选择。

multiple属性的基础用法
multiple是HTML中的一个布尔属性,也就是说只要这个属性存在就会生效,不需要给它赋值。在HTML5规范中,写<select multiple>或者<select multiple="multiple">都是合法的,效果完全一样。加上这个属性之后,select的外观会发生明显变化:原本需要点击才能展开的下拉框,会直接变成一个始终显示若干行的列表框。
下面是一个最简单的示例,展示了一个支持多选的水果选择框:
<form action="/submit" method="post">
<label for="fruits">请选择你喜欢的水果(可多选):</label><br/>
<select id="fruits" name="fruits" multiple>
<option value="apple">苹果</option>
<option value="banana">香蕉</option>
<option value="orange">橙子</option>
<option value="grape">葡萄</option>
<option value="watermelon">西瓜</option>
</select>
<button type="submit">提交</button>
</form>需要注意一个关键点:多选框的name属性值建议写成数组形式,比如name="fruits[]"。这样在PHP等后端语言中接收数据时,才能拿到一个包含所有选中项的数组,否则只会收到最后一个选中的值。这是新手最容易踩的坑之一。
用size属性控制显示行数
只加multiple属性时,不同浏览器对列表框默认显示的行数处理并不一致,有的显示4行,有的显示更多。为了让页面效果可控,通常会搭配size属性一起使用。size属性用来指定列表框中同时可见的选项数量,超出部分会出现滚动条。
比如size="5"表示列表框高度固定显示5个选项,如果选项总数超过5个,右侧会自动出现滚动条供用户滚动查看。将size设置为1并配合multiple使用虽然语法上不报错,但在部分浏览器中体验会很怪异,所以实际开发中size的值一般不小于2。
<select name="tags[]" multiple size="6" style="width: 200px;">
<option value="frontend">前端开发</option>
<option value="backend">后端开发</option>
<option value="database">数据库</option>
<option value="testing">软件测试</option>
<option value="ops">运维部署</option>
<option value="design">UI设计</option>
</select>除了控制行数,还可以通过CSS设置select的宽度和高度,但要注意不要把高度设得过小,否则在移动端浏览器上可能出现选项显示不全的问题。
默认选中多个选项的方法
如果希望页面加载时就有几个选项处于选中状态,可以给对应的option标签添加selected属性。selected同样是布尔属性,可以同时出现在多个option上,这一点和单选下拉框不同,单选情况下即使写了多个selected,也只有最后一个会生效。
<select name="skills[]" multiple size="5">
<option value="html" selected>HTML</option>
<option value="css" selected>CSS</option>
<option value="javascript">JavaScript</option>
<option value="python" selected>Python</option>
<option value="java">Java</option>
</select>上面的代码会让HTML、CSS和Python三项在页面打开时默认高亮选中。这个特性在做编辑表单时特别有用,比如用户资料回显场景,从数据库读出用户之前勾选的技能,再循环输出时给对应项加上selected即可。
用JavaScript获取和操作多选值
提交表单后后端能拿到数据还不够,很多时候我们需要在前端实时获取用户选中的内容,比如做联动筛选、即时校验等。通过JavaScript访问select元素的selectedOptions属性,可以拿到所有被选中的option元素集合,再用循环取出它们的value值。
// 获取select元素
var selectBox = document.getElementById('fruits');
// 方法一:遍历selectedOptions
var selected = [];
for (var i = 0; i < selectBox.selectedOptions.length; i++) {
selected.push(selectBox.selectedOptions[i].value);
}
console.log(selected); // 例如输出:["apple", "orange"]
// 方法二:遍历所有option判断selected状态
var values = [];
var options = selectBox.options;
for (var j = 0; j < options.length; j++) {
if (options[j].selected) {
values.push(options[j].value);
}
}
console.log(values);
// 用代码选中某几项
selectBox.options[0].selected = true;
selectBox.options[2].selected = true;selectedOptions是相对较新的API,在老旧浏览器(如IE11)中不受支持,如果需要兼容IE,建议使用方法二的通用写法。另外,如果使用jQuery,直接一行$('#fruits').val()就能返回所有选中值组成的数组,代码更加简洁。
多选下拉框的常见问题与优化建议
原生多选下拉框虽然实现简单,但体验上有几个明显短板。第一,用户必须知道按住Ctrl才能多选,普通用户不一定熟悉这个操作,容易误操作导致之前的选择被取消。第二,选项较多时找目标项很费劲,原生组件没有搜索功能。第三,样式定制能力弱,在不同浏览器和操作系统下外观差异较大。
针对这些问题,生产环境常见的做法是引入成熟的前端组件库,比如Bootstrap框架配合bootstrap-select插件,或者使用 select2、chosen 这类专门的多选组件。它们提供搜索过滤、标签化展示已选项、全选清空按钮等增强功能,用户体验明显更好。以select2为例,初始化只需要几行代码:
// 引入select2的css和js后执行
$(document).ready(function() {
$('#fruits').select2({
placeholder: '请选择水果,支持搜索',
allowClear: true, // 显示清空按钮
width: '300px'
});
});还有一个细节值得注意:多选下拉框属于表单控件,如果该项是必填的,记得加上required属性配合校验,浏览器在用户一个都没选时会自动拦截提交并给出提示。移动端项目则要谨慎使用multiple,因为手机屏幕小,长列表多选操作不便,通常改用复选框列表或者弹窗多选的交互形式更合适。
后端接收多选数据的处理
前端工作完成后,还要确保后端能正确接收。以PHP为例,表单以POST方式提交时,只要name写成fruits[],就可以通过$_POST['fruits']直接拿到数组。如果name没加中括号,$_POST['fruits']只会是最后一个选中项的字符串,数据会静默丢失,排查起来相当麻烦。
<?php
// 前端name为 fruits[] 时
if (isset($_POST['fruits']) && is_array($_POST['fruits'])) {
$selected = $_POST['fruits'];
foreach ($selected as $fruit) {
echo htmlspecialchars($fruit) . '<br/>';
}
} else {
echo '没有选择任何水果';
}
?>Python的Flask框架中则用request.form.getlist('fruits')获取多值,Node.js的Express中通过req.body.fruits拿到的本身就是数组(前提是使用了合适的body解析中间件)。不同语言的处理方式略有差别,但核心原则一致:确保前端字段名能表达数组语义,后端按数组解析。
总结
HTML实现下拉框多选并不复杂,核心就是给select标签添加multiple属性,再根据需要配合size属性控制可见行数、给option添加selected实现默认选中。前端取值可以用selectedOptions或遍历options,后端接收时记得把name写成数组形式。如果对用户体验要求较高,建议引入select2等第三方组件获得搜索、标签展示等增强能力。掌握这些要点,就能根据实际项目场景灵活选择方案,快速实现功能完善的下拉多选效果。
HTML下拉框多选multiple属性select多选框修改时间:2026-09-07 08:20:39