Signatur
Beschreibung
Die Eigenschaft gradientTransform der Schnittstelle SVGGradientElement gibt Zugriff auf die Transformationen, die auf das Koordinatensystem eines Farbverlaufs angewendet werden. Sie spiegelt das SVG-Attribut gradientTransform wider, also z. B. rotate(45), scale(2) oder translate(10, 20). So lässt sich ein Verlauf drehen, verzerren oder verschieben, ohne die Geometrie der gefüllten Form selbst zu ändern.
Schreibgeschützt ist nur die Eigenschaft selbst: Man kann ihr kein neues Objekt zuweisen. Das zurückgegebene SVGAnimatedTransformList hat aber zwei Listen: baseVal (der statische, veränderbare Attributwert) und animVal (der aktuelle, ggf. durch SMIL-Animation veränderte Wert, nur lesbar). Über baseVal kann man mit Methoden wie appendItem(), clear(), getItem() oder consolidate() die Transformationen gezielt bearbeiten.
Typische Anwendungsfälle sind interaktive Visualisierungen, bei denen ein Verlauf abhängig von Mausposition oder Zeit rotiert, sowie das Auslesen bestehender Transformationen, etwa um sie in eine Matrix umzurechnen. Neue SVGTransform-Objekte erzeugt man über SVGSVGElement.createSVGTransform() am Wurzel-<svg>-Element.
Rückgabewert
baseVal (veränderbare SVGTransformList des Attributwerts) und animVal (schreibgeschützte SVGTransformList des animierten Werts).Beispiele
Vorhandene Transformationen auslesen
// <svg><defs><linearGradient id="verlauf" gradientTransform="rotate(45) scale(1.5)">...</linearGradient></defs></svg>
const gradient = document.getElementById('verlauf');
const liste = gradient.gradientTransform.baseVal;
for (let i = 0; i < liste.numberOfItems; i++) {
const t = liste.getItem(i);
// type: 4 = SVG_TRANSFORM_ROTATE, 3 = SVG_TRANSFORM_SCALE
console.log(t.type, t.angle, t.matrix.a.toFixed(3));
}
Verlauf per Skript drehen
const svg = document.querySelector('svg');
const gradient = document.getElementById('verlauf');
const drehung = svg.createSVGTransform();
drehung.setRotate(30, 0.5, 0.5); // 30° um die Mitte (objectBoundingBox)
const liste = gradient.gradientTransform.baseVal;
liste.clear();
liste.appendItem(drehung);
console.log(gradient.getAttribute('gradientTransform'));
Animierter Verlauf mit requestAnimationFrame
const svg = document.querySelector('svg');
const gradient = document.getElementById('verlauf');
const drehung = svg.createSVGTransform();
gradient.gradientTransform.baseVal.initialize(drehung);
const animieren = (zeit) => {
const winkel = (zeit / 20) % 360;
// Dasselbe SVGTransform-Objekt ist live mit dem Attribut verbunden
drehung.setRotate(winkel, 0.5, 0.5);
requestAnimationFrame(animieren);
};
requestAnimationFrame(animieren);
Alle Transformationen zu einer Matrix zusammenfassen
const gradient = document.getElementById('verlauf');
const liste = gradient.gradientTransform.baseVal;
// consolidate() fasst alle Einträge zu einer Matrix zusammen
const gesamt = liste.consolidate();
if (gesamt) {
const { a, b, c, d, e, f } = gesamt.matrix;
console.log(`matrix(${[a, b, c, d, e, f].map(n => n.toFixed(2)).join(' ')})`);
} else {
console.log('Keine Transformation gesetzt');
}
// Wichtig · Fallstricke
- Keine Zuweisung:
gradient.gradientTransform = ...wird ignoriert (im Strict ModeTypeError). Änderungen immer überbaseValoder persetAttribute('gradientTransform', '...')vornehmen. animValist schreibgeschützt; Änderungsversuche werfen eineNoModificationAllowedError-DOMException.- Die Wirkung hängt von
gradientUnitsab: BeiobjectBoundingBox(Standard) beziehen sich Werte wie Drehzentren auf den Bereich 0–1, beiuserSpaceOnUseauf Benutzerkoordinaten. consolidate()ersetzt die Liste durch eine einzige Matrix-Transformation – die ursprünglichen Typen (rotate,scale) gehen dabei verloren.- CSS-
transformwirkt nicht auf Verläufe; nur das AttributgradientTransformtransformiert den Farbverlauf. - Kompatibilität: In allen modernen Browsern seit Langem unterstützt. SVG 2 erlaubt zusätzlich die CSS-Transform-Syntax im Attribut, die Unterstützung dafür variiert jedoch.