Signatur
Beschreibung
SVGLength ist die Objektform des SVG-Datentyps <length>. Attribute wie width, height, x, y, r oder cx werden im DOM nicht als Zeichenkette, sondern als SVGAnimatedLength angeboten. Dessen Eigenschaften baseVal (der im Attribut gesetzte Wert) und animVal (der aktuelle, eventuell animierte Wert) sind jeweils ein SVGLength-Objekt.
Ein SVGLength speichert eine Zahl zusammen mit ihrer Einheit. Es bietet diese Eigenschaften:
unitType(nur lesbar): Konstante für die Einheit, z. B.SVGLength.SVG_LENGTHTYPE_PX(5) oderSVG_LENGTHTYPE_PERCENTAGE(2).value: Wert in Benutzereinheiten (entspricht meistpx). Beim Setzen wird die Einheit in eine Benutzereinheit umgewandelt.valueInSpecifiedUnits: Zahl in der ursprünglich angegebenen Einheit.valueAsString: Wert als Zeichenkette mit Einheit, z. B."2.5cm". Lässt sich auch setzen.
Dazu kommen zwei Methoden: newValueSpecifiedUnits(unitType, valueInSpecifiedUnits) setzt Wert und Einheit auf einmal, und convertToSpecifiedUnits(unitType) rechnet den Wert in eine andere Einheit um, ohne dass sich die gezeichnete Länge ändert.
Einen Konstruktor gibt es nicht. Freistehende Instanzen erzeugt man mit SVGSVGElement.prototype.createSVGLength(). Meist greift man aber über element.width.baseVal usw. auf vorhandene Objekte zu. Die Schnittstelle ist dann nützlich, wenn man Einheiten sicher lesen, umrechnen oder ändern will, ohne Attribut-Zeichenketten selbst zu zerlegen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $unitType Pflicht | number | Wird von newValueSpecifiedUnits() und convertToSpecifiedUnits() verwendet. Eine der Konstanten SVG_LENGTHTYPE_NUMBER (1), PERCENTAGE (2), EMS (3), EXS (4), PX (5), CM (6), MM (7), IN (8), PT (9) oder PC (10). |
|
| $valueInSpecifiedUnits Pflicht | number | Wird nur von newValueSpecifiedUnits() verwendet: der neue Zahlenwert in der angegebenen Einheit. |
Rückgabewert
unitType, value, valueInSpecifiedUnits und valueAsString. Beide Methoden geben undefined zurück.Beispiele
Länge eines Attributs auslesen
const svg = document.querySelector('svg');
const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
rect.setAttribute('width', '2cm');
rect.setAttribute('height', '50');
svg.append(rect);
const width = rect.width.baseVal; // SVGLength
console.log(width.valueAsString);
console.log(width.unitType === SVGLength.SVG_LENGTHTYPE_CM);
console.log(width.valueInSpecifiedUnits);
console.log(Math.round(width.value)); // in Benutzereinheiten (px)
Einheit umrechnen mit convertToSpecifiedUnits()
const circle = document.querySelector('circle'); // <circle r="96">
const r = circle.r.baseVal;
// 96 Benutzereinheiten in Zoll umrechnen (96px = 1in)
r.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_IN);
console.log(r.valueAsString);
console.log(circle.getAttribute('r')); // Attribut wird mitgeändert
Wert und Einheit gleichzeitig setzen
const rect = document.querySelector('rect');
const w = rect.width.baseVal;
// Breite auf 50 % des Viewports setzen
w.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE, 50);
console.log(rect.getAttribute('width'));
// Oder bequem über eine Zeichenkette
w.valueAsString = '12mm';
console.log(w.unitType === SVGLength.SVG_LENGTHTYPE_MM);
Freistehendes SVGLength über createSVGLength()
const svg = document.querySelector('svg');
const len = svg.createSVGLength();
len.valueAsString = '3pt';
console.log(len.value); // 3pt = 4px
// Eine Länge zu einer SVGLengthList hinzufügen (z. B. x-Werte eines <text>)
const text = document.querySelector('text');
text.x.baseVal.appendItem(len);
// Wichtig · Fallstricke
- Kein Konstruktor:
new SVGLength()löst einenTypeErroraus. Neue Instanzen erzeugt man mitsvgElement.createSVGLength(). animValist nur lesbar: WervalueodervalueAsStringaufelement.width.animValsetzt, bekommt eineNoModificationAllowedError. Änderungen gehören immer anbaseVal.- Prozent und
em/ex: Um sie in Benutzereinheiten umzurechnen, braucht der Browser einen Viewport bzw. eine Schriftgröße. Bei Elementen, die nicht im Dokument hängen, kannvaluedeshalb falsch sein oder einen Fehler auslösen. - Moderne CSS-Einheiten wie
rem,vwodervhkennt SVGLength nicht.unitTypeist dannSVG_LENGTHTYPE_UNKNOWN(0). Ungültige Einheiten-Konstanten führen zu einerNotSupportedError, ungültige Zeichenketten beivalueAsStringzu einerSyntaxError. - Änderungen über SVGLength schreiben das zugehörige Attribut sofort zurück. Das kann
MutationObserverauslösen. - Die Schnittstelle wird von allen aktuellen Browsern unterstützt. In SVG 2 wurden die Einheiten-Konstanten zusätzlich auf dem Interface-Objekt verfügbar gemacht (
SVGLength.SVG_LENGTHTYPE_PX).