CSS filter drop-shadow – Schlagschatten
Sowohl drop-shadow als auch box-shadow werfen einen Schatten »unter« ein Element. filter: drop-shadow() wird auf die sichtbaren Bereiche eines Elements angewendet und wirft einen Schlagschatten unter freigestellte Motive. box-shadow hält sich an das Box-Modell und legt einen Schatten um das vollständige Element.
drop-shadow vs box-shadow
drop-shadow ist eine Variante der CSS-filter-Eigenschaften. Dieser Schlagschatten beschränkt sich auf die sichtbaren Bereiche eines Elements – so wie im ersten Beispiel um das freistellte Motiv eines webp- oder png-Bildes.
filter: drop-shadow

box-shadow

Positive Werte für den horizontalen und vertikalen Versatz schieben den Schatten nach rechts bzw. unten, negative Werte nach links und oben. Das läuft beim drop-shadow also genauso wie bei box-shadow.
.drop-shadow img { filter: drop-shadow(10px 10px 5px black); ▲ ▲ ▲ │ │ │ horizontaler ───┘ │ │ Versatz │ │ vertikaler ───┘ │ Versatz │ Weich- ───┘ zeichnung } .box-shadow img { border-radius: 20px; box-shadow: 8px 14px 15px var(--shadow-deep); }
CSS box-shadow hingegen wird auf die Box des Elements gelegt hebt (inklusiv padding und border) und erzeugt einen rechteckigen Kasten.
Einschränkungen des drop-shadow
Der drop-shadow folgt den Konturen eines Motivs. Auch wenn er dem box-shadow sehr ähnlich ist, fehlen ihm Funktionen des box-shadow. So gibt es z.B. keine Option inset wie beim box-shadow, der den Schatten in das Element hinein setzt.
Ein Element kann nur einen drop-shadow haben, während box-shadow mehrere Schlagschatten als kommagetrennte Liste notiert.
box-shadow: 6px 6px 6px black, 18px 18px 8px gray;
drop-shadow animieren – pulsierender Schlagschatten
<img src="philo.webp" width="600" height="600" class="pulse-shadow">

.pulse-shadow { filter: drop-shadow(0 0 5px hsla(0,0%,0%,0.9)); animation: pulseShadow 5s infinite ease-in-out; } @keyframes pulseShadow { 0% { filter: drop-shadow(0 0 5px hsla(0,0%,0%,0.9)); } 50% { filter: drop-shadow(0 0 20px hsla(0,0%,0%,0.4)); } 100% { filter: drop-shadow(0 0 5px hsla(0,0%,0%,0.9)); } }