Start · Sprachen · JavaScript · Referenz · SVGMarkerElement.refY

SVGMarkerElement.refY

Eigenschaft

Liefert ein <code>SVGAnimatedLength</code>-Objekt mit dem Wert des <code>refY</code>-Attributs eines <code>&lt;marker&gt;</code>-Elements, also der y-Koordinate des Referenzpunkts.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

get SVGMarkerElement.refY

Beschreibung

Die schreibgeschützte Eigenschaft refY der Schnittstelle SVGMarkerElement gibt ein SVGAnimatedLength-Objekt zurück. Es spiegelt das Attribut refY des <marker>-Elements wider. Dieses Attribut legt die y-Koordinate des Referenzpunkts fest. Der Referenzpunkt ist die Stelle im Marker, die genau auf dem Scheitelpunkt des Pfads liegt, also am Anfang, in der Mitte oder am Ende einer Linie.

Die Koordinate bezieht sich auf das Koordinatensystem des Markerinhalts, nachdem viewBox und preserveAspectRatio angewendet wurden. Ist das Attribut nicht gesetzt, gilt der Wert 0.

Das zurückgegebene Objekt hat zwei Eigenschaften mit je einem SVGLength: baseVal enthält den statischen Attributwert und lässt sich verändern. animVal enthält den aktuellen Wert, der durch eine SMIL-Animation verändert sein kann, und ist nur lesbar. Die Eigenschaft refY selbst kannst du nicht neu zuweisen. Um den Referenzpunkt per Skript zu ändern, setzt du refY.baseVal.value oder verwendest setAttribute('refY', …).

In der Praxis brauchst du refY vor allem, um Pfeilspitzen oder andere Marker genau auf der Linie auszurichten, meist mittig zur Strichbreite. Zusammen mit refX kannst du den Ankerpunkt so dynamisch anpassen.

Rückgabewert

Typ
SVGAnimatedLength
Beschreibung
Ein Objekt mit baseVal (veränderbares SVGLength, entspricht dem Attributwert) und animVal (nur lesbares SVGLength mit dem aktuellen, eventuell animierten Wert).

Beispiele

refY eines Pfeil-Markers auslesen

// HTML:
// <svg width="200" height="60">
//   <defs>
//     <marker id="pfeil" viewBox="0 0 10 10" refX="10" refY="5"
//             markerWidth="6" markerHeight="6" orient="auto">
//       <path d="M0,0 L10,5 L0,10 z" />
//     </marker>
//   </defs>
//   <line x1="10" y1="30" x2="180" y2="30" stroke="black" marker-end="url(#pfeil)" />
// </svg>

const marker = document.getElementById('pfeil');
const { baseVal, animVal } = marker.refY;

console.log(baseVal.value);      // Zahlenwert
console.log(baseVal.unitType === SVGLength.SVG_LENGTHTYPE_NUMBER);
console.log(animVal.value);
5 true 5

Referenzpunkt dynamisch verschieben

const marker = document.querySelector('#pfeil');

// Marker mittig ausrichten: halbe viewBox-Höhe
const vbHeight = marker.viewBox.baseVal.height;
marker.refY.baseVal.value = vbHeight / 2;

console.log(marker.getAttribute('refY'));
5

Wert mit Einheit setzen und Standardwert prüfen

const svgNS = 'http://www.w3.org/2000/svg';
const marker = document.createElementNS(svgNS, 'marker');

// Ohne Attribut gilt der Standardwert 0
console.log(marker.refY.baseVal.value);

// Wert als String mit Einheit setzen
marker.refY.baseVal.valueAsString = '2.5';
console.log(marker.getAttribute('refY'));

// Direkte Zuweisung an refY schlägt fehl (nur Getter)
marker.refY = 10; // im Strict Mode: TypeError
console.log(marker.refY instanceof SVGAnimatedLength);
0 2.5 true

// Wichtig · Fallstricke

  • Nur lesbar: marker.refY = 5 hat keine Wirkung. Im Strict Mode (z. B. in ES-Modulen) wirft die Zuweisung einen TypeError. Ändere stattdessen refY.baseVal.value oder das Attribut.
  • animVal ist nur lesbar: Schreibst du in animVal, wirft der Browser eine DOMException (NoModificationAllowedError).
  • Koordinatensystem: refY bezieht sich auf den Inhalt des Markers nach Anwendung der viewBox, nicht auf das Koordinatensystem der Linie. Ohne viewBox gelten die Einheiten von markerUnits (Standard: strokeWidth).
  • Schlüsselwörter: SVG 2 erlaubt für refY auch top, center und bottom. Die Browser unterstützen das unterschiedlich, und baseVal.value liefert dann eventuell nicht den erwarteten Wert.
  • Groß-/Kleinschreibung: Der Attributname lautet refY mit großem Y. getAttribute('refy') findet in SVG-Dokumenten nichts.
  • Kompatibilität: Wird von allen modernen Browsern unterstützt (Chrome, Firefox, Safari, Edge).