Start · Sprachen · JavaScript · Referenz · SVGStopElement.offset

SVGStopElement.offset

Eigenschaft

Liefert ein schreibgeschütztes <code>SVGAnimatedNumber</code>-Objekt, das das <code>offset</code>-Attribut eines <code>&lt;stop&gt;</code>-Elements in einem SVG-Farbverlauf widerspiegelt.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

SVGStopElement.offset

Beschreibung

Die Eigenschaft offset des SVGStopElement steht für das Attribut offset eines <stop>-Elements. Dieses Attribut legt fest, an welcher Stelle eines <linearGradient> oder <radialGradient> ein Farbstopp liegt. Der Wert reicht von 0 (Anfang des Verlaufs) bis 1 (Ende).

Zurückgegeben wird kein einfacher Zahlenwert, sondern ein SVGAnimatedNumber-Objekt. Über offset.baseVal liest und setzt man den im Attribut hinterlegten Grundwert. offset.animVal liefert den aktuellen Wert, also einschließlich einer möglichen SMIL-Animation (z. B. über <animate attributeName="offset">), und lässt sich nur lesen.

Steht im Attribut ein Prozentwert wie offset="50%", wird er in eine Zahl umgerechnet: baseVal liefert dann 0.5. Die Eigenschaft eignet sich gut für dynamische Verläufe, etwa Fortschrittsbalken, Hover-Effekte oder Diagramme, bei denen sich die Farbstopps mit JavaScript verschieben lassen, ohne dass man Attribut-Strings selbst zusammensetzen muss.

Rückgabewert

Typ
SVGAnimatedNumber
Beschreibung
Ein Objekt mit baseVal (number, les- und schreibbar, entspricht dem Attribut) und animVal (number, nur lesbar, aktueller animierter Wert). Der Wert ist eine Zahl, die normalerweise zwischen 0 und 1 liegt.

Beispiele

Offset eines Farbstopps auslesen

// <svg><defs><linearGradient id="verlauf">
//   <stop offset="0" stop-color="gold"/>
//   <stop offset="75%" stop-color="crimson"/>
// </linearGradient></defs></svg>
const stops = document.querySelectorAll('#verlauf stop');

stops.forEach((stop, i) => {
  console.log(`Stopp ${i}: ${stop.offset.baseVal}`);
});
Stopp 0: 0 Stopp 1: 0.75

Fortschrittsbalken mit hartem Farbübergang

// Zwei Stopps an derselben Position erzeugen eine scharfe Kante
const [fillEnd, emptyStart] = document.querySelectorAll('#progress stop.edge');

const setProgress = (percent) => {
  const value = Math.min(Math.max(percent / 100, 0), 1);
  fillEnd.offset.baseVal = value;
  emptyStart.offset.baseVal = value;
};

setProgress(42);
console.log(fillEnd.getAttribute('offset'));
0.42

Stopp neu anlegen und positionieren

const SVG_NS = 'http://www.w3.org/2000/svg';
const gradient = document.querySelector('#verlauf');

const stop = document.createElementNS(SVG_NS, 'stop');
stop.setAttribute('stop-color', 'royalblue');
stop.offset.baseVal = 0.5; // entspricht offset="0.5"
gradient.append(stop);

console.log(stop instanceof SVGStopElement, stop.offset.animVal);
true 0.5

Animierten Wert mit dem Grundwert vergleichen

// <stop id="s" offset="0.2" stop-color="teal">
//   <animate attributeName="offset" from="0.2" to="0.8" dur="2s" repeatCount="indefinite"/>
// </stop>
const stop = document.getElementById('s');

setInterval(() => {
  const { baseVal, animVal } = stop.offset;
  console.log(`Basis: ${baseVal}, aktuell: ${animVal.toFixed(2)}`);
}, 500);
Basis: 0.2, aktuell: 0.35 Basis: 0.2, aktuell: 0.50 …

// Wichtig · Fallstricke

  • Schreibgeschützt heißt hier: Die Eigenschaft offset selbst lässt sich nicht neu zuweisen. stop.offset = 0.5 hat keine Wirkung und wirft im Strict Mode einen TypeError. Schreiben Sie stattdessen stop.offset.baseVal = 0.5.
  • Prozentwerte: baseVal gibt immer einen Bruchteil zurück ("30%" wird zu 0.3). Setzen Sie baseVal, schreibt der Browser eine reine Zahl ins Attribut, nicht die Prozentform.
  • Wertebereich: Werte unter 0 oder über 1 werden beim Zeichnen auf den Bereich 0–1 begrenzt. Ist ein Offset kleiner als der des vorherigen Stopps, wird er beim Zeichnen auf diesen Wert angehoben. Begrenzen Sie die Werte am besten schon im eigenen Code.
  • CSS kann den Wert nicht ändern: offset ist keine CSS-Eigenschaft. Anders als stop-color und stop-opacity lässt es sich weder per Stylesheet setzen noch mit CSS-Transitions animieren. Möglich sind nur SMIL oder JavaScript, etwa mit requestAnimationFrame.
  • Namensraum: Dynamisch erzeugte Stopps müssen mit document.createElementNS('http://www.w3.org/2000/svg', 'stop') angelegt werden. createElement('stop') erzeugt kein SVGStopElement, und offset ist dann undefined.
  • Kompatibilität: Wird von allen aktuellen Browsern seit Langem unterstützt. In Node.js gibt es sie nur mit einer DOM-Umgebung wie jsdom, und dort ist die SVG-Unterstützung teilweise lückenhaft.