Let's say I have a DIV: <div></div>
and I want to find out with JS what its line-height is. I know one can check the style attribute style.lineHeight
, but I want to check the actual line-height, without it depending on the existence of a CSS rule.
Assuming the font family and font size are the same, both should output the same line-height:
<div>One line of text</div>
<div>Two <br /> Lines of text</div>
How can I get 开发者_如何转开发the line-height of an element with JavaScript?
The answer is actually using .clientHeight
. As Gaby said, this is not really reliable/trustworthy. However, it is! Here:
function getLineHeight(el) {
var temp = document.createElement(el.nodeName), ret;
temp.setAttribute("style", "margin:0; padding:0; "
+ "font-family:" + (el.style.fontFamily || "inherit") + "; "
+ "font-size:" + (el.style.fontSize || "inherit"));
temp.innerHTML = "A";
el.parentNode.appendChild(temp);
ret = temp.clientHeight;
temp.parentNode.removeChild(temp);
return ret;
}
"Clone" the properties of your element into a new one, get the new's clientHeight
, delete the temporary element, and return it's height;
Explained at quirksmode : http://www.quirksmode.org/dom/getstyles.html
example: http://www.jsfiddle.net/gaby/UXNs2/
function getStyle(el,styleProp)
{
var x = document.getElementById(el);
if (x.currentStyle)
var y = x.currentStyle[styleProp];
else if (window.getComputedStyle)
var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
return y;
}
and use it like
getStyle('test', 'line-height' )
This solution works for me. It uses the value of the line-height
property when it has been set explicitly or, when the value has not been set, it calculates the value by finding the difference in the height of the object when its contents are augmented by one line.
function calculateLineHeight (element) {
var lineHeight = parseInt(getStyle(element, 'line-height'), 10);
var clone;
var singleLineHeight;
var doubleLineHeight;
if (isNaN(lineHeight)) {
clone = element.cloneNode();
clone.innerHTML = '<br>';
element.appendChild(clone);
singleLineHeight = clone.offsetHeight;
clone.innerHTML = '<br><br>';
doubleLineHeight = clone.offsetHeight;
element.removeChild(clone);
lineHeight = doubleLineHeight - singleLineHeight;
}
return lineHeight;
}
See currentStyle
for IE and getComputedStyle()
for other browsers (also supported by IE9).
This is easy now with window.getComputedStyle
.
function getLineHeight(el: HTMLSpanElement) {
return window.getComputedStyle(el).lineHeight;
}
It’s fairly complicated. I made an npm package for clamping text to a certain number of lines or a pixel height.
You can’t just check line-height. Sometimes that’s normal
which is no help at all.
You can’t put the text in another element because it may receive different styles.
The most solid method I found was to remove all text from the element and measure its height. Then add a line and measure the height. the height the first line adds isn’t always the same as subsequent lines. Then add another line. The second and all subsequent lines all add the same amount.
My tool exposes a method called calculateTextMetrics()
that which uses the above strategy and returns the resulting measurements.
https://github.com/tvanc/lineclamp#getting-text-metrics
One intuitive way (that doesn't require element reference) is to use selection
and range
APIs to get cursor height.
const range = window.getSelection().getRangeAt(0);
const height = (range.getClientRects()[0]).height;
ref: https://developer.mozilla.org/en-US/docs/Web/API/Element/getClientRects
This is the best way to me. No error for me so far
function getLineHeight(element) {
oldHtml = element.innerHTML
element.innerHTML = "A"
lineHeight = element.offsetHeight
element.innerHTML = oldHtml
return lineHeight }
精彩评论