Start · Sprachen · JavaScript · Referenz · SVGElement.viewportElement

SVGElement.viewportElement

Eigenschaft

Gibt das <code>SVGElement</code> zurück, das den aktuellen Viewport des Elements festlegt – meist das nächste umgebende <code>&lt;svg&gt;</code>. Beim äußersten <code>&lt;svg&gt;</code> ist der Wert <code>null</code>.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

get SVGElement.viewportElement

Beschreibung

Die schreibgeschützte Eigenschaft viewportElement liefert das Element, das den Viewport (Ansichtsbereich) des aktuellen SVG-Elements festlegt. Ein Viewport ist das Rechteck, in dem gezeichnet wird. Er bestimmt, worauf sich Prozentwerte wie width="50%" beziehen und in welches Koordinatensystem viewBox und preserveAspectRatio abgebildet werden.

In den meisten Fällen ist das Ergebnis das nächste umgebende <svg>-Element. Das gilt auch für verschachtelte <svg>-Elemente innerhalb eines SVG-Dokuments. Beim äußersten <svg> gibt die Eigenschaft null zurück, weil dessen Viewport vom einbettenden Kontext kommt, also vom HTML-Layout oder vom Browserfenster.

Die Eigenschaft ist nützlich, wenn du Prozentangaben selbst in Pixel umrechnen willst, Koordinaten relativ zum richtigen Bezugssystem brauchst oder in Werkzeugen wie Editoren oder Inspektoren die Viewport-Hierarchie eines Elements nachverfolgen willst. Sie unterscheidet sich von ownerSVGElement: Beide zeigen oft auf dasselbe <svg>. Laut Spezifikation beschreibt viewportElement aber ausdrücklich das Element, das den Viewport festlegt, und nicht bloß den nächsten <svg>-Vorfahren.

Rückgabewert

Typ
SVGElement | null
Beschreibung
Das Element, das den Viewport festlegt (meist ein SVGSVGElement), oder null beim äußersten <svg> und bei Elementen ohne passenden Vorfahren (z. B. wenn das Element noch nicht eingehängt ist).

Beispiele

Viewport eines Kreises ermitteln

// HTML:
// <svg id="root" width="300" height="200">
//   <circle id="c" cx="50" cy="50" r="20" />
// </svg>
const circle = document.getElementById('c');
const root = document.getElementById('root');

console.log(circle.viewportElement === root);
console.log(root.viewportElement);
true null

Verschachtelte <svg>-Elemente

// HTML:
// <svg id="outer" width="400" height="300">
//   <svg id="inner" x="50" y="50" width="200" height="100">
//     <rect id="r" width="50%" height="50%" />
//   </svg>
// </svg>
const rect = document.getElementById('r');

console.log(rect.viewportElement.id);
console.log(rect.viewportElement.viewportElement.id);
console.log(rect.viewportElement.viewportElement.viewportElement);
inner outer null

Prozentangaben in Pixel umrechnen

// Löst width="50%" gegen den tatsächlichen Viewport auf
const resolveWidth = (el) => {
  const vp = el.viewportElement;
  if (!vp) return null;
  const vpWidth = vp.width.baseVal.value; // SVGAnimatedLength
  const len = el.width.baseVal;
  return len.unitType === SVGLength.SVG_LENGTHTYPE_PERCENTAGE
    ? (len.valueInSpecifiedUnits / 100) * vpWidth
    : len.value;
};

const rect = document.getElementById('r');
console.log(`Breite: ${resolveWidth(rect)}px`);
Breite: 100px

Viewport-Kette für Debugging ausgeben

const viewportChain = (el) => {
  const chain = [];
  let vp = el.viewportElement;
  while (vp) {
    chain.push(vp.id || vp.tagName);
    vp = vp.viewportElement;
  }
  return chain;
};

console.log(viewportChain(document.getElementById('r')));
["inner", "outer"]

// Wichtig · Fallstricke

  • Nur lesbar: Wenn du der Eigenschaft einen Wert zuweist, wird das ignoriert. Im Strict Mode wirft die Zuweisung einen TypeError.
  • null-Fälle: Das äußerste <svg> und Elemente, die noch nicht in ein <svg> eingehängt sind (z. B. direkt nach document.createElementNS()), liefern null. Prüfe den Wert deshalb immer, bevor du auf .width o. Ä. zugreifst.
  • Abgrenzung zu ownerSVGElement: In typischem Markup zeigen beide auf dasselbe Element. Bei Inhalten von <symbol>, die über <use> instanziiert werden, können sich die Werte je nach Browser unterscheiden, denn die Instanzen liegen im Shadow Tree.
  • Pixel-Koordinaten: Für echte Bildschirmkoordinaten nutze besser getScreenCTM() oder getBoundingClientRect(). viewportElement liefert nur das Bezugselement und berücksichtigt keine Transformationen.
  • Kompatibilität: Wird von allen modernen Browsern unterstützt (Chrome, Firefox, Safari, Edge). Die Eigenschaft gibt es nur an SVG-Elementen, nicht an HTML-Elementen.