Ich möchte JavaScript verwenden, um die Breite eines Strings zu berechnen. Ist dies möglich, ohne eine Monospace-Schrift verwenden zu müssen?
Wenn es nicht integriert ist, besteht meine einzige Idee darin, für jedes Zeichen eine Tabelle mit Breiten zu erstellen. Dies ist jedoch ziemlich unvernünftig, insbesondere wenn Unicode und verschiedene Schriftgrößen (und alle Browser) unterstützt werden.
javascript
textbox
Jacob
quelle
quelle
Antworten:
Erstellen Sie einen DIV mit den folgenden Stilen. Legen Sie in Ihrem JavaScript die Schriftgröße und die Attribute fest, die Sie messen möchten, fügen Sie Ihre Zeichenfolge in den DIV ein und lesen Sie dann die aktuelle Breite und Höhe des DIV. Es wird gedehnt, um dem Inhalt zu entsprechen, und die Größe liegt innerhalb weniger Pixel der gerenderten Zeichenfolge.
quelle
+1
in jeder Dimension ist?In HTML 5 können Sie einfach die Canvas.measureText-Methode verwenden (weitere Erläuterungen hier ).
Versuchen Sie diese Geige :
Diese Geige vergleicht diese Canvas-Methode mit einer Variation der DOM-basierten Methode von Bob Monteverde , sodass Sie die Genauigkeit der Ergebnisse analysieren und vergleichen können.
Dieser Ansatz bietet mehrere Vorteile, darunter:
textAlign
und geändert werdentextBaseline
.HINWEIS: Denken Sie beim Hinzufügen des Texts zu Ihrem DOM daran, auch Auffüllung, Rand und Rand zu berücksichtigen .
ANMERKUNG 2: In einigen Browsern liefert diese Methode eine Subpixel-Genauigkeit (Ergebnis ist eine Gleitkommazahl), in anderen nicht (Ergebnis ist nur ein Int). Möglicherweise möchten Sie das Ergebnis ausführen
Math.floor
(oderMath.ceil
), um Inkonsistenzen zu vermeiden. Da die DOM-basierte Methode niemals subpixelgenau ist, hat diese Methode eine noch höhere Genauigkeit als die anderen Methoden hier.Laut diesem jsperf (dank der Mitwirkenden in den Kommentaren) sind die Canvas-Methode und die DOM-basierte Methode ungefähr gleich schnell, wenn der DOM-basierten Methode Caching hinzugefügt wird und Sie Firefox nicht verwenden. In Firefox ist diese Canvas-Methode aus irgendeinem Grund viel schneller als die DOM-basierte Methode (Stand September 2014).
quelle
strokeText()
oderfillText()
. Vielleicht wollten Sie eine andere Antwort kommentieren?Hier ist eine, die ich ohne Beispiel zusammengeschlagen habe. Es sieht so aus, als wären wir alle auf derselben Seite.
Die Verwendung ist einfach:
"a string".width()
** Es
white-space: nowrap
wurden Zeichenfolgen hinzugefügt , deren Breite größer als die Fensterbreite ist.quelle
String
da sie die Trennung der Bedenken Ihres Programms verringert (separater Kerncode vs. UI-Code). Stellen Sie sich vor, Sie möchten Ihren Kerncode auf eine Plattform mit einem ganz anderen UI-Framework portieren ...o[0].getBoundingClientRect().width
wie hier vorgeschlagen verwenden: stackoverflow.com/a/16072668/936397jQuery:
quelle
Das funktioniert bei mir ...
quelle
Die ExtJS-Javascript-Bibliothek verfügt über eine großartige Klasse namens Ext.util.TextMetrics, die "präzise Pixelmessungen für Textblöcke bereitstellt, damit Sie genau bestimmen können, wie hoch und breit ein bestimmter Textblock in Pixel sein wird". Sie können es entweder direkt verwenden oder seine Quelle als Code anzeigen, um zu sehen, wie dies gemacht wird.
http://docs.sencha.com/extjs/6.5.3/modern/Ext.util.TextMetrics.html
quelle
Ich mag deine "einzige Idee", nur eine statische Zeichenbreiten-Map zu erstellen! Es funktioniert tatsächlich gut für meine Zwecke. Manchmal möchten Sie aus Leistungsgründen oder weil Sie keinen einfachen Zugriff auf ein DOM haben, nur einen schnellen, eigenständigen Taschenrechner, der auf eine einzelne Schriftart kalibriert ist. Also hier ist eine, die auf Helvetica kalibriert ist; Übergeben Sie eine Zeichenfolge und (optional) eine Schriftgröße:
Dieses riesige hässliche Array besteht aus ASCII-Zeichenbreiten, die durch Zeichencode indiziert werden. Dies unterstützt also nur ASCII (andernfalls wird eine durchschnittliche Zeichenbreite angenommen). Glücklicherweise skaliert die Breite im Wesentlichen linear mit der Schriftgröße, sodass sie bei jeder Schriftgröße ziemlich gut funktioniert. Es fehlt merklich jegliches Bewusstsein für Kerning oder Ligaturen oder was auch immer.
Um "zu kalibrieren", habe ich einfach jedes Zeichen bis zu charCode 126 (der mächtigen Tilde) auf einem SVG gerendert und den Begrenzungsrahmen erhalten und in diesem Array gespeichert. Mehr Code und Erklärung und Demo hier .
quelle
* fontSize
und einfach 'em' verwendenIch habe ein kleines Tool dafür geschrieben. Vielleicht ist es für jemanden nützlich. Es funktioniert ohne jQuery .
https://github.com/schickling/calculate-size
Verwendungszweck:
Geige: http://jsfiddle.net/PEvL8/
quelle
Sie können die Zeichenfläche verwenden, damit Sie sich nicht so sehr mit CSS-Eigenschaften befassen müssen:
quelle
Dies sollte funktionieren, solange auf das <span> -Tag keine anderen Stile angewendet werden. offsetWidth umfasst die Breite aller Ränder, die horizontale Auffüllung, die Breite der vertikalen Bildlaufleiste usw.
quelle
Die folgenden Code-Schnipsel "berechnen" die Breite des Span-Tags, fügen "..." hinzu, wenn es zu lang ist, und reduzieren die Textlänge, bis es in das übergeordnete Element passt (oder bis es mehr als versucht hat tausendmal)
CSS
HTML
JavaScript (mit jQuery)
quelle
Am besten erkennen Sie, ob der Text passt, bevor Sie das Element anzeigen. Sie können also diese Funktion verwenden, bei der das Element nicht auf dem Bildschirm angezeigt werden muss.
Verwendungszweck:
quelle
Falls hier jemand nach einer Möglichkeit gesucht hat, die Breite eines Strings zu messen und herauszufinden, welche Schriftgröße am größten in eine bestimmte Breite passt, finden Sie hier eine Funktion, die auf der Lösung von @ Domi mit einer binären Suche aufbaut ::
quelle
Versuchen Sie diesen Code:
quelle
Die Breite und Höhe eines Textes kann mit
clientWidth
und ermittelt werdenclientHeight
Stellen Sie sicher, dass die Eigenschaft style position auf absolut gesetzt ist
muss nicht in a sein
div
, kann in ap
oder a seinspan
quelle
Aufbauend auf Deepak Nadars Antwort ich die Funktionsparameter geändert, um Text- und Schriftstile zu akzeptieren. Sie müssen kein Element referenzieren. Außerdem
fontOptions
haben die Standardeinstellungen, sodass Sie nicht alle angeben müssen.quelle
Ich denke, dies ist dem Eintrag von Depak ziemlich ähnlich, basiert jedoch auf der Arbeit von Louis Lazaris, die in einem Artikel auf der beeindruckenden Seite veröffentlicht wurde
Das Fit-Ereignis wird verwendet, um den Funktionsaufruf sofort auszuführen, nachdem die Funktion dem Steuerelement zugeordnet wurde.
zB: $ ('input'). autofit (). trigger ("fit");
quelle
Ohne jQuery:
quelle
Geige des Arbeitsbeispiels: http://jsfiddle.net/tdpLdqpo/1/
HTML:
JavaScript-Code:
quelle
Das Summieren aller zurückgegebenen Rechteckbreiten ergibt die gesamte Textbreite in Pixel.
quelle
Ich habe ein winziges ES6-Modul erstellt (verwendet jQuery):
Einfach zu verwenden:
Coole Sache, die Sie vielleicht bemerken - es ermöglicht die Berücksichtigung aller CSS-Attribute, sogar von Auffüllungen!
quelle
Sie können dies auch mit createRange tun, das genauer ist als die Textklontechnik:
quelle
quelle