Ich arbeite an ECMAScript / JavaScript für eine SVG-Datei und muss das width
und height
eines text
Elements abrufen, damit ich die Größe eines Rechtecks ändern kann, das es umgibt. In HTML könnte ich die Attribute offsetWidth
und offsetHeight
für das Element verwenden, aber es scheint, dass diese Eigenschaften nicht verfügbar sind.
Hier ist ein Fragment, mit dem ich arbeiten muss. Ich muss die Breite des Rechtecks ändern, wenn ich den Text ändere, aber ich weiß nicht, wie ich den tatsächlichen Wert width
(in Pixel) des text
Elements ermitteln kann.
<rect x="100" y="100" width="100" height="100" />
<text>Some Text</text>
Irgendwelche Ideen?
javascript
dom
text
svg
Stephen Sorensen
quelle
quelle
In Bezug auf die Textlänge scheint der Link darauf hinzudeuten, dass BBox und getComputedTextLength () leicht unterschiedliche Werte zurückgeben, die jedoch ziemlich nahe beieinander liegen.
http://bl.ocks.org/MSCAU/58bba77cdcae42fc2f44
quelle
arbeitete für mich in
quelle
Wie wäre es mit so etwas aus Kompatibilitätsgründen:
Dies gibt den Durchschnitt aller gültigen Ergebnisse der drei Methoden zurück. Sie können es verbessern, um Ausreißer auszutreiben oder zu bevorzugen,
getComputedTextLength
wenn das Element ein Textelement ist.Warnung: Wie der Kommentar sagt,
getBoundingClientRect
ist schwierig. Entfernen Sie es entweder aus den Methoden oder verwenden Sie es nur für Elemente, bei denengetBoundingClientRect
gute Ergebnisse erzielt werden, also keine Drehung und wahrscheinlich keine Skalierung (?)quelle
Ich weiß nicht warum, aber keine der oben genannten Methoden funktioniert bei mir. Ich hatte einige Erfolge mit der Canvas-Methode, musste aber alle möglichen Skalierungsfaktoren anwenden. Trotz der Skalierungsfaktoren hatte ich immer noch inkonsistente Ergebnisse zwischen Safari, Chrome und Firefox.
Also habe ich folgendes versucht:
Hat super und super präzise funktioniert, aber nur in Firefox. Skalierungsfaktoren zur Rettung von Chrome und Safari, aber keine Freude. Es stellt sich heraus, dass Safari- und Chrome-Fehler weder mit der Zeichenfolgenlänge noch mit der Schriftgröße linear sind.
Gehen Sie also Nummer zwei an. Ich mag den Brute-Force-Ansatz nicht besonders, aber nachdem ich jahrelang damit zu kämpfen hatte, beschloss ich, es auszuprobieren. Ich habe beschlossen, für jedes einzelne druckbare Zeichen konstante Werte zu generieren. Normalerweise wäre das etwas langweilig, aber zum Glück ist Firefox sehr genau. Hier ist meine zweiteilige Brute-Force-Lösung:
Hinweis: Das obige Snippet muss in Firefox ausgeführt werden, um ein genaues Array von Werten zu generieren. Außerdem müssen Sie das Array-Element 32 durch den Wert für die Leerzeichenbreite im Konsolenprotokoll ersetzen.
Ich kopiere einfach den Firefox-Bildschirmtext und füge ihn in meinen Javascript-Code ein. Nachdem ich nun das Array druckbarer Zeichenlängen habe, kann ich eine Funktion zum Abrufen der Breite implementieren. Hier ist der Code:
Nun, das ist es. Brute Force, aber es ist in allen drei Browsern sehr genau und meine Frustration ist auf Null gesunken. Ich bin mir nicht sicher, wie lange es dauern wird, wenn sich die Browser weiterentwickeln, aber es sollte lang genug sein, damit ich eine robuste Technik für Schriftmetriken für meinen SVG-Text entwickeln kann.
quelle
Die SVG-Spezifikation verfügt über eine bestimmte Methode, um diese Informationen zurückzugeben:
getComputedTextLength()
quelle