textarea默认不支持自动撑高,必须用JS动态设置style.height:先设height='auto'重置,再读scrollHeight赋值;需配合min/max-height、overflow-y: auto及padding/border等样式一致控制,iOS用requestAnimationFrame修复延迟,IE11需换行符归一化。

textarea 不会自动撑高,不是你写错了,是它本来就不支持——浏览器默认按 rows 固定行数渲染,内容一多就出滚动条。想让它“随文字长高”,必须靠 JS 动态设 style.height,且关键步骤不能跳。
为什么直接设 scrollHeight 会越撑越高?
常见错误是只写 textarea.style.height = textarea.scrollHeight + 'px',没重置高度。一旦上次设过固定值,scrollHeight 就会包含旧高度的干扰,导致每次输入都多加几像素。
- 每次
input触发前,先执行textarea.style.height = 'auto' - 再读
scrollHeight,此时才反映真实内容所需高度 - 最后赋值:
textarea.style.height = textarea.scrollHeight + 'px' - 如果用
resize: none禁拖拽,记得在 CSS 里加,否则右下角手柄会破坏布局
移动端 iOS Safari 高度更新延迟怎么破?
iOS Safari 对 scrollHeight 的计算有异步延迟,尤其粘贴大段文本后,高度常卡在旧值。这不是 bug,是渲染管线机制导致的。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 用
requestAnimationFrame包一层比setTimeout(..., 0)更稳,尤其在 120Hz 屏上 - 不要依赖
offsetHeight或clientHeight—— 它们不包含溢出区域,永远撑不开 - 若必须兼容 IE11,先做换行符归一化:
textarea.value = textarea.value.replace(/\r\n/g, '\n') - IE11 下
scrollHeight在空行末尾会偏小,可补 2px(仅限该环境)
min-height 和 max-height 怎么配?
光靠 JS 撑高不行,得用 CSS 扛住基础边界。否则空 textarea 会塌成一条线,或者用户狂输时无限制拉伸。
- CSS 必须设
min-height(如80px),保证初始有可点击区域 -
max-height控制上限(如300px),超出后才出现滚动条 -
overflow-y: auto要显式写,否则超限时内容被裁切 - 别用
height: 100%或flex: 1直接套在textarea上——它会和 JS 高度冲突
最易被忽略的是:所有样式(padding、border、line-height)必须和 JS 计算时完全一致,否则 scrollHeight 就不准。Chrome 开发者工具里关掉“user agent stylesheet”再看 computed 值,才能确认真实渲染高度。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










