field-sizing 不是标准 CSS 属性,未被任何主流浏览器支持,也未进入 CSS 规范正式阶段;它属误传或概念混淆,实际应使用 textarea 配合 JS 动态调整 height 实现自适应。

field-sizing 目前不是标准 CSS 属性,也未被任何主流浏览器支持 —— 你在文档或实验中看到的 field-sizing 很可能是误传、草案旧稿,或是与 resize、contain-intrinsic-size 等概念混淆了。
为什么找不到 field-sizing 的 MDN 文档或浏览器支持?
该属性从未进入 CSS UI 或 CSS Sizing 规范的正式候选推荐(CR)阶段。Chrome、Firefox、Safari 的最新版本(截至 2024 年中)均不识别 field-sizing,使用它不会产生任何效果,控制台也不会报错,只会静默忽略。
- 可通过
getComputedStyle(input).fieldSizing验证:返回""(空字符串),而非"content"或类似值 - CanIUse、MDN、CSSWG GitHub 仓库中均无该属性的跟踪记录
- 部分文章可能把
textarea的rows+resize: vertical或 WebKit 的私有-webkit-appearance: textarea误标为field-sizing
真正可用的自适应高度输入框实现方式
对 ,无法原生自适应高度(它始终是单行);但对 ,有成熟、稳定、跨浏览器的方案:
-
用
min-height+height: auto+overflow: hidden+resize: none搭配 JS 监听input事件动态调整高度 -
更轻量:利用
scrollHeight和clientHeight差值触发重设,避免反复 layout(例如:监听后立即el.style.height = "auto"; el.style.height = el.scrollHeight + "px";) -
CSS-only 折中方案:设置
min-height和max-height,启用resize: vertical,让用户手动拖拽(不自动,但保留控制权)
示例关键代码:
textarea {
min-height: 24px;
max-height: 120px;
height: auto;
resize: none;
overflow: hidden;
line-height: 1.4;
padding: 6px 8px;
}
JS 部分只需一行核心逻辑(放在 input 事件里):
el.style.height = "auto"; el.style.height = Math.min(el.scrollHeight, 120) + "px";
容易踩的坑:伪自适应 vs 真响应
很多“自动高度”方案在以下场景会失效或抖动:
- 字体加载完成前触发计算 →
scrollHeight偏小,需监听fontload或延迟初始化 - 设置了
box-sizing: border-box但没把padding和border从scrollHeight中剔除 → 实际应:el.scrollHeight - parseInt(getComputedStyle(el).paddingTop) - parseInt(getComputedStyle(el).paddingBottom) - 在 React/Vue 中直接操作
style.height,未配合useLayoutEffect或onUpdated→ 输入瞬间出现跳动 - 移动端 iOS Safari 对
textarea的scrollHeight计算不稳定,建议加white-space: pre-wrap; word-break: break-word;统一换行行为
真正需要“随内容撑开”的控件,textarea 是唯一合理选择;而所谓 field-sizing 属于不存在的幻影属性,别在生产环境尝试 polyfill 或条件判断它 —— 浪费调试时间,还掩盖了真实需求。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











