JavaScript实现Textarea高度随内容自适应增长与收缩

作者:白露时间:2026-10-27 01:43:40浏览:602

本文介绍两种JavaScript实现textarea高度随内容自适应增长与收缩的方案。方案一利用scrollHeight判断,但在部分浏览器删除内容时无法自动收缩;方案二通过动态调整rows属性实现全浏览器兼容,但存在视觉跳动。文章还提及了其他相关开源方案及局限性。

JavaScript实现Textarea高度随内容自适应增长与收缩

以下是实现代码:


方案一:基于scrollHeight的自适应

第一种方案:


 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <TITLE>枫芸志 &raquo; 文本框textarea高度自适应增长/伸缩</TITLE> <style> textarea { height:100px; width: 300px; } </style> </HEAD> <BODY> <!--以下代码中onpropertychange:IE支持;oninput:FireFox支持;为了兼容IE和FF,所以加上了这个两个;--> <textarea id="txtContent" rows="1" onpropertychange="ResizeTextarea()" oninput="ResizeTextarea()" onkeyup="ResizeTextarea()">晴枫制作 http://jb51.net<&#47textarea>  </BODY> </HTML> 

[Ctrl+A 全选 注:引入外部Js需再刷新一下页面才能执行]


第一种方案在各浏览器中,文本框随内容自适应增长都没有问题;但在删除内容时收缩方面表现有所差异,IE、Opera表现正常,Firefox、Chrome、Safari不会收缩。原因是文本框内容高度小于文本框高度时scrollHeight值等于文本框高度,而不是文本框内容高度。


方案二:基于rows属性调整

第二种方案:


代码如下:

 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>枫芸志 &raquo; 文本框textarea高度自适应增长/伸缩</TITLE>
</HEAD>
<BODY>
<textarea id="txtContent" rows="5" cols="50" onkeyup="ResizeTextarea()" style="overflow-y:hidden;">Textarea高度随内容自适应地增长,无滚动条
晴枫制作
http://jb51.net</textarea>
<script type="text/javascript">
// 最小高度
var minRows = 5;
// 最大高度,超过则出现滚动条
var maxRows = 12;
function ResizeTextarea(){
var t = document.getElementById('txtContent');
if (t.scrollTop == 0) t.scrollTop=1;
while (t.scrollTop == 0){
if (t.rows > minRows)
t.rows--;
else
break;
t.scrollTop = 1;
if (t.rows < maxRows)
t.style.overflowY = "hidden";
if (t.scrollTop > 0){
t.rows++;
break;
} 
} 
while(t.scrollTop > 0){
if (t.rows < maxRows){
t.rows++;
if (t.scrollTop == 0) t.scrollTop=1;
} 
else{
t.style.overflowY = "auto";
break;
} 
} 
} 
</script>
</BODY>
</HTML>

第二种方案在各浏览器中表现相同,皆可使文本框随内容自适应增长和收缩。但有个缺憾是在文本框高度增长的时候,文本框显示会有一个跳动。


另以上两个方案对于通过文本框右键菜单选择剪切、粘贴、删除等命令操作文本内容的情形都无效。可以说暂未找到完美的解决方案,留待以后再来研究。哪位同学如果有完美的方案的话敬请赐教!




其他参考方案

其他方案:

  1. A different approach to elastic textareas 第二种方案即参考此文后实现
  2. Build an Elastic Textarea with Ext JS
  3. Smart TextArea: scrollHeight in IE, Firefox, Opera and Safari

原文链接:http://witmax.cn/javascript-textarea-auto-grow.html

作者最新文章