我想让textarea的高度等于其中文本的高度(并删除滚动条)
HTML
<textarea id="note">SOME TEXT</textarea>
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);
}
JsFiddle:http://jsfiddle.net/Tw9Rj/
答案 0 :(得分:259)
这使用纯JavaScript代码。
function auto_grow(element) {
element.style.height = "5px";
element.style.height = (element.scrollHeight)+"px";
}
&#13;
textarea {
resize: none;
overflow: hidden;
min-height: 50px;
max-height: 100px;
}
&#13;
<textarea onkeyup="auto_grow(this)"></textarea>
&#13;
答案 1 :(得分:113)
对于我们这些使用Angular完成此操作的人,我使用了一个指令
<强> HTML:强>
<textarea elastic ng-model="someProperty"></textarea>
<强> 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);
}
};
}
]);
$timeout
将在DOM加载后触发的事件排队,这是获得正确的scrollHeight所必需的(否则您将获得undefined
)
答案 2 :(得分:34)
可以使用JS实现。以下是使用solution的“一行”elastic.js:
$('#note').elastic();
更新:似乎不再有elastic.js,但如果您正在寻找外部库,我可以推荐autosize.js by Jack Moore。这是工作示例:
autosize(document.getElementById("note"));
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);
}
<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>
也检查这个类似的主题:
Autosizing textarea using Prototype
答案 3 :(得分:14)
我使用了jQuery AutoSize。当我尝试使用Elastic时,它经常给我伪造的高度(非常高的textarea's)。 jQuery AutoSize运行良好,并没有遇到这个问题。
答案 4 :(得分:8)
我看到这已经得到了解答,但我相信我有一个简单的jQuery解决方案(甚至不需要jQuery;我只是喜欢使用它):
我建议计算textarea
文字中的换行符,并相应地设置rows
的{{1}}属性。
textarea
答案 5 :(得分:5)
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%;
}
或javascript
var s_height = document.getElementById('note').scrollHeight;
document.getElementById('note').setAttribute('style','height:'+s_height+'px');
答案 6 :(得分:2)
var minRows = 5;
var maxRows = 26;
function ResizeTextarea(id) {
var t = document.getElementById(id);
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;
}
}
}
答案 7 :(得分:0)
<强> HTML 强>
<textarea id="wmd-input" name="md-content"></textarea>
<强> JS 强>
var textarea = $('#wmd-input'),
top = textarea.scrollTop(),
height = textarea.height();
if(top > 0){
textarea.css("height",top + height)
}
<强> CSS 强>
#wmd-input{
width: 100%;
overflow: hidden;
padding: 10px;
}