Signatur
Beschreibung
Die Eigenschaft viewBox des Interfaces SVGSVGElement liefert ein SVGAnimatedRect-Objekt, das das viewBox-Attribut des <svg>-Elements widerspiegelt. Die viewBox legt fest, welcher Ausschnitt des Nutzerkoordinatensystems (x, y, width, height) auf den Darstellungsbereich des SVG abgebildet wird. Damit steuert sie Skalierung, Zoom und Verschiebung der Grafik.
Das zurückgegebene Objekt hat zwei Eigenschaften: baseVal (ein DOMRect mit dem Attributwert, veränderbar) und animVal (der aktuelle, ggf. durch SMIL-Animation veränderte Wert, nur lesbar). Die Eigenschaft viewBox selbst ist schreibgeschützt – verändert wird der Ausschnitt, indem man die Felder von baseVal anpasst oder das Attribut per setAttribute() neu setzt.
Typische Einsatzzwecke sind Zoom- und Pan-Funktionen für Diagramme, Karten oder Editoren, das Auslesen des internen Koordinatensystems zur Umrechnung von Mauskoordinaten sowie das dynamische Anpassen einer Grafik an ihren Inhalt (etwa mit getBBox()).
Rückgabewert
baseVal (DOMRect, änderbar) und animVal (DOMRectReadOnly, animierter Wert). Ist kein viewBox-Attribut gesetzt, enthält baseVal in aktuellen Browsern die Werte 0, 0, 0, 0.Beispiele
viewBox auslesen
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
svg.setAttribute('viewBox', '0 0 200 100');
document.body.append(svg);
const { x, y, width, height } = svg.viewBox.baseVal;
console.log(x, y, width, height);
Zoom per Mausrad über baseVal
const svg = document.querySelector('svg');
svg.addEventListener('wheel', (event) => {
event.preventDefault();
const vb = svg.viewBox.baseVal;
const factor = event.deltaY > 0 ? 1.1 : 0.9;
// Um die Mitte herum zoomen
const cx = vb.x + vb.width / 2;
const cy = vb.y + vb.height / 2;
vb.width *= factor;
vb.height *= factor;
vb.x = cx - vb.width / 2;
vb.y = cy - vb.height / 2;
}, { passive: false });
viewBox an Inhalt anpassen
const svg = document.querySelector('svg');
const box = svg.getBBox(); // Begrenzungsrahmen aller Kinder
const padding = 10;
svg.setAttribute(
'viewBox',
`${box.x - padding} ${box.y - padding} ${box.width + 2 * padding} ${box.height + 2 * padding}`
);
console.log(svg.viewBox.baseVal.width === box.width + 20);
// Wichtig · Fallstricke
- Nur lesbar:
svg.viewBox = …hat keine Wirkung (im Strict ModeTypeError). Ändern Sie stattdessensvg.viewBox.baseVal.xusw. oder nutzen SiesetAttribute('viewBox', …). - Fehlendes Attribut: Ohne
viewBox-Attribut liefertbaseValNullwerte; ältere Browser gaben teilsnullzurück. Prüfen Sie ggf. vorher mitsvg.hasAttribute('viewBox'). - Attributname: Das Attribut ist case-sensitiv –
viewBox, nichtviewbox. Bei in HTML eingebettetem SVG korrigiert der Parser dies, beisetAttributeauf percreateElement(stattcreateElementNS) erzeugten Elementen nicht. - Negative Werte: Negative
width/heightsind ungültig und deaktivieren die Darstellung;0blendet die Grafik aus. animValweicht nur bei SMIL-Animationen (<animate attributeName=\"viewBox\">) vonbaseValab. Die Eigenschaft wird von allen modernen Browsern unterstützt.