Textarea自动高度

Moh*_*eri 146 html javascript css

我想让textarea的高度等于其中文本的高度(并删除滚动条)

HTML

<textarea id="note">SOME TEXT</textarea>
Run Code Online (Sandbox Code Playgroud)

CSS

textarea#note {
    width:100%;
    direction:rtl;
    display:block;
    max-width:100%;
    line-height:1.5;
    padding:15px 15px 30px;
    border-radius:3px;
    border:1px solid #F7E98D;
    font:13px Tahoma, cursive;
    transition:box-shadow 0.5s ease;
    box-shadow:0 4px 6px rgba(0,0,0,0.1);
    font-smoothing:subpixel-antialiased;
    background:linear-gradient(#F9EFAF, #F7E98D);
    background:-o-linear-gradient(#F9EFAF, #F7E98D);
    background:-ms-linear-gradient(#F9EFAF, #F7E98D);
    background:-moz-linear-gradient(#F9EFAF, #F7E98D);
    background:-webkit-linear-gradient(#F9EFAF, #F7E98D);
}
Run Code Online (Sandbox Code Playgroud)

JsFiddle:http://jsfiddle.net/Tw9Rj/

Mou*_*wi7 300

这使用纯JavaScript代码.

function auto_grow(element) {
    element.style.height = "5px";
    element.style.height = (element.scrollHeight)+"px";
}
Run Code Online (Sandbox Code Playgroud)
textarea {
    resize: none;
    overflow: hidden;
    min-height: 50px;
    max-height: 100px;
}
Run Code Online (Sandbox Code Playgroud)
<textarea oninput="auto_grow(this)"></textarea>
Run Code Online (Sandbox Code Playgroud)

  • 惊人的香草js解决方案! (13认同)
  • 我可以建议使用oninput吗?和height = auto而不是5px? (8认同)
  • 如果添加一些额外的高度,它将在调整元素大小之前停止文本滚动一瞬间.`(element.scrollHeight + 20)+ "PX";` (5认同)
  • 工作得很好,但最初"跳".添加:if(element.scrollHeight> 80){element.style.height = 5 +"px"; element.style.height =(element.scrollHeight + 10)+"px"; 帮助.(最小高度:80px) (5认同)
  • 简单的内联JS解决方案`<textarea class ="form-control"onkeyup ="$(this).height(5); $(this).height($(this).prop('scrollHeight'))"> </ textarea>的` (3认同)
  • FWIW 我在一个控件中尝试了 height=auto ,发现 textarea 不会缩小到 1 行(在 Chrome 中) - 即使只有一行(或没有)文本,它也会缩小到 2 行。height=5px 使 textarea 在我的实现中正确缩小。 (2认同)
  • @StefanMohr要解决此问题,请将textarea的`rows`属性设置为1. (2认同)
  • 使用鼠标或右键单击菜单修改(选择,剪切或粘贴)文本时不起作用.使用`input`事件而不是`keyup`事件. (2认同)
  • 临时设置parent的minHeight,防止页面跳转:```element.parentNode.style.minHeight = element.parentNode.clientHeight + "px"; element.style.height = "5px"; element.style.height = (element.scrollHeight)+"px"; element.parentNode.style.minHeight = 0;``` (2认同)

blo*_*oop 114

对于我们这些使用Angular完成此操作的人,我使用了一个指令

HTML:

<textarea elastic ng-model="someProperty"></textarea>
Run Code Online (Sandbox Code Playgroud)

JS:

.directive('elastic', [
    '$timeout',
    function($timeout) {
        return {
            restrict: 'A',
            link: function($scope, element) {
                $scope.initialHeight = $scope.initialHeight || element[0].style.height;
                var resize = function() {
                    element[0].style.height = $scope.initialHeight;
                    element[0].style.height = "" + element[0].scrollHeight + "px";
                };
                element.on("input change", resize);
                $timeout(resize, 0);
            }
        };
    }
]);
Run Code Online (Sandbox Code Playgroud)

$timeout队列一个在DOM加载后将触发的事件,这是获得正确的scrollHeight所必需的(否则你会得到undefined)


Mik*_*ike 43

它可以使用JS实现.这是使用elastic.js的"单行" 解决方案:

$('#note').elastic();
Run Code Online (Sandbox Code Playgroud)

更新:似乎不再有elastic.js,但如果您正在寻找外部库,我可以推荐Jack Moore的 autosize.js .这是工作示例:

autosize(document.getElementById("note"));
Run Code Online (Sandbox Code Playgroud)
textarea#note {
	width:100%;
	box-sizing:border-box;
	direction:rtl;
	display:block;
	max-width:100%;
	line-height:1.5;
	padding:15px 15px 30px;
	border-radius:3px;
	border:1px solid #F7E98D;
	font:13px Tahoma, cursive;
	transition:box-shadow 0.5s ease;
	box-shadow:0 4px 6px rgba(0,0,0,0.1);
	font-smoothing:subpixel-antialiased;
	background:linear-gradient(#F9EFAF, #F7E98D);
	background:-o-linear-gradient(#F9EFAF, #F7E98D);
	background:-ms-linear-gradient(#F9EFAF, #F7E98D);
	background:-moz-linear-gradient(#F9EFAF, #F7E98D);
	background:-webkit-linear-gradient(#F9EFAF, #F7E98D);
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://rawgit.com/jackmoore/autosize/master/dist/autosize.min.js"></script>
<textarea id="note">Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.</textarea>
Run Code Online (Sandbox Code Playgroud)

也检查这个类似的主题:

使用Prototype自动调整textarea

Textarea根据内容长度调整大小

使用自动调整大小创建textarea

  • 我想用css做. (147认同)
  • 而不是只引用一个库,一个更好的答案就是没有任何外部库的要求.这个答案可能在一段时间内没有帮助过任何人. (5认同)
  • 谢谢你批评我们,但接受它作为答案的决定不是我的,我不介意是否会接受别人的方法.我只是尽我所能并建议了一个现成的解决方案.由于不可能通过CSS实现这一点,所以最终你最终会使用JS,所以为什么不考虑使用已经写过的那个.是的,你可以谷歌,但我为你做了这份工作. (5认同)
  • 弹性js的链接被打破了...... (3认同)

Pet*_*ter 14

我使用了jQuery AutoSize.当我尝试使用Elastic时,它经常给我伪造的高度(非常高的textarea's).jQuery AutoSize运行良好,并没有遇到这个问题.


Dou*_*sar 10

我看到这已经得到了解答,但我相信我有一个简单的jQuery解决方案(jQuery甚至不需要;我只是喜欢使用它):

我建议计算textarea文本中的换行符并相应地设置rows属性textarea.

var text = jQuery('#your_textarea').val(),
    // look for any "\n" occurences
    matches = text.match(/\n/g),
    breaks = matches ? matches.length : 2;

jQuery('#your_textarea').attr('rows',breaks + 2);
Run Code Online (Sandbox Code Playgroud)

  • 除非文本包装不起作用.如果文本换行,则文本行数不等于换行符的数量,因为换行会导致行在单词之间的空白处断开. (49认同)

小智 5

的jsfiddle

textarea#note {
    width:100%;
    direction:rtl;
    display:block;
    max-width:100%;
    line-height:1.5;
    padding:15px 15px 30px;
    border-radius:3px;
    border:1px solid #F7E98D;
    font:13px Tahoma, cursive;
    transition:box-shadow 0.5s ease;
    box-shadow:0 4px 6px rgba(0,0,0,0.1);
    font-smoothing:subpixel-antialiased;
    background:-o-linear-gradient(#F9EFAF, #F7E98D);
    background:-ms-linear-gradient(#F9EFAF, #F7E98D);
    background:-moz-linear-gradient(#F9EFAF, #F7E98D);
    background:-webkit-linear-gradient(#F9EFAF, #F7E98D);
    background:linear-gradient(#F9EFAF, #F7E98D);
    height:100%;
}
html{
    height:100%;
}
body{

   height:100%;    
}
Run Code Online (Sandbox Code Playgroud)

要么 javascript

var s_height = document.getElementById('note').scrollHeight;
document.getElementById('note').setAttribute('style','height:'+s_height+'px');
Run Code Online (Sandbox Code Playgroud)

的jsfiddle