表单元素默认 box-sizing 不统一是根源,input/textarea 默认 content-box,select 在旧版 Chrome/Safari 中盒模型行为不一致;height 解析差异导致 Chrome 压缩内容、Firefox 保留行高;appearance: none 后需手动重置 padding/border/font;IE11 需单独处理且不支持 appearance: none;file 类型必须隐藏原生 input 并用标签模拟。

表单元素默认 box-sizing 不统一是根源
不是你写错了,是浏览器根本没按同一套规则渲染 input、select 和 textarea。绝大多数现代浏览器对 input 和 textarea 默认用 box-sizing: content-box,但 select 在旧版 Chrome/Safari 中可能悄悄用别的逻辑——尤其加了 padding 或 border 后,总宽度算出来就和预期对不上。这不是 bug,是“替换元素”(replaced element)的内部实现差异,规范压根没强制它必须怎么算。
height 行为不一致:Chrome 压缩,Firefox 保留行高
给 input 设 height: 40px,Chrome 会把 padding + border + 内容全塞进这 40px 里(line-height 可能被忽略),而 Firefox 更倾向保留默认行高,结果文字贴顶、被截断,或垂直居中偏上。根本原因是:规范没规定 height 到底该作用于“内容区”还是“含边框内边距的整体盒子”,各引擎自由发挥。
- 优先用
min-height替代height,再靠padding控制视觉高度 -
input和textarea可显式设line-height(需与min-height匹配),但select忽略它 - Firefox 中文字贴顶?试
vertical-align: middle,或包一层display: flex容器修正对齐
appearance: none 后尺寸失控,是因为没人帮你重置
用了 appearance: none 去掉原生下拉箭头或圆角,浏览器可不会自动给你补 padding、border 或继承 font。Safari 的 select 默认左右 12px 内边距,Chrome 是 8px,Firefox 可能更小——直接导致 width: 100% 并排时错位。
- 只要用了
appearance: none,就必须手动写:input, select, textarea { padding: 0.5em 1em; border: 1px solid #ccc; font: inherit; margin: 0; } - 别用
all: unset,它会干掉direction和unicode-bidi,RTL 文本直接乱序 -
select还要加background-image: none,否则 Safari 可能残留原生箭头干扰尺寸
兼容旧浏览器(如 IE11)要隔离处理
IE11 对 select 的盒模型处理更混乱,有时连 box-sizing: border-box 都不完全生效;而且它不支持 appearance: none,伪元素清除叉叉/眼睛也得用 ::-ms-clear、::-ms-reveal 这类私有写法。
立即学习“前端免费学习笔记(深入)”;
- 用 CSS 特性检测(如
@supports (appearance: none))或 UA 判断做样式隔离 - 对 IE11 单独加
select { height: 36px; line-height: 36px; }微调,避免莫名多出 2px - file 类型 input 的样式重写必须用“隐藏原生 + 外层标签模拟”,这是跨浏览器唯一可靠方案
input、select、textarea 都得亲手量、亲手调、亲手封住所有默认行为的后门。










