size属性控制select可见行数但本质切换控件模式:size="1"为传统下拉,size≥2为固定高度列表;iOS Safari强制忽略size>1,需用自定义组件替代。

size 属性确实控制 <select></select> 的可见选项行数,但它不是“设下拉高度”那么简单——它直接切换控件的呈现模式和交互逻辑。
size="1" 和 size>1 的行为本质不同
设置 size="1"(或不写)时是传统下拉(click 展开),而 size="2" 及以上会强制渲染为固定高度的滚动列表,不再有“下拉”动作。这不是样式微调,而是语义和 DOM 行为的切换:
-
size="1":触发click事件后才展开菜单;焦点在控件上时按键盘方向键可操作,但不可见选项不参与 tab 顺序 -
size="4":所有选项默认可见(或带滚动条),整个区域可 tab 进入,键盘上下键直接高亮切换,屏幕阅读器识别为listbox - 即使没加
multiple,size>1的<select></select>仍为单选,提交值行为与size="1"完全一致
移动端 Safari 会静默忽略 size>1
iOS 上的 Safari(包括微信内置浏览器、QQ 浏览器等 WebKit 内核环境)对 size 属性有硬性限制:只要 size 值大于 1,就无视该属性,强制回退到原生单行下拉控件。这不是 bug,是 WebKit 的设计决策,无法用 CSS 或 JS 绕过。
这意味着:
- 你在桌面 Chrome 里调试出完美的
<select size="5"></select>,到 iPhone 上打开就是个普通下拉框 - 如果业务强依赖多行可见(比如地址省市区三级联动预览),得用
<div> + <code><ul></ul>自实现,或引入react-select/choices.js等库 - Android WebView 行为不统一:Chromium 80+ 基本支持,但旧版可能直接渲染失败或显示异常
- 在
DOMContentLoaded之前操作 DOM 元素,可能因节点未挂载导致赋值无效果 - Chrome 和 Safari 对
size="2"和size="3"的渲染支持不稳定,尤其在配合font-size或line-height缩放时容易出现截断或空白行 - 若同时设置了
multiple,size才真正决定可视区域高度;否则仅size="1"和size>1两档逻辑分界,中间值没有渐进变化
JS 动态修改 size 要注意时机和兼容性
通过 JS 设置 selectElement.size = 3 是合法的,但某些场景下会失效:
立即学习“前端免费学习笔记(深入)”;
size="4",而是你写了之后,不知道它在哪台设备上悄悄失效了。特别是当测试只跑在桌面 Chrome,而用户主力在 iOS 微信里访问时。



















