【问题标题】:How to get the height of the text inside of a textarea如何获取文本区域内文本的高度
【发布时间】:2011-03-21 11:13:57
【问题描述】:

我有一个textarea,上面写着Hello World。我想得到这个文本的高度。

我试过用:

var element = document.getElementById('textarea');
var textHeight = element.innerHTML.offsetHeight;

和:

var textHeight = element.value.offsetHeight;

但是这些没有给出文本的数字,而是textarea元素的高度。

【问题讨论】:

    标签: javascript textarea innerhtml


    【解决方案1】:

    element.scrollHeight 可能值得研究。

    如果我要解决这个问题(而且我根本没有测试过),我会将 textarea 的高度设置为 1px 测量滚动高度,然后重置 textarea 的高度。

    https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight

    【讨论】:

    • 刚刚对此进行了测试,它解决了我在 scrollHeight 给出奇怪值时遇到的问题(每次您在 IE11 上输入/删除字符时,滚动高度都会增加)。通过首先将文本区域的高度设置为 1px,它给了我所需的文本高度。
    • 这很好,但是当 textarea 或其某些父级设置为 display:none 时不起作用
    【解决方案2】:

    创建一个 span 元素,将 Span 的 innerHTML 设置为“Hello World”。
    获取跨度的 offsetHeight。

    var span = document.createElement("span");
    span.innerHTML="Hello World"; //or whatever string you want.
    span.offsetHeight // this is the answer
    

    请注意,您必须将 span 的字体样式设置为 textarea 的字体样式。

    您的示例将永远无法工作,因为 innerHTML 和 value 都是字符串。字符串没有定义 offsetWidth。

    如果您希望获取文本区域内选定文本的高度,请使用 selectionStart/selectionEnd 查找文本区域的选定文本。

    【讨论】:

    • aham 所以我应该在<textarea> 中创建一个<span>,对吧?
    • 没有。跨度根本不需要附加到文档中。它将在上面的代码之后被处理掉。我还应该注意,代码给出了带有顶部/底部填充的文本的高度,就像往常一样使用 span/div/whatever。如果你不想要这个填充,可以使用 CSS。
    • Aham :D 我想我明白了。让我试试看。
    • 我不知道 :|,不是我。
    • 需要在 offsetHeight 为我返回任何内容之前将 span 附加到文档中。我想您需要将其添加到与 textarea 样式相同的地方,但您不知道 textarea 专门应用了什么 css,所以我看不出这个解决方案实际上是如何工作的?
    【解决方案3】:

    在 jQuery 中没有 scrollHeight,所以它需要一些解决方法。解决方案是:

    var areaheight=$("textarea#element")[0].scrollHeight;
    $("#element").height(areaheight);
    

    或更短:

    $("#element").height($("#element")[0].scrollHeight)
    

    【讨论】:

    • 我不明白为什么 StackOverflow 允许人们在没有评论的情况下投反对票...当我遇到与 OP 相同的问题并想出一个 jQuery 解决方案时,我发现了这个问题,它有效,并且我今天仍在使用,并决定将其发布为答案,以防其他人需要相同的答案。这是对问题的明确答案,带有代码示例和解释......我没有得到反对意见?!
    • 我不知道是不是这个原因,但是当我在输入后使用这段代码更新我的 textarea 的高度时,它总是增加大约 15px 的高度。如果我删除一行,它仍然会扩大文本区域。
    • 它不是为了动态目的。如果您希望它动态工作,请将高度重置为自动,然后读取滚动高度并设置为该高度。
    【解决方案4】:

    您可以使用 element.scrollHeight(就像 Patrick 回答的那样),但它需要一些更正(我在示例中使用 jQuery):

    1) 如果您的文本区域有填充,则需要减去它(顶部和底部)。

    2)如果元素已经设置了高度,则需要将其设置为零(仅用于测量然后将其设置回来,否则返回此高度+填充)

    var h0 = $(element).height();  // backup height
    $(this).height(0); 
    var h = $(this).get(0).scrollHeight - $(this).css('paddingTop').replace('px','')*1 - $(this).css('paddingBottom').replace('px','')*1; // actual text height
    $(this).height(h0); // set back original height (or new height using h)
    

    不需要额外的跨度与 textarea 相同的 css。

    【讨论】:

    • 我不知道为什么其他答案,都错了!正在被选中并投票。这是我找到的唯一正确答案,并且确实有效。谢谢!
    • 这应该是公认的答案。如果您在一个页面中有 1000 个文本区域,您真的不想在创建跨度、应用 css 的客户端上创建如此多的负载,所有这些都只是为了获取文本高度并销毁跨度。或者,您不能使用 textareas,而只使用 p 和 div 创建一个完整的 css 文本框。但是,对于 textareas,这个解决方案可以完美地工作,它会随着输入而增长和缩小,即使页面加载了预填充的文本(与我能找到的大多数其他解决方案不同)。
    【解决方案5】:

    可以通过获取textarea滚动条高度来获取文本高度

    const textarea = document.getElementByTagName("textarea");
    const height = textarea.scrollHeight;
    
    console.log({ height });
    

    【讨论】:

      【解决方案6】:

      对于任何使用 React 的人:

      const textarea_ref = useRef(null);
      const [idealHeight,setIdealHeight] = useState(0);
      const [inputValue,setInputValue] = useState("");
      
      
      useLayoutEffect(() => {                                           // useLayoutEffect TO AVOID FLICKERING
          textarea_ref.current.style.height = '0px';                    // NEEDS TO SET HEIGHT TO ZERO
          const scrollHeight = textarea_ref.current.scrollHeight;       // TO READ THE CORRECT SCROLL HEIGHT WHEN IT SHRINKS
          textarea_ref.current.removeAttribute('style');                // REMOVE INLINE STYLE THAT WAS ADDED WITH 0px
          setIdealHeight(scrollHeight + 2);                             // NEEDS TO ADD 2. I THINK IT'S BECAUSE OF THE BORDER
        },[inputValue]);
      
      return (
        <textarea
          // USE idealHeight STATE TO SET THE HEIGHT
          value={inputValue}
          onChange={onChange}
          ref={textarea_ref}
        />
      );
      

      PS:有时还是会闪烁。至少在 Chrome 中。

      【讨论】:

        【解决方案7】:

        http://www.quirksmode.org/dom/range_intro.html 抱歉,我无法提供更多帮助。

        你的例子的问题是内联文本没有高度,它只有一个行高,它需要处于显示块模式的高度,以便所有行都添加到文本块,即便如此,这一切都取决于框的宽度和字体大小、字体系列等。

        ItzWarty 的建议是获取文本选择并将其放入与 textarea 具有相同字体和宽度的 div 中,它具有显示块并允许您获取其高度。

        【讨论】:

          【解决方案8】:

          我不确定我是否正确解释了您的问题,但我个人需要知道每行文字的确切高度line-height 属性没有正确的值(例如,在 Safari 中,实际打印文本时会四舍五入到最接近的值)。

          这是我的解决方法。您应该在文档开头的某处有以下代码。

          // set one row in the textarea and get its height
          element.rows = 1;
          var height1 = parseFloat(window.getComputedStyle(element)["height"]);
          // set two rows in the textarea and get its height
          element.rows = 2;
          var height2 = parseFloat(window.getComputedStyle(element)["height"]);
          // Now, the line height should be the difference
          var inputLineHeight = height2-height1;
          

          变量inputLineHeight 应该包含正确的值,以像素为单位。

          【讨论】:

            猜你喜欢
            • 2013-11-10
            • 1970-01-01
            • 1970-01-01
            • 2018-03-31
            • 2014-12-14
            • 2011-08-24
            • 2016-06-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多