Wenn die Größe des Divs vom Inhalt abhängt (was meiner Beschreibung nach der Fall ist), können Sie die Höhe des Divs abrufen, indem Sie:
var divHeight = document.getElementById('content').offsetHeight;
Und dividieren Sie durch die Höhe der Schriftzeile:
document.getElementById('content').style.lineHeight;
Oder um die Zeilenhöhe zu erhalten, wenn sie nicht explizit festgelegt wurde:
var element = document.getElementById('content');
document.defaultView.getComputedStyle(element, null).getPropertyValue("lineHeight");
Sie müssen auch die Polsterung und den Abstand zwischen den Zeilen berücksichtigen.
BEARBEITEN
Vollständig in sich geschlossener Test, bei dem die Zeilenhöhe explizit festgelegt wird:
function countLines() {
var el = document.getElementById('content');
var divHeight = el.offsetHeight
var lineHeight = parseInt(el.style.lineHeight);
var lines = divHeight / lineHeight;
alert("Lines: " + lines);
}
<body onload="countLines();">
<div id="content" style="width: 80px; line-height: 20px">
hello how are you? hello how are you? hello how are you? hello how are you?
</div>
</body>
line-height
(die nicht explizit festgelegt ist), wäre die Verwendung vonwindow.getComputedStyle(element, null).getPropertyValue('line-height')
Eine Lösung besteht darin, jedes Wort mithilfe eines Skripts in ein span-Tag einzuschließen. Wenn dann die Y-Dimension eines bestimmten Span-Tags kleiner als die des unmittelbaren Vorgängers ist, ist ein Zeilenumbruch aufgetreten.
quelle
Schauen Sie sich die Funktion getClientRects () an, mit der die Anzahl der Zeilen in einem Element gezählt werden kann. Hier ist ein Beispiel für die Verwendung.
Es gibt ein Javascript-DOM-Objekt zurück. Die Anzahl der Zeilen kann folgendermaßen ermittelt werden:
Es kann die Höhe jeder Zeile und mehr zurückgeben. Sehen Sie sich das gesamte Spektrum der möglichen Funktionen an, indem Sie dies Ihrem Skript hinzufügen und dann in Ihrem Konsolenprotokoll nachsehen.
Obwohl einige Dinge zu beachten sind, funktioniert es nur, wenn das enthaltende Element inline ist. Sie können das enthaltende inline-Element jedoch mit einem Blockelement umgeben, um die Breite wie folgt zu steuern:
Obwohl ich nicht empfehle, den Stil so hart zu codieren. Es ist nur zum Beispiel Zwecke.
quelle
Ich war mit den Antworten hier und auf anderen Fragen nicht zufrieden. Die am höchsten bewertete Antwort berücksichtigt
padding
oderborder
berücksichtigt sie nicht und wird daher offensichtlich auch ignoriertbox-sizing
. Meine Antwort kombiniert einige Techniken hier und in anderen Threads, um eine Lösung zu erhalten, die zu meiner Zufriedenheit funktioniert.Es ist nicht perfekt: Wenn kein numerischer Wert für das
line-height
(z. B.normal
oderinherit
) abgerufen werden konnte , wird nur dasfont-size
multiplizierte mit verwendet1.2
. Vielleicht kann jemand anderes in diesen Fällen einen zuverlässigen Weg vorschlagen, um den Pixelwert zu erkennen.Davon abgesehen war es in der Lage, die meisten Stile und Fälle, die ich darauf geworfen habe, korrekt zu handhaben.
jsFiddle zum Herumspielen und Testen. Auch unten inline.
quelle
Klonen Sie das Containerobjekt und schreiben Sie 2 Buchstaben und berechnen Sie die Höhe. Dies gibt die tatsächliche Höhe mit allen angewendeten Stilen, Linienhöhen usw. zurück. Berechnen Sie nun das Höhenobjekt / die Größe eines Buchstabens. In Jquery übertrifft die Höhe die Polsterung, den Rand und den Rand. Es ist großartig, die tatsächliche Höhe jeder Linie zu berechnen:
Wenn Sie eine seltene Schriftart mit unterschiedlicher Höhe für jeden Buchstaben verwenden, funktioniert dies nicht. Funktioniert aber mit allen normalen Schriftarten wie Arial, Mono, Comics, Verdana usw. Testen Sie mit Ihrer Schriftart.
Beispiel:
Ergebnis:
6 Lines
Funktioniert in allen Browsern ohne seltene Funktionen außerhalb der Standards.
Überprüfen Sie: https://jsfiddle.net/gzceamtr/
quelle
clone
→cloneNode
,hide
→style.visibility = "hidden"
,html('a<br>b')
→textContent='a\r\nb'
,appendTo('body')
→document.documentElement.appendChild
,height()
→getBoundingClientRect().height
Für diejenigen, die jQuery verwenden http://jsfiddle.net/EppA2/3/
quelle
$(selector).css('line-height');
, erhalten Sie keine Nummer aus dieser Funktion.Ich bin überzeugt, dass es jetzt unmöglich ist. Es war jedoch so.
Die Implementierung von getClientRects durch IE7 hat genau das getan, was ich will. Öffnen Sie diese Seite in IE8, aktualisieren Sie sie mit variierender Fensterbreite und sehen Sie, wie sich die Anzahl der Zeilen im ersten Element entsprechend ändert. Hier sind die wichtigsten Zeilen des Javascript von dieser Seite:
Leider gibt Firefox für mich immer ein Client-Rechteck pro Element zurück, und IE8 macht jetzt dasselbe. (Die Seite von Martin Honnen funktioniert heute, weil der IE sie in der IE-kompatiblen Ansicht rendert. Drücken Sie im IE8 F12, um mit verschiedenen Modi zu spielen.)
Das ist traurig. Es sieht wieder so aus, als hätte die wörtliche, aber wertlose Implementierung der Spezifikation von Firefox die nützliche von Microsoft überzeugt. Oder vermisse ich eine Situation, in der neue getClientRects einem Entwickler helfen können?
quelle
Basierend auf der Antwort von GuyPaddock von oben scheint dies für mich zu funktionieren
Der Trick dabei ist, die Zeilenhöhe so stark zu erhöhen, dass alle Unterschiede zwischen Browser und Betriebssystem in der Art und Weise, wie Schriftarten gerendert werden, "verschluckt" werden
Es wurde mit verschiedenen Stilen und verschiedenen Schriftgrößen / Familien überprüft. Das einzige, was nicht berücksichtigt wird (da es in meinem Fall keine Rolle spielte), ist die Polsterung, die leicht zur Lösung hinzugefügt werden kann.
quelle
Nein, nicht zuverlässig. Es gibt einfach zu viele unbekannte Variablen
Die Liste geht weiter. Ich hoffe, dass es eines Tages eine solche Methode geben wird, um dies mit JavaScript zuverlässig zu erreichen, aber bis zu diesem Tag haben Sie kein Glück.
Ich hasse solche Antworten und hoffe, dass jemand mir das Gegenteil beweisen kann.
quelle
Sie sollten in der Lage sein, die Länge zu teilen ('\ n') und die Zeilenumbrüche zu erhalten.
Update: Dies funktioniert unter FF / Chrome, aber nicht unter IE.
quelle
getClientRects
Rückgabe der Client Rects wie diese , und wenn Sie die Linien erhalten möchten, verwenden Sie die Follow - Funktion wie diesequelle
Ich habe einen Weg gefunden, die Zeilennummer zu berechnen, als ich einen HTML-Editor entwickelte. Die primäre Methode ist folgende:
Im IE können Sie getBoundingClientRects aufrufen. Jede Zeile wird als Rechteck zurückgegeben
In einem Webkit oder einer neuen Standard-HTML-Engine werden die Client-Rechtecke jedes Elements oder Knotens zurückgegeben. In diesem Fall können Sie jedes Rechteck vergleichen. Ich meine, jedes Rechteck muss das größte sein, sodass Sie die Rechtecke ignorieren können, deren Höhe kleiner ist (wenn Die Oberseite eines Rechtecks ist kleiner als die Unterseite und die Unterseite größer als die Bedingung. Die Bedingung ist erfüllt.)
Schauen wir uns also das Testergebnis an:
Das grüne Rechteck ist das größte Rechteck in jeder Reihe
Das rote Rechteck ist die Auswahlgrenze
Das blaue Rechteck ist die Grenze vom Anfang bis zur Auswahl nach dem Erweitern. Wir sehen, dass es möglicherweise größer als das rote Rechteck ist. Daher müssen wir den Boden jedes Rechtecks überprüfen, um zu begrenzen, dass es kleiner als der Boden des roten Rechtecks sein muss.
quelle
Versuchen Sie diese Lösung:
Sie können es hier in Aktion sehen: https://jsfiddle.net/u0r6avnt/
Versuchen Sie, die Größe der Bedienfelder auf der Seite zu ändern (um die rechte Seite der Seite breiter oder kürzer zu machen), und führen Sie sie dann erneut aus, um festzustellen, ob zuverlässig festgestellt werden kann, wie viele Zeilen vorhanden sind.
Dieses Problem ist schwieriger als es aussieht, aber die meisten Schwierigkeiten kommen aus zwei Quellen:
Das Rendern von Text ist in Browsern zu niedrig, um direkt von JavaScript abgefragt zu werden. Selbst der Pseudo-Selektor CSS :: first-line verhält sich nicht ganz so wie andere Selektoren (Sie können ihn beispielsweise nicht invertieren, um das Styling auf alle außer der ersten Zeile anzuwenden ).
Der Kontext spielt eine große Rolle bei der Berechnung der Anzahl der Zeilen. Wenn beispielsweise die Zeilenhöhe in der Hierarchie des Zielelements nicht explizit festgelegt wurde, erhalten Sie möglicherweise "normal" als Zeilenhöhe zurück. Darüber hinaus wird das Element möglicherweise verwendet
box-sizing: border-box
und unterliegt daher einer Auffüllung.Mein Ansatz minimiert # 2, indem er die Kontrolle über die Linienhöhe direkt übernimmt und die Box-Größenmethode berücksichtigt, was zu einem deterministischeren Ergebnis führt.
quelle
In bestimmten Fällen, wie bei einem Link, der sich über mehrere Zeilen in nicht gerechtfertigtem Text erstreckt, können Sie die Zeilenanzahl und jede Koordinate jeder Zeile abrufen, wenn Sie Folgendes verwenden:
https://developer.mozilla.org/en-US/docs/Web/API/Element/getClientRects
Dies funktioniert, weil jede Zeile auch nur geringfügig anders wäre. Solange sie es sind, werden sie vom Renderer als ein anderes "Rechteck" gezeichnet.
quelle
Nach dem Vorschlag von @BobBrunius 2010 habe ich dies mit jQuery erstellt. Zweifellos könnte es verbessert werden, aber es kann einigen helfen.
quelle
Sie können Elementhöhe und Elementhöhe mit vergleichen
line-height: 0
quelle