如何获取文本区域内文本的高度

时间:2010-07-27 07:28:53

标签: javascript textarea innerhtml

我有textarea文字Hello World。我想得到这篇文章的高度。

我试过用:

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

var textHeight = element.value.offsetHeight;

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

8 个答案:

答案 0 :(得分:17)

创建一个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都是字符串。 String没有定义offsetWidth。

如果您希望获得textarea中所选文本的高度,请使用selectionStart / selectionEnd查找textarea的选定文本。

答案 1 :(得分:16)

element.scrollHeight可能值得研究。

如果我要接近这个(我根本没有测试过),我会将textarea的高度设置为1px来测量滚动高度,然后重置textarea的高度。

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

答案 2 :(得分:6)

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

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

或更短:

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

答案 3 :(得分:3)

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

1)如果你的textarea有填充,你需要减去它(顶部和底部)。

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的额外跨度。

答案 4 :(得分:0)

对于使用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中。

答案 5 :(得分:0)

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

const textarea = document.getElementByTagName("textarea");
const height = textarea.scrollHeight;

console.log({ height });

答案 6 :(得分:-1)

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

你的例子的问题是内联文本没有高度,它只有一个行高,因为它有一个高度它需要处于显示块模式,所以所有的行都被添加到一个文本块,即使这样,这一切都取决于框的宽度和font-size,font-family等。

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

答案 7 :(得分:-1)

我不确定我是否正确解释了您的问题,但我个人需要知道每行文字的确切高度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应包含正确的值,以像素为单位。