You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需JavaScript,能否让HTML TextArea高度自适应内容?

纯CSS实现textarea自适应高度?

我有一段textarea代码:

<textarea contentEditable="true">  
testing autoheight lkjul;khjfds
kjhkjghg

fgdgdsf
</textarea>

想要让它的高度自动适配文本内容,试了CSS的height:auto;但没效果。目前已经用JavaScript实现了这个功能:

const tx = document.getElementsByTagName("textarea");

for (let i = 0; i < tx.length; i++) {
  if (tx[i].value != ''){ 
    tx[i].setAttribute("style", "height:" + (tx[i].scrollHeight) + "px;overflow-y:hidden;");
  }
}

但我觉得不需要JS也能做到,查了类似问题都是JS方案,想问有没有非JavaScript的解决方法?


答案:纯CSS可以实现,但要换用contenteditable的div模拟textarea

原生<textarea>因为表单控件的特殊属性,纯CSS确实没办法让它高度随内容自适应——height:auto对它不起作用,浏览器默认会给它固定高度,内容超出就显示滚动条。不过你可以用带contenteditable="true"的<div>来模拟textarea的效果,同时实现纯CSS下的高度自适应:

实现代码

<div 
  class="fake-textarea" 
  contenteditable="true"
  role="textbox"
  aria-multiline="true"
>
  testing autoheight lkjul;khjfds
  kjhkjghg

  fgdgfdsf
</div>
.fake-textarea {
  /* 还原textarea的默认样式 */
  padding: 6px 8px;
  border: 1px solid #ddd;
  border-radius: 4px;
  min-height: 60px; /* 设置最小高度,避免内容太少时过于窄小 */
  font-family: system-ui, monospace; /* 匹配textarea默认字体 */
  white-space: pre-wrap; /* 保留换行和空格,和textarea行为一致 */
  resize: vertical; /* 可选:允许用户手动拖动调整高度 */
}

/* 聚焦样式,模拟原生textarea的聚焦状态 */
.fake-textarea:focus {
  outline: none;
  border-color: #2196F3;
  box-shadow: 0 0 0 2px rgba(33, 150, 243, 0.2);
}

为什么原生textarea不行?

浏览器对<textarea>的布局有特殊规则:它的高度默认由rows属性或CSSheight控制,本质是一个可滚动的容器,height:auto无法触发它根据内容自动撑开高度——这是浏览器的内置行为,纯CSS无法修改。

额外说明

  • 如果需要把这个模拟的文本框数据提交到表单,得加个隐藏的<input>,在用户输入时把div的内容同步到input里(这一步需要一点点JS,但核心的高度自适应是纯CSS完成的)
  • 加上role="textbox"和aria-multiline="true"是为了无障碍访问,让屏幕阅读器能正确识别这是一个多行文本输入控件

内容的提问来源于stack exchange,提问作者Matt Parker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:24:27