我有textarea
文字Hello World
。我想得到这篇文章的高度。
我试过用:
var element = document.getElementById('textarea');
var textHeight = element.innerHTML.offsetHeight;
和
var textHeight = element.value.offsetHeight;
但是这些不会给出文本的数字,而是textarea
元素的高度。
答案 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
应包含正确的值,以像素为单位。