textarea需用javascript实现自动撑高:监听input事件,先设height:auto再赋scrollheight值,并处理空内容、最小高度及移动端延迟。

textarea 默认不会随内容自动撑高,必须用 JavaScript 主动干预——核心是每次输入后,把 scrollHeight 的值赋给 style.height,同时配合重置和边界处理。
监听 input 事件,不是 keyup
input 事件能捕获所有内容变更:键盘输入、粘贴、剪切、拖入、甚至语音输入。keyup 会漏掉粘贴等操作,不可靠。
- 绑定
textarea.addEventListener('input', handler) - 避免用 onpropertychange(IE 旧语法)或 change(只在失焦时触发)
每次读取前先设 height: auto
如果不先清除已有高度,scrollHeight 会被旧的内联 height 值干扰,导致计算偏大、撑得过高或缩不回去。
- 在 handler 开头写:
el.style.height = 'auto' - 再读
el.scrollHeight,最后赋值:el.style.height = el.scrollHeight + 'px'
处理空内容和最小高度
用户删光文字后,scrollHeight 不会回到单行高度(比如可能还是 60px),需手动兜底;同时初始状态太矮影响体验,应设 CSS min-height。
- CSS 中写:
min-height: 40px; max-height: 200px; overflow: hidden; - JS 中判断:
if (!el.value.trim()) el.style.height = '40px';
兼容移动端和字体加载延迟
iOS Safari 对 scrollHeight 更新有微小延迟;字体未加载完成时测量也不准。加一次异步调度可稳定读取。
- 在读取 scrollHeight 前包一层:
setTimeout(() => { /* 读取并设置 */ }, 0) - 若页面用了自定义字体,可监听
document.fonts.load()后再初始化高度
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











