textarea需监听input事件,重置height为auto后取scrollHeight动态设高,并注意表格中vertical-align、IE11偏差及多实例绑定时机。

textarea 默认不自动撑高,必须手动监听输入
HTML 原生 textarea 不会随内容增长自动调整高度,它只响应 rows 和 CSS 的 height,设为固定值后就会出现滚动条。要实现“随输入撑高”,本质是监听输入事件、计算内容高度、动态设置 textarea 的 height。
用 scrollHeight 获取真实内容高度最可靠
scrollHeight 返回元素内容的总高度(含溢出),不受 overflow 或 height 限制,比 clientHeight 或 offsetHeight 更适合判断文本撑开需求。注意:必须确保 textarea 已渲染且样式生效(比如不能在 display: none 容器里调用)。
实操建议:
- 监听
input事件(覆盖输入、粘贴、删除、回车等所有修改) - 每次触发时先重置
height为auto,再读取scrollHeight,最后赋值给style.height - 加个最小高度(如
40px)避免空内容时过矮 - 可选:限制最大高度(如
200px),超出后显示滚动条
const $ta = document.querySelector('textarea');
$ta.addEventListener('input', () => {
$ta.style.height = 'auto';
$ta.style.height = Math.min($ta.scrollHeight, 200) + 'px';
});放在表格单元格(<td>)里要注意垂直对齐<p>表格默认 <code>vertical-align: middle,而动态撑高的 textarea 高度变化时,若父 <td> 没有明确设置 <code>vertical-align: top,会导致上下跳动或对齐错位。
立即学习“前端免费学习笔记(深入)”;
实现 Markdown↔ HTML 互转,支持导出 PDF,用于用户请求的文档格式转换。
实操建议:
- 给
<td> 加 <code>style="vertical-align: top;"或统一 CSS 类 - 避免给
textarea设margin或padding外部干扰(可用box-sizing: border-box稳定内边距) - 如果表格用了
table-layout: fixed,需确保列宽足够,否则换行可能被截断 - 对 IE11 做 UA 检测,或用
document.documentMode判断 - 在赋值前减去一个像素偏移(如
Math.max(1, $ta.scrollHeight - 1)) - 更稳妥的做法是加防抖(
setTimeout延迟 50ms 再更新),避免高频输入导致 layout thrashing
IE11 及更老浏览器需要额外处理 scrollHeight 偏差
IE11 下 scrollHeight 在某些字体/行高组合下会多算 1–2px,导致反复触发 resize、高度抖动。这不是 bug,而是其盒模型计算差异。
解决方法:
真正容易被忽略的是:表格中多个 textarea 共享同一套逻辑时,别直接用 querySelector 取第一个——得遍历所有目标元素并分别绑定;还有,如果表格支持排序或 DOM 重绘(如 Vue/React 渲染),记得在节点挂载后才初始化高度逻辑,否则 scrollHeight 读出来是 0。


















