Signatur
Beschreibung
Die Eigenschaft width der Schnittstelle SVGForeignObjectElement gibt die Breite eines <foreignObject>-Elements zurück. Das ist die Breite des rechteckigen Bereichs, in dem fremde Inhalte, meist HTML, innerhalb einer SVG-Grafik gezeichnet werden. Der Wert entspricht dem Attribut width bzw. der gleichnamigen CSS-Geometrie-Eigenschaft.
Die Eigenschaft selbst ist schreibgeschützt. Sie liefert aber ein SVGAnimatedLength-Objekt, über das Sie den Wert lesen und ändern können:
width.baseVal: der statische Grundwert alsSVGLength. Er ist beschreibbar, etwa übervalue,valueInSpecifiedUnitsodernewValueSpecifiedUnits().width.animVal: der aktuelle Wert während einer SMIL-Animation. Er ist nur lesbar.
Typische Einsatzfälle sind dynamische Diagramme, Beschriftungen mit HTML-Umbruch, Formulare oder Tooltips innerhalb einer SVG-Grafik. Dort muss sich die Breite des eingebetteten Bereichs zur Laufzeit an Daten oder an die Größe der Anzeige anpassen. Setzen Sie keine Breite oder den Wert 0, wird der Inhalt nicht angezeigt.
Rückgabewert
baseVal und animVal, beide vom Typ SVGLength. Der Standardwert ist 0, wenn kein width-Attribut gesetzt ist. Bei auto verhält sich der Wert wie 0.Beispiele
Breite auslesen
// <svg width="300" height="200"><foreignObject id="fo" x="10" y="10" width="160" height="80">...</foreignObject></svg>
const fo = document.querySelector('#fo');
console.log(fo.width.baseVal.value); // Wert in Benutzereinheiten
console.log(fo.width.baseVal.unitType === SVGLength.SVG_LENGTHTYPE_NUMBER);
console.log(fo.width.animVal.value);
foreignObject dynamisch erzeugen und Breite setzen
const SVG_NS = 'http://www.w3.org/2000/svg';
const svg = document.querySelector('svg');
const fo = document.createElementNS(SVG_NS, 'foreignObject');
fo.setAttribute('x', '20');
fo.setAttribute('y', '20');
fo.setAttribute('height', '60');
// Breite über die DOM-Schnittstelle statt über setAttribute setzen
fo.width.baseVal.value = 220;
const div = document.createElement('div');
div.textContent = 'HTML-Text mit automatischem Zeilenumbruch im SVG.';
fo.append(div);
svg.append(fo);
console.log(fo.getAttribute('width'));
Breite in Prozent angeben und in Pixel umrechnen
const fo = document.querySelector('#fo');
// 50 % der Breite des SVG-Viewports
fo.width.baseVal.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE, 50);
console.log(fo.getAttribute('width')); // Attribut wird synchronisiert
console.log(fo.width.baseVal.valueInSpecifiedUnits);
console.log(fo.width.baseVal.value); // aufgelöster Wert, z. B. bei 300 px breitem SVG
Breite an den Inhalt anpassen (Tooltip)
const fo = document.querySelector('#tooltip');
const box = fo.querySelector('div');
const updateTooltip = (text) => {
box.textContent = text;
// Breite vorübergehend groß setzen, damit der Inhalt frei gemessen werden kann
fo.width.baseVal.value = 1000;
const needed = Math.ceil(box.scrollWidth) + 16; // Innenabstand
fo.width.baseVal.value = Math.min(needed, 280);
};
updateTooltip('Umsatz Q3: 12.400 €');
console.log(fo.width.baseVal.value > 0);
// Wichtig · Fallstricke
- Keine direkte Zuweisung:
fo.width = 200hat keine Wirkung, im Strict Mode wird einTypeErrorgeworfen. Ändern Sie stattdessenfo.width.baseVal.value, oder verwenden SiesetAttribute('width', …). animValist schreibgeschützt: Wenn Sie inanimValschreiben, wird eineNoModificationAllowedError-Ausnahme ausgelöst.- CSS hat Vorrang: Seit SVG 2 ist
widthauch eine CSS-Eigenschaft. Eine Breite, die per CSS gesetzt ist, überschreibt das Attribut für die Darstellung.baseValspiegelt aber nur das Attribut wider. Die tatsächlich gezeichnete Größe ermitteln Sie mitgetBBox()odergetBoundingClientRect(). - Prozentwerte: Sie beziehen sich auf den nächsten SVG-Viewport. Werte in
%,emusw. kannvalueerst auflösen, wenn das Element im Dokument eingehängt ist. - Namensraum: Erzeugen Sie das Element mit
document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject'). MitcreateElemententsteht ein unbekanntes HTML-Element ohne die Eigenschaftwidth. - Kompatibilität: Die Eigenschaft wird in allen modernen Browsern unterstützt. Die Darstellung von HTML in
foreignObjectunterscheidet sich jedoch teilweise, etwa bei Transformationen und beim Überlauf in Safari. Testen Sie deshalb in allen Zielbrowsern. - Sicherheit: Wenn Sie HTML-Inhalte über
innerHTMLin einforeignObjecteinfügen, gelten dieselben XSS-Risiken wie im normalen DOM. Bereinigen Sie Eingaben von Nutzern daher vorher.