Signatur
Beschreibung
Die Eigenschaft x des Interfaces SVGForeignObjectElement steht für das Attribut x eines <foreignObject>-Elements, also die horizontale Position der linken oberen Ecke im Benutzerkoordinatensystem. Mit <foreignObject> lassen sich HTML-Inhalte wie Formulare, umbrechender Text oder Videos in eine SVG-Grafik einbetten.
Die Eigenschaft selbst ist schreibgeschützt: Sie liefert ein SVGAnimatedLength-Objekt. Die Zuweisung el.x = 10 hat keine Wirkung. Den Wert liest und setzt man über das enthaltene SVGLength: x.baseVal ist der statische Attributwert und beschreibbar, x.animVal ist der aktuelle, gegebenenfalls durch SMIL animierte Wert und nur lesbar.
Über baseVal.value bekommt man den Wert in Benutzereinheiten (user units). baseVal.valueAsString liefert die Originalschreibweise, etwa "10%", und mit convertToSpecifiedUnits() wandelt man in andere Einheiten um. Fehlt das Attribut, ist der Wert 0.
Rückgabewert
SVGAnimatedLength-Objekt mit baseVal (beschreibbares SVGLength) und animVal (nur lesbares SVGLength) für die x-Koordinate.Beispiele
x-Koordinate auslesen
// <svg><foreignObject id="fo" x="20" y="10" width="200" height="100">…</foreignObject></svg>
const fo = document.getElementById('fo');
console.log(fo.x instanceof SVGAnimatedLength);
console.log(fo.x.baseVal.value);
console.log(fo.x.animVal.value);
HTML-Box per Skript verschieben
const svgNS = 'http://www.w3.org/2000/svg';
const svg = document.querySelector('svg');
const fo = document.createElementNS(svgNS, 'foreignObject');
fo.setAttribute('width', '160');
fo.setAttribute('height', '60');
const div = document.createElement('div');
div.textContent = 'HTML in SVG';
fo.append(div);
svg.append(fo);
// Wert über baseVal setzen, nicht über fo.x = …
fo.x.baseVal.value = 50;
console.log(fo.getAttribute('x'));
Prozentwerte und Einheiten umrechnen
// <svg width="400"><foreignObject id="fo" x="25%" …></svg>
const fo = document.getElementById('fo');
const len = fo.x.baseVal;
console.log(len.valueAsString);
console.log(len.unitType === SVGLength.SVG_LENGTHTYPE_PERCENTAGE);
console.log(len.value); // in Benutzereinheiten
// Einheit auf Pixel umstellen
len.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX);
console.log(fo.getAttribute('x'));
// Wichtig · Fallstricke
- Schreibgeschützt:
fo.x = 100wird ignoriert und wirft im Strict Mode einenTypeError. Nutze stattdessenfo.x.baseVal.value = 100odersetAttribute('x', '100'). animValist nur lesbar. Schreibzugriffe darauf werfen einenNoModificationAllowedError.- Bei Prozent- oder
em-Werten hängtbaseVal.valuevom Viewport bzw. von der Schriftgröße ab. Ist das Element nicht gerendert (z. B.display: noneoder noch nicht im DOM), kann die Umrechnung einenNotSupportedErrorauslösen oder ungenau sein. - In SVG 2 ist
xauch eine CSS-Eigenschaft (x: 20px). Eine CSS-Regel überschreibt das Attribut in der Darstellung,baseValgibt aber weiterhin den Attributwert zurück. - Kompatibilität: Die Eigenschaft wird in allen modernen Browsern unterstützt. Wie HTML-Inhalte in
<foreignObject>gerendert werden (Transformationen, Zoom), unterscheidet sich teilweise zwischen den Browsern, vor allem in Safari.