2010-12-08 18 views
19

Angenommen, ich habe einen DIV: <div></div> und möchte mit JS herausfinden, was Zeilenhöhe ist. Ich weiß, dass man das Stilattribut style.lineHeight überprüfen kann, aber ich möchte die tatsächlicheZeilenhöhe überprüfen, ohne es abhängig von der Existenz einer CSS-Regel.JavaScript: Finde DIVs Zeilenhöhe, nicht CSS Eigenschaft sondern tatsächliche Zeilenhöhe

Unter der Annahme, die Schriftfamilie und Schriftgröße gleich ist, soll beide Ausgang die gleiche line-height:

<div>One line of text</div> 
<div>Two <br /> Lines of text</div> 

Wie kann ich den line-height ein Element mit JavaScript?

Antwort

22

Die Antwort .clientHeight tatsächlich verwendet wird. Als Gaby sagte, das ist nicht wirklich zuverlässig/vertrauenswürdig. Wie auch immer es ist! Hier:

function getLineHeight(element){ 
    var temp = document.createElement(element.nodeName); 
    temp.setAttribute("style","margin:0px;padding:0px;font-family:"+element.style.fontFamily+";font-size:"+element.style.fontSize); 
    temp.innerHTML = "test"; 
    temp = element.parentNode.appendChild(temp); 
    var ret = temp.clientHeight; 
    temp.parentNode.removeChild(temp); 
    return ret; 
} 

„Clone“ die Eigenschaften Ihres Elements in eine neue, bekommen die neuen des clientHeight, das temporäre Element löschen, und das Rück es ist Höhe;

+1

Seien Sie jedoch vorsichtig, dass Sie das Styling dieses Teils erben, da Sie es an das Dokument anhängen.Es bedeutet nicht, dass das Element, für das du testest, die selbe "Zeilenhöhe" hat, da irgendeine innere Regel es überschreiben kann. Die Zeilenhöhe ist nicht konstant über das Dokument hinweg. –

+0

Ich denke, ich habe gerade behoben Ich habe mir das von Anfang an ausgedacht, aber ich war irgendwie zu faul, es dort zu machen, lol. Ich habe "Dokument" durch "element.parentNode" ersetzt: D – JCOC611

+0

Funktioniert gut für mich. Vielen Dank! – Davy8

2

Siehe currentStyle für IE und getComputedStyle() für andere Browser (auch von IE9 unterstützt).

+0

Angenommen * * verweist auf ein Element HTML DIV Element, 'element.currentStyle' kehrt undefiniert und' element.getComputedStyle() 'wirft Fehler (undefiniert zu), in Chrom. – JCOC611

+0

obwohl diese Methode in der zweiten Antwort – JCOC611

9

bei Quirksmode Erklärt: http://www.quirksmode.org/dom/getstyles.html

Beispiel: 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; 
} 

und verwenden Sie es wie

getStyle('test', 'line-height') 
+0

erklärt wird Ziemlich interessant, obwohl es "normal" statt einer Zahl zurückgibt, zumindest in Chrome. – JCOC611

+0

Ich bin nicht sicher, ob Sie mehr Informationen aus diesem Fall bekommen können, da 'normal' ein gültiger Wert für' line-height' ist. Siehe http://stackoverflow.com/questions/3614323/jquery-css-line-height-of-normal-px –

+0

In der Tat, aber als ich die Frage schrieb, war ich auf der Suche nach etwas wie '.clientWidth()', was ist wird verwendet, um die "echte" Breite eines Elements abzurufen. – JCOC611

4

Diese Lösung funktioniert für mich. Es verwendet den Wert der Eigenschaft line-height, wenn es explizit festgelegt wurde, oder wenn der Wert nicht festgelegt wurde, berechnet es den Wert, indem es den Unterschied in der Höhe des Objekts ermittelt, wenn sein Inhalt um eine Zeile erweitert wird.

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; 
}