Signatur
Beschreibung
SVGGradientElement ist die gemeinsame Basis der Interfaces SVGLinearGradientElement (<linearGradient>) und SVGRadialGradientElement (<radialGradient>). Instanzen des Interfaces selbst erzeugt man nie direkt. Man bekommt immer eines der beiden konkreten Elemente, die alle hier definierten Eigenschaften erben.
Das Interface stellt drei animierbare Eigenschaften bereit:
gradientUnits(SVGAnimatedEnumeration): Koordinatensystem des Verlaufs, entwederuserSpaceOnUseoderobjectBoundingBox.gradientTransform(SVGAnimatedTransformList): zusätzliche Transformationen, zum Beispiel eine Drehung des Verlaufs.spreadMethod(SVGAnimatedEnumeration): legt fest, was außerhalb des Verlaufsbereichs passiert (pad,reflectoderrepeat).
Über SVGURIReference kommt außerdem href hinzu. Damit kann ein Verlauf die Stopps und Attribute eines anderen Verlaufs übernehmen. Die numerischen Konstanten SVG_SPREADMETHOD_UNKNOWN (0), SVG_SPREADMETHOD_PAD (1), SVG_SPREADMETHOD_REFLECT (2) und SVG_SPREADMETHOD_REPEAT (3) stehen direkt am Interface zur Verfügung.
Das Interface braucht man, wenn man Verläufe per Skript liest oder dynamisch verändert, etwa für Themes, Diagramme oder Animationen. Mit instanceof SVGGradientElement lassen sich außerdem beide Verlaufsarten mit einer einzigen Prüfung erkennen.
Rückgabewert
SVGLinearGradientElement oder SVGRadialGradientElement.Beispiele
Verlauf per Skript erzeugen (Instanziierung über createElementNS)
const SVG_NS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(SVG_NS, 'svg');
svg.setAttribute('width', '200');
svg.setAttribute('height', '100');
const defs = document.createElementNS(SVG_NS, 'defs');
const grad = document.createElementNS(SVG_NS, 'linearGradient');
grad.id = 'blauVerlauf';
[['0%', '#0af'], ['100%', '#004']].forEach(([offset, color]) => {
const stop = document.createElementNS(SVG_NS, 'stop');
stop.setAttribute('offset', offset);
stop.setAttribute('stop-color', color);
grad.append(stop);
});
defs.append(grad);
const rect = document.createElementNS(SVG_NS, 'rect');
rect.setAttribute('width', '200');
rect.setAttribute('height', '100');
rect.setAttribute('fill', 'url(#blauVerlauf)');
svg.append(defs, rect);
document.body.append(svg);
console.log(grad instanceof SVGGradientElement);
console.log(grad instanceof SVGLinearGradientElement);
spreadMethod lesen und auf „reflect“ umstellen
const grad = document.querySelector('#blauVerlauf');
const namen = ['unknown', 'pad', 'reflect', 'repeat'];
console.log('Vorher:', namen[grad.spreadMethod.baseVal]);
// Zuweisung über die Konstante am Interface
grad.spreadMethod.baseVal = SVGGradientElement.SVG_SPREADMETHOD_REFLECT;
// Gleichwertig: grad.setAttribute('spreadMethod', 'reflect');
console.log('Nachher:', namen[grad.spreadMethod.baseVal]);
console.log(grad.getAttribute('spreadMethod'));
Verlauf drehen über gradientTransform
const svg = document.querySelector('svg');
const grad = document.querySelector('#blauVerlauf');
const rotation = svg.createSVGTransform();
rotation.setRotate(45, 0.5, 0.5);
const liste = grad.gradientTransform.baseVal;
liste.clear();
liste.appendItem(rotation);
console.log(grad.getAttribute('gradientTransform'));
console.log(grad.gradientUnits.baseVal === SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
Alle Verläufe eines Dokuments einheitlich behandeln
const verlaeufe = [...document.querySelectorAll('linearGradient, radialGradient')]
.filter((el) => el instanceof SVGGradientElement);
verlaeufe.forEach((g) => {
g.setAttribute('spreadMethod', 'repeat');
console.log(g.id, g.constructor.name, g.stops?.length ?? g.querySelectorAll('stop').length);
});
// Wichtig · Fallstricke
- Namensraum: SVG-Elemente müssen mit
document.createElementNS('http://www.w3.org/2000/svg', …)erzeugt werden.document.createElement('linearGradient')liefert nur einHTMLUnknownElement, das nicht als Verlauf funktioniert. - Nur Lesezugriff auf das Objekt:
gradientUnits,spreadMethodundgradientTransformsind animierte Objekte, keine einfachen Strings. Ändern lassen sie sich über.baseVal. Den aktuellen, eventuell per SMIL animierten Wert liefert.animVal. - Standardwerte: Ohne Attribut gelten
gradientUnits="objectBoundingBox"undspreadMethod="pad". BeiobjectBoundingBoxbeziehen sich Koordinaten auf den Bereich 0–1 des gefüllten Elements, und ein Transformationszentrum liegt entsprechend bei0.5 0.5. - href-Vererbung: Enthält ein Verlauf keine eigenen
<stop>-Elemente, übernimmt er die Stopps des Verlaufs, auf denhrefverweist. Das älterexlink:hrefist veraltet, wird aber weiterhin unterstützt. - Doppelte IDs: Verweise wie
fill="url(#id)"gelten für das ganze Dokument. Sind mehrere Inline-SVGs mit gleicher ID eingebunden, wird der erste Treffer verwendet. - Kompatibilität: Wird in allen modernen Browsern unterstützt. Nur wenige, ältere Engines setzen
spreadMethodmitreflect/repeatbei radialen Verläufen nicht zuverlässig um.