max-height 和 height 对原生 下拉菜单无效,因其弹出层由系统/浏览器底层绘制、脱离文档流;唯一跨浏览器原生方案是使用 size 属性(如 size="5"),但会改变交互模式;如需点击展开+限高,必须自定义下拉组件。

max-height 对原生 的下拉弹出菜单完全无效——你设了也没用,浏览器直接忽略。
为什么 max-height 和 height 都不生效
原生 的下拉菜单是操作系统或浏览器底层绘制的独立 UI 组件,脱离文档流,CSS 无法穿透控制。你在 上写的 max-height: 200px 或 height: 40px,只会影响顶部可点击区域的视觉高度,弹出来的列表该多高还是多高(通常 8–12 行),Lighthouse 会直接报“样式未生效”。line-height、padding、transform: scale() 等也一样:缩放按钮区,但弹出层按原始尺寸展开。
唯一跨浏览器有效的原生方案:用 size 属性
size 是 HTML 原生属性,它强制浏览器以“多行控件”模式渲染 ,并据此计算弹出菜单的初始高度和滚动行为。这是目前唯一无需 JS、全平台一致支持的限高方式。
-
size="5"→ 展开后最多显示 5 行,超出自动加滚动条 -
size="1"→ 等效于默认下拉(隐藏列表,点击才展开) - 注意:
size会改变渲染模式:失去“点击展开”交互,变成类似的固定展开态;移动端(尤其是 iOS Safari)可能无视size,强制走全屏选择器
要保留点击展开 + 限高?只能自定义下拉
放弃 真正难的不是写代码,而是意识到:原生 ,改用 + 模拟。此时所有 CSS 才真正可控:
position: relative,否则 定位错乱 设 max-height: 200px + overflow-y: auto,这才是真正生效的限高Escape 键关闭、ArrowDown/Up 导航,否则可访问性不达标aria-expanded 和 aria-controls,否则屏幕阅读器无法识别状态touchstart 并 preventDefault(),否则 iOS Safari 会闪退 的“下拉高度”根本不在你的控制范围内——要么接受它的限制(用 size),要么彻底换掉它。任何试图用 CSS 强行干预弹出层的行为,最后都会在某个浏览器或某台手机上露出破绽。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











