Start · Sprachen · JavaScript · Referenz · SVGLineElement.y2

SVGLineElement.y2

Eigenschaft

Schreibgeschützte Eigenschaft, die die y-Koordinate des Endpunkts einer SVG-Linie (<code>&lt;line&gt;</code>) als <code>SVGAnimatedLength</code> liefert.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

SVGLineElement.y2

Beschreibung

Die Eigenschaft y2 des Interfaces SVGLineElement entspricht dem Attribut y2 eines <line>-Elements und gibt die y-Koordinate des Endpunkts der Linie an. Zurückgegeben wird kein Zahlenwert, sondern ein SVGAnimatedLength-Objekt.

Dieses Objekt hat zwei Eigenschaften: baseVal steht für den im Attribut gesetzten Grundwert und lässt sich beschreiben. animVal steht für den aktuell angezeigten Wert, also gegebenenfalls unter Einfluss einer SMIL-Animation wie <animate>, und kann nur gelesen werden. Beide sind vom Typ SVGLength und bieten unter anderem value (in Benutzereinheiten), valueInSpecifiedUnits, unitType und convertToSpecifiedUnits().

„Schreibgeschützt“ heißt hier nur, dass man die Eigenschaft y2 selbst nicht durch ein anderes Objekt ersetzen kann. Den Wert ändert man über line.y2.baseVal.value oder über setAttribute('y2', …). Die Eigenschaft ist nützlich für Diagramme, Verbindungslinien, Zeiger oder interaktive Zeichenwerkzeuge, bei denen Endpunkte per Skript berechnet oder ausgelesen werden.

Rückgabewert

Typ
SVGAnimatedLength
Beschreibung
Ein Objekt, dessen baseVal (beschreibbar) und animVal (schreibgeschützt) jeweils ein SVGLength mit der y-Koordinate des Endpunkts enthalten. Fehlt das Attribut, ist der Wert 0.

Beispiele

Endpunkt einer Linie auslesen

// HTML: <svg width="200" height="100"><line id="l" x1="10" y1="10" x2="190" y2="80" stroke="black"/></svg>
const line = document.getElementById('l');
console.log(line.y2.baseVal.value);
console.log(line.y2.baseVal.unitType === SVGLength.SVG_LENGTHTYPE_NUMBER);
80 true

Linie per Skript erzeugen und Endpunkt setzen

const SVG_NS = 'http://www.w3.org/2000/svg';
const svg = document.querySelector('svg');
const line = document.createElementNS(SVG_NS, 'line');
line.setAttribute('stroke', 'tomato');
line.x1.baseVal.value = 0;
line.y1.baseVal.value = 0;
line.x2.baseVal.value = 150;
line.y2.baseVal.value = 60; // entspricht setAttribute('y2', '60')
svg.append(line);
console.log(line.getAttribute('y2'));
60

Linie folgt dem Mauszeiger

const svg = document.querySelector('svg');
const line = svg.querySelector('line');

svg.addEventListener('pointermove', (event) => {
  // Bildschirmkoordinaten in SVG-Benutzerkoordinaten umrechnen
  const pt = new DOMPoint(event.clientX, event.clientY)
    .matrixTransform(svg.getScreenCTM().inverse());
  line.x2.baseVal.value = pt.x;
  line.y2.baseVal.value = pt.y;
});

Einheiten umrechnen und animVal lesen

// <line id="p" x1="0" y1="0" x2="100" y2="50%" stroke="blue"/>
const line = document.getElementById('p');
const len = line.y2.baseVal;
console.log(len.unitType === SVGLength.SVG_LENGTHTYPE_PERCENTAGE); // true
console.log(len.valueInSpecifiedUnits); // 50
len.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX);
console.log(line.getAttribute('y2')); // z. B. "50px" bei 100px Höhe
console.log(line.y2.animVal.value); // aktuell angezeigter Wert
true 50 50px 50

// Wichtig · Fallstricke

  • Kein Zahlenwert: line.y2 liefert ein Objekt. Eine Zuweisung wie line.y2 = 50 bleibt wirkungslos, im Strict Mode wirft sie einen TypeError. Richtig ist line.y2.baseVal.value = 50.
  • animVal kann nur gelesen werden: Wer darauf schreibt, löst einen Fehler aus. Während einer SMIL-Animation können baseVal und animVal unterschiedliche Werte haben.
  • Prozentwerte beziehen sich auf die Höhe des Viewports. value gibt dann den umgerechneten Wert in Benutzereinheiten zurück. Ob das klappt, hängt vom Layout ab: Bei Elementen, die nicht im Dokument eingehängt sind, kann das Ergebnis 0 sein.
  • CSS-Eigenschaft: In SVG 2 ist y2 keine geometrische CSS-Eigenschaft wie cx bei Kreisen. Man kann sie also nicht per Stylesheet setzen, sondern nur über das Attribut oder das DOM.
  • Namespace: Dynamisch erzeugte Linien müssen mit document.createElementNS('http://www.w3.org/2000/svg', 'line') angelegt werden. Nur dann entsteht ein echtes SVGLineElement mit der Eigenschaft y2.
  • Die Eigenschaft wird von allen modernen Browsern unterstützt, in Node.js jedoch nur mit DOM-Implementierungen wie jsdom, und dort auch nur eingeschränkt.