Signatur
Beschreibung
SVGFEDropShadowElement ist die DOM-Schnittstelle des Elements <feDropShadow> innerhalb eines <filter>. Das Primitiv fasst die klassische Kette feGaussianBlur → feOffset → feFlood → feComposite → feMerge in einem einzigen Element zusammen. Das Ergebnis ist die Eingabegrafik mit einem darunterliegenden Schatten.
Die Schnittstelle erbt von SVGElement und bindet die Standardattribute für Filterprimitive ein (x, y, width, height, result). Dazu kommen diese spezifischen Eigenschaften, alle nur lesbar und animierbar:
in1(SVGAnimatedString): entspricht dem Attributin, also der Eingabe des Primitivs, z. B.SourceGraphic.dx,dy(SVGAnimatedNumber): horizontaler und vertikaler Versatz des Schattens. Standardwert ist jeweils2.stdDeviationX,stdDeviationY(SVGAnimatedNumber): Stärke der Weichzeichnung (Standardabweichung) je Achse. Standardwert ist2.- Methode
setStdDeviation(stdDeviationX, stdDeviationY): setzt beide Blur-Werte in einem Aufruf.
Die Schnittstelle ist nützlich, wenn du Schatten zur Laufzeit per JavaScript erzeugst oder änderst, etwa für Hover-Effekte, Themes oder Animationen. Einen eigenen Konstruktor gibt es nicht. Instanzen erzeugst du mit document.createElementNS('http://www.w3.org/2000/svg', 'feDropShadow'). Die aktuellen Werte liest und schreibst du über .baseVal. Mit .animVal liest du den Wert, der gerade durch eine SMIL-Animation gilt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $stdDeviationX Pflicht | number | Parameter von setStdDeviation(): Weichzeichnung in x-Richtung, in Einheiten des Filterkoordinatensystems. Negative Werte sind ein Fehler, 0 schaltet die Weichzeichnung ab. |
|
| $stdDeviationY Pflicht | number | Parameter von setStdDeviation(): Weichzeichnung in y-Richtung. |
Beispiele
Schatten-Filter per JavaScript erzeugen und anwenden
const SVG_NS = 'http://www.w3.org/2000/svg';
const svg = document.querySelector('svg');
// <defs><filter id="schatten"><feDropShadow .../></filter></defs>
const defs = document.createElementNS(SVG_NS, 'defs');
const filter = document.createElementNS(SVG_NS, 'filter');
filter.id = 'schatten';
const shadow = document.createElementNS(SVG_NS, 'feDropShadow');
shadow.setAttribute('dx', '4');
shadow.setAttribute('dy', '4');
shadow.setAttribute('stdDeviation', '3');
shadow.setAttribute('flood-color', '#000');
shadow.setAttribute('flood-opacity', '0.4');
filter.append(shadow);
defs.append(filter);
svg.prepend(defs);
svg.querySelector('rect').setAttribute('filter', 'url(#schatten)');
console.log(shadow instanceof SVGFEDropShadowElement);
Werte über die animierten Eigenschaften lesen und ändern
const shadow = document.querySelector('#schatten feDropShadow');
console.log(shadow.dx.baseVal, shadow.dy.baseVal);
console.log(shadow.stdDeviationX.baseVal, shadow.stdDeviationY.baseVal);
console.log(shadow.in1.baseVal || '(leer = Ergebnis des vorherigen Primitivs)');
// Versatz ändern
shadow.dx.baseVal = 8;
shadow.dy.baseVal = 6;
// Beide Blur-Werte in einem Aufruf setzen
shadow.setStdDeviation(5, 5);
console.log(shadow.getAttribute('stdDeviation'));
Karte beim Hover „anheben“
const card = document.querySelector('#karte');
const shadow = document.querySelector('#schatten feDropShadow');
const setDepth = (depth) => {
shadow.dy.baseVal = depth;
shadow.setStdDeviation(depth * 0.8, depth * 0.8);
shadow.setAttribute('flood-opacity', String(0.2 + depth * 0.03));
};
card.addEventListener('mouseenter', () => setDepth(10));
card.addEventListener('mouseleave', () => setDepth(3));
setDepth(3);
// Wichtig · Fallstricke
- Kein Konstruktor:
new SVGFEDropShadowElement()wirft einenTypeError. Verwende immercreateElementNSmit dem SVG-Namensraum. Ein Aufruf vondocument.createElement('feDropShadow')erzeugt nur ein unbekanntes HTML-Element. - Farbe und Deckkraft sind keine Eigenschaften der Schnittstelle.
flood-colorundflood-opacitysetzt du persetAttribute()oder CSS (shadow.style.floodColor). - Namensfalle: Das Attribut
inheißt in der Schnittstellein1, weilinin JavaScript ein reserviertes Wort ist. - Abgeschnittene Schatten: Die Filterregion ist standardmäßig nur 10 % größer als das Element. Bei großen
dx/dy- oder Blur-Werten vergrößerst du sie überx,y,widthundheightam<filter>. - Performance: Große
stdDeviation-Werte und Animationen in jedem Frame kosten viel Rechenzeit. Für reine HTML-Elemente ist CSSfilter: drop-shadow()oderbox-shadowoft effizienter. - Kompatibilität: Wird von allen aktuellen Browsern unterstützt, im Internet Explorer und im alten EdgeHTML-Edge jedoch nicht. Als Rückfall dient dort die Kette aus
feGaussianBlur,feOffsetundfeMerge.