Signatur
Beschreibung
Die Eigenschaft dx des Interfaces SVGFEOffsetElement gibt das dx-Attribut des zugehörigen <feOffset>-Filterprimitivs zurück. Dieses Attribut legt fest, um wie viele Einheiten das Eingabebild entlang der x-Achse verschoben wird. Positive Werte verschieben nach rechts, negative nach links.
Die Eigenschaft selbst ist schreibgeschützt: Man kann ihr kein neues Objekt zuweisen. Sie liefert aber ein SVGAnimatedNumber-Objekt, dessen Eigenschaft baseVal beschreibbar ist. Über baseVal lässt sich der Versatz also per Skript ändern, ohne setAttribute() zu verwenden. animVal enthält den aktuell wirksamen Wert, etwa während einer SMIL-Animation.
Typische Einsatzfälle sind dynamische Schlagschatten (<feOffset> kombiniert mit <feGaussianBlur> und <feMerge>), deren Richtung sich z. B. an die Mausposition oder an eine simulierte Lichtquelle anpasst. Der Wert wird in dem Koordinatensystem interpretiert, das über das Attribut primitiveUnits des umgebenden <filter> festgelegt wird. Standardmäßig ist das userSpaceOnUse.
Rückgabewert
baseVal (beschreibbar, der im Attribut gesetzte Wert als number) und animVal (schreibgeschützt, der aktuell wirksame Wert). Fehlt das Attribut, sind beide Werte 0.Beispiele
Horizontalen Versatz auslesen
document.body.insertAdjacentHTML('beforeend', `
<svg width="200" height="120">
<filter id="schatten">
<feOffset id="versatz" in="SourceAlpha" dx="6" dy="4" />
</filter>
</svg>`);
const offset = document.getElementById('versatz');
console.log(offset.dx instanceof SVGAnimatedNumber);
console.log(offset.dx.baseVal);
console.log(offset.dx.animVal);
Versatz per baseVal ändern
const offset = document.querySelector('feOffset');
// Nicht erlaubt: offset.dx = 10 (wird ignoriert bzw. wirft im Strict Mode einen Fehler)
offset.dx.baseVal = -8;
console.log(offset.getAttribute('dx'));
Schlagschatten folgt der Maus
document.body.insertAdjacentHTML('beforeend', `
<svg width="300" height="200">
<filter id="drop" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur in="SourceAlpha" stdDeviation="3" result="blur" />
<feOffset id="off" in="blur" dx="0" dy="0" result="shift" />
<feMerge>
<feMergeNode in="shift" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<rect x="100" y="60" width="100" height="80" fill="tomato" filter="url(#drop)" />
</svg>`);
const off = document.getElementById('off');
document.addEventListener('pointermove', ({ clientX, clientY }) => {
// Schatten fällt von der Maus weg, begrenzt auf ±12
const clamp = (v) => Math.max(-12, Math.min(12, v));
off.dx.baseVal = clamp((150 - clientX) / 10);
off.dy.baseVal = clamp((100 - clientY) / 10);
});
// Wichtig · Fallstricke
- Schreibschutz: Nur die Eigenschaft
dxselbst ist schreibgeschützt. Änderungen erfolgen überdx.baseVal.animValist ebenfalls nur lesbar. - Nicht mit anderen dx-Attributen verwechseln:
SVGTextPositioningElement.dx(bei<text>/<tspan>) liefert eineSVGAnimatedLengthList, keine einzelne Zahl. - Einheiten: Bei
primitiveUnits="objectBoundingBox"ist der Wert ein Anteil der Breite des Begrenzungsrahmens (z. B.0.1= 10 %). Große Werte wie10verschieben das Bild dann weit aus dem Filterbereich hinaus. - Filterbereich: Wird die Grafik über den Filterbereich hinaus verschoben (Standard: -10 %/120 %), schneidet der Browser sie ab. Vergrößern Sie in dem Fall
x/widtham<filter>. - Performance: Häufige Änderungen, etwa bei
pointermove, lösen jedes Mal eine Neuberechnung des Filters aus. Drosseln Sie die Aufrufe bei Bedarf mitrequestAnimationFrame. - Kompatibilität: Wird von allen modernen Browsern unterstützt. Für einfache Schatten ist die CSS-Funktion
drop-shadow()oft die schnellere Alternative.