有没有办法让textarea伸展以适应其内容而不使用PHP或JavaScript?

sig*_*nce 65 html css

我正在填写textarea内容供用户编辑.

是否有可能使其伸展以适应CSS的内容(如overflow:showdiv)?

Mar*_*one 124

只有一行

<textarea name="text" oninput='this.style.height = "";this.style.height = this.scrollHeight + "px"'></textarea>
Run Code Online (Sandbox Code Playgroud)

  • 这很棒.我只想补充一点,将`this.scrollHeight +"px"`改为`this.scrollHeight + 3 +"px"`使得textarea足够大,让它不显示滚动条. (20认同)
  • 这怎么只有两票.这是令人难以置信的马丁.我只花了30分钟试图解决这个问题.做得好. (7认同)
  • 我知道这是一个老问题,但是我在编辑页面上有一个textarea,并且在页面加载时已经有一个值,那么如何使其扩展以适合内容呢? (4认同)
  • 问题:当用户写入足够向下滚动时,每次使用 Enter 添加新行时,它都会重置滚动位置。 (3认同)
  • @ArootinAghazaryan - 您可能已经找到了解决方案,但对于其他任何人:只需使用调整大小代码创建一个函数,而不是将其内嵌在 HTML 中。然后您可以在页面加载时调用相同的函数。 (2认同)
  • 添加`style="overflow:hidden;"`可以使滚动条不可见,而不是手动在高度上加一些小px。 (2认同)

Rik*_*ood 37

并不是的.这通常使用javascript完成.

在这里有一个很好的讨论如何做到这一点...

使用Prototype自动调整textarea


Tim*_*Tim 23

或者,您可以使用一个contenteditable元素,这将适合内部的文本。

<div contenteditable>Try typing and returning.</div>
Run Code Online (Sandbox Code Playgroud)

请注意,如果不使用一些 JavaScript,则无法以表单形式发送该值。还contenteditable可能生成 HTML 内容并允许样式化,因此可能需要在表单提交时将其过滤掉。

  • 这对我来说是最好的解决方案 (2认同)

Mar*_*n93 13

与问题并非 100% 相关,因为这仅适用于使用Angular Material Design时的Angular

有一个与 Angular 相关的 npm 包@angular/cdk(如果使用 Angular Material Design)。此包中包含一个属性,可以与textarea名为cdkTextareaAutosize 的属性关联。这会自动将 设置textarea为 1 行并textarea相应地拉伸 来适合内容。如果您正在使用这个库,类似的东西应该可以工作。

<textarea 
  maxLength="200"
  cdkTextareaAutosize
  type="text">
</textarea>
Run Code Online (Sandbox Code Playgroud)


Nic*_*icB 7

这是一个非常简单的解决方案,但对我有用:

<!--TEXT-AREA-->
<textarea id="textBox1" name="content" TextMode="MultiLine" onkeyup="setHeight('textBox1');" onkeydown="setHeight('textBox1');">Hello World</textarea>

<!--JAVASCRIPT-->
<script type="text/javascript">
function setHeight(fieldId){
    document.getElementById(fieldId).style.height = document.getElementById(fieldId).scrollHeight+'px';
}
setHeight('textBox1');
</script>
Run Code Online (Sandbox Code Playgroud)

  • 框的高度随着*每次*键击而增加,而不仅仅是新行。即使退格和删除也会导致高度增加。修复,你会得到upvote回来。 (3认同)

Chr*_*row 7

这是一个与jQuery一起使用的函数(仅用于高度,而不是宽度):

function setHeight(jq_in){
    jq_in.each(function(index, elem){
        // This line will work with pure Javascript (taken from NicB's answer):
        elem.style.height = elem.scrollHeight+'px'; 
    });
}
setHeight($('<put selector here>'));
Run Code Online (Sandbox Code Playgroud)

注意: 操作系统要求提供不使用Javascript的解决方案,但这应该对遇到此问题的人有所帮助.


FTW*_*FTW 6

这里的答案很好,但缺少一段代码,我必须添加这些代码以避免第一次键入时不受欢迎的收缩:

var $textareas = $('textarea');
$textareas.each(function() { // to avoid the shrinking
    this.style.minHeight = this.offsetHeight + 'px';
});

$textareas.on('input', function() {
    this.style.height = '';
    this.style.height = this.scrollHeight + 'px';
});
Run Code Online (Sandbox Code Playgroud)


Kru*_*tel 5

动态 textarea 控件的另一个简单解决方案。

<!--JAVASCRIPT-->
<script type="text/javascript">
$('textarea').on('input', function () {
            this.style.height = "";
            this.style.height = this.scrollHeight + "px";
 });
</script>
Run Code Online (Sandbox Code Playgroud)