【问题标题】:Textarea to resize based on content length [duplicate]Textarea根据内容长度调整大小[重复]
【发布时间】:2010-11-02 23:16:05
【问题描述】:

我需要一个文本区域,我在框中输入我的文本,它会根据需要增加长度以避免必须处理滚动条,并且在删除文本后它需要缩小! 我不想走 mootools 或 jquery 路线,因为我有一个轻量级的表单。

【问题讨论】:

  • jQuery 也是轻量级的。不要重蹈覆辙……至少,检查一下 jQuery 的解决方案并尝试复制它。
  • 在 X 或 Y 中增长? (两者都没有多大意义)完全受限?
  • 顺便说一句,所以应该对 cme​​ts 使用这些方法之一 :-)
  • 如果你使用 react,我为此创建了一个包:npmjs.com/package/react-fluid-textarea
  • textarea { 显示:表格; }

标签: javascript


【解决方案1】:

确定一个宽度并检查一行可以容纳多少个字符,然后为每个按下的键调用一个看起来像这样的函数:

function changeHeight()
{
var chars_per_row = 100;
var pixles_per_row = 16;
this.style.height = Math.round((this.value.length / chars_per_row) * pixles_per_row) + 'px';
}

没有测试过代码。

【讨论】:

  • 只有等宽字体才能正常工作。此外,textarea 没有“值”属性。
  • 如果字体大小不是 16px,这也会崩溃
  • Pawka - textareas 确实有一个“值”DOM 属性。
  • 当用户在文本区域输入“enter”时这将不起作用
  • 代码未经测试,当然可以改进。是的,textarea 的值是 中的内容。
【解决方案2】:

我认为没有任何方法可以获取 variable-width 字体中的文本宽度,尤其是在 javascript 中。

我能想到的唯一方法是制作一个由 css 设置可变宽度的隐藏元素,将文本放入其 innerHTML,并获取该元素的宽度。所以你也许可以应用这个方法来处理 textarea 自动调整大小的问题。

【讨论】:

    【解决方案3】:

    您可以通过使用 span 和 textarea 来实现这一点。

    每次更改文本时,您都必须使用 textarea 中的文本更新跨度。然后将textarea的css宽高设置为span的clientWidth和clientHeight属性。

    例如:

    .textArea {
        border: #a9a9a9 1px solid;
        overflow: hidden;
        width:  expression( document.getElementById("spnHidden").clientWidth );
        height: expression( document.getElementById("spnHidden").clientHeight );
    }
    

    【讨论】:

    【解决方案4】:

    您可以通过设置1px然后读取scrollHeight属性来检查内容的高度:

    function textAreaAdjust(element) {
      element.style.height = "1px";
      element.style.height = (25+element.scrollHeight)+"px";
    }
    <textarea onkeyup="textAreaAdjust(this)" style="overflow:hidden"></textarea>

    它可以在 Firefox 3、IE 7、Safari、Opera 和 Chrome 下运行。

    【讨论】:

    • Firefox 有一个问题,如果您的用户输入了一个很长的单词(没有空格,大于 textarea),那么“overflow:hidden”会阻止她看到单词的右端。其他浏览器不在乎,因为即使没有空格它们也会换行。您可以改用“overflow-y:hidden”来解决这个问题,但是您的 css 不符合标准。
    • 关于火狐的问题,可能很快就会解决:stackoverflow.com/questions/47817/…
    • 如果您的 textarea 太高并在页面上产生滚动并且您碰巧让您的页面向下滚动,这将在您的高度时将滚动位置重置为顶部= 1px'。为避免这种情况,您可以暂时将高度分配给 textarea 的父级。
    • 这是一个非常相似的答案:stackoverflow.com/a/5346855/124946 如果我们在将 height='auto' 设置为 scrollHeight 之前设置它,那么它会按预期工作,根据需要缩小。
    • 当文本区域变得比视口高时会出现问题。在这种情况下,当 textarea 增长时,它会变得紧张。否则相当不错。
    【解决方案5】:

    您也可以尝试将contenteditable 属性添加到普通的pdiv。不是真正的textarea,但它会在没有脚本的情况下自动调整大小。

    .divtext {
        border: ridge 2px;
        padding: 5px;
        width: 20em;
        min-height: 5em;
        overflow: auto;
    }
    <div class="divtext" contentEditable>Hello World</div>

    【讨论】:

    • 这会在粘贴时添加所有 HTML 垃圾。
    • 查看此答案以去除 HTML 垃圾:stackoverflow.com/a/20384452/59087
    • 如果 textarea 是只读的,这个解决方案非常棒。 (那种情况下 contentEditable 可以省略)我还要加上white-space: pre; 设置。
    • 很好的解决方案!使其更像文本区域的一项改进:我将在 div 框.divtext:hover { cursor:text; } 悬停时添加一个光标。就我而言,我还修改了 .divtext:focus 类以在聚焦文本框时更改背景颜色。
    • 在 19 年仍然可以使用 angular 7 和 ngx-highlight <pre><code contentEditable [textContent]="sqlContent"></code></pre>
    【解决方案6】:

    使用此功能:

    function adjustHeight(el){
        el.style.height = (el.scrollHeight > el.clientHeight) ? (el.scrollHeight)+"px" : "60px";
    }
    

    使用这个html:

    <textarea onkeyup="adjustHeight(this)"></textarea>
    

    最后使用这个 css:

    textarea {
    min-height: 60px;
    overflow-y: auto;
    word-wrap:break-word
    }
    

    解决方案只是让滚动条出现以检测需要调整高度,并且每当滚动条出现在您的文本区域中时,它就会调整高度,就像再次隐藏滚动条一样。

    【讨论】:

    • 我知道这是一篇旧帖子,但是当我打印 textarea 时,如果整个内容不适合第一页,则整个内容会转到第二页并在第一页上创建不需要的空格页。如何在打印中将文本区域分成两页?
    【解决方案7】:

    无论出于何种原因,Alciende 的回答在 Safari 中对我来说都不太适用,但在稍作修改后就可以了:

    function textAreaAdjust(o) {
        o.style.height = "1px";
        setTimeout(function() {
            o.style.height = (o.scrollHeight)+"px";
        }, 1);
    }
    

    希望这对某人有所帮助

    【讨论】:

    • 当然,这是一个很好的解决方案...如果您想在用户每次按下键时选通您的文本区域。 :V
    • 这可以解决我当时的问题。今天,我可能会使用 Ravimalya 的答案中给出的 jackmoore 的 jQuery 解决方案
    【解决方案8】:

    已经实现了一个jquery解决方案,源代码在github上:https://github.com/jackmoore/autosize

    【讨论】:

    • 具体在哪里??
    • 使用右下角更改宽度时不会调整高度。
    • 在那里发布问题,而不是对答案投反对票。我不是该插件的作者来检查或解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2014-04-29
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多