Signatur
Beschreibung
Die schreibgeschützte Eigenschaft animVal der Schnittstelle SVGAnimatedRect gibt den aktuell wirksamen Wert des viewBox-Attributs zurück. Wenn eine SMIL-Animation (z. B. <animate attributeName="viewBox">) läuft, enthält animVal den Zwischenwert zum jetzigen Zeitpunkt. Ohne Animation stimmt er mit baseVal überein.
Man erreicht die Eigenschaft über element.viewBox.animVal. Das gilt für alle Elemente, die ein viewBox-Attribut unterstützen: <svg>, <symbol>, <marker>, <pattern> und <view>. Das zurückgegebene Objekt hat die Eigenschaften x, y, width und height in Benutzereinheiten.
Einsatzgebiete sind vor allem das Auslesen des sichtbaren Koordinatenbereichs, etwa um Mauskoordinaten in SVG-Koordinaten umzurechnen, um den Fortschritt einer Zoom- oder Schwenk-Animation zu verfolgen oder um Abmessungen für Berechnungen zu bestimmen. Wenn du den Wert ändern willst, nimm baseVal oder setAttribute('viewBox', …).
Rückgabewert
x, y, width und height, das den aktuell (animiert) wirksamen viewBox beschreibt. Ist kein viewBox-Attribut gesetzt, liefern manche Browser null (z. B. Firefox), andere ein Rechteck mit lauter Nullen.Beispiele
viewBox eines SVG-Elements 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.animVal;
console.log(x, y, width, height);
Animierten viewBox während einer SMIL-Animation beobachten
document.body.insertAdjacentHTML('beforeend', `
<svg id="karte" viewBox="0 0 400 400" width="200" height="200">
<circle cx="200" cy="200" r="50" fill="tomato" />
<animate attributeName="viewBox" from="0 0 400 400" to="150 150 100 100"
dur="2s" fill="freeze" />
</svg>`);
const karte = document.getElementById('karte');
const protokolliere = () => {
const base = karte.viewBox.baseVal;
const anim = karte.viewBox.animVal;
console.log(`Basis: ${base.width} | Animiert: ${anim.width.toFixed(1)}`);
};
const timer = setInterval(protokolliere, 500);
setTimeout(() => clearInterval(timer), 2500);
Mausposition in viewBox-Koordinaten umrechnen
const svg = document.querySelector('svg');
svg.addEventListener('click', (event) => {
const vb = svg.viewBox.animVal;
const rect = svg.getBoundingClientRect();
// Einfache Umrechnung (ohne preserveAspectRatio-Letterboxing)
const svgX = vb.x + ((event.clientX - rect.left) / rect.width) * vb.width;
const svgY = vb.y + ((event.clientY - rect.top) / rect.height) * vb.height;
console.log(`SVG-Koordinaten: ${svgX.toFixed(1)}, ${svgY.toFixed(1)}`);
});
Schreibversuch schlägt fehl – baseVal verwenden
const svg = document.querySelector('svg[viewBox]');
try {
svg.viewBox.animVal.width = 500; // schreibgeschützt
} catch (err) {
console.log(err.name);
}
// Richtig: Basiswert ändern
svg.viewBox.baseVal.width = 500;
console.log(svg.getAttribute('viewBox'));
// Wichtig · Fallstricke
- Schreibgeschützt: Sowohl die Eigenschaft als auch das zurückgegebene Rechteck lassen sich nicht ändern. Zuweisungen an
animVal.xusw. lösen je nach Browser einenNoModificationAllowedErroraus oder werden stillschweigend ignoriert (im nicht-strikten Modus). Für Änderungen gibt esbaseVal. - Fehlendes Attribut: Ohne
viewBox-Attribut unterscheiden sich die Browser: Firefox gibtnullzurück, Chromium und WebKit ein Rechteck mit0 0 0 0. Prüfe deshalb vorher mitelement.hasAttribute('viewBox'). - Nur SMIL:
animValspiegelt nur SMIL-Animationen wider. Änderungen über CSS-Animationen, die Web Animations API oder JavaScript-Zeitsteuerung am Attribut erscheinen stattdessen direkt inbaseVal. - Live-Objekt: In den meisten Browsern ist das zurückgegebene Objekt „live“. Willst du einen festen Zwischenstand behalten, kopiere die Werte (z. B. per Destrukturierung).
- Typ: In SVG 1.1 war der Typ
SVGRect, in SVG 2 heißt erDOMRectReadOnly. Die Eigenschaften sind in beiden Fällen dieselben. - Kompatibilität: Wird seit Langem von allen modernen Browsern unterstützt. Das Umrechnungsbeispiel oben berücksichtigt
preserveAspectRationicht. Genauer istgetScreenCTM().inverse().