Abgerundete Schatten. Webdesigner lieben sie schon lange, so sehr, dass wir sie früher mit PNG-Bildern nachgeahmt haben, bevor CSS Level 3 sie mit der box-shadow-Eigenschaft offiziell in die Spezifikation aufgenommen hat. Ich greife in meiner Arbeit immer noch oft zu Abrundungsschatten, da sie in manchen Kontexten, wie zum Beispiel bei weitgehend flachen Designs, eine schöne Textur hinzufügen.
Nicht lange nachdem box-shadow eingeführt wurde, tauchte ein Arbeitsentwurf für CSS Filter auf und mit ihm eine Methode für drop-shadow(), die auf den ersten Blick box-shadow sehr ähnlich sieht. Die beiden sind jedoch unterschiedlich und es lohnt sich, diese Unterschiede zu vergleichen.
Für mich wurde der Hauptunterschied früh klar, als ich anfing, mit box-shadow zu arbeiten. Hier ist ein einfaches Dreieck, nicht unähnlich dem, das ich damals erstellt habe.
Lassen Sie uns dies verwenden, um den Unterschied zwischen den beiden zu erläutern.
Box Shadow
Fügen Sie diesem guten Stück ein box-shadow hinzu und das passiert.
Es ist ärgerlich, aber verständlich. CSS verwendet ein Box-Modell, bei dem die Ränder des Elements die Form eines Rechtecks haben. Selbst wenn die Form des Elements kein Rechteck zu sein scheint, ist das Rechteck immer noch vorhanden, und darauf wird box-shadow angewendet. Dies war mein „Aha-Moment“ beim Verständnis des Wortes Box in box-shadow.
CSS Filter Drop Shadow
CSS Filter sind ziemlich großartig. Werfen Sie einen Blick auf alle Möglichkeiten zur Anwendung visueller Filter auf Elemente und staunen Sie, wie CSS plötzlich viele Dinge tut, die wir früher in Photoshop erstellen mussten.
Filter sind nicht an das Box-Modell gebunden. Das bedeutet, dass die Umrisse unseres Dreiecks erkannt werden und die Transparenz darum herum ignoriert wird, sodass die beabsichtigte Form den Schatten erhält.
Entscheidung, welche Methode verwendet werden soll
Die Antwort liegt ganz bei Ihnen. Das einfache Beispiel eines Dreiecks oben könnte den Eindruck erwecken, dass filter: drop-shadow() besser ist, aber es ist kein fairer Vergleich der Vorteile oder gar der Möglichkeiten beider Methoden. Es ist lediglich eine Veranschaulichung ihres unterschiedlichen Verhaltens in einem bestimmten Kontext.
Wie bei den meisten Dingen in der Entwicklung hängt die Antwort auf die Frage, welche Methode verwendet werden soll, vom Einzelfall ab. Hier ist ein Seitenvergleich, der helfen soll, die beiden zu unterscheiden und wann es am besten ist, die eine der anderen vorzuziehen.
| Box Shadow | Drop Shadow | |
|---|---|---|
| Spezifikation | CSS Backgrounds and Borders Module Level 3 | Filter Effects Module Level 1 |
| Browser-Unterstützung | Großartig | Gut |
| Unterstützt Spread Radius | Ja, als optionaler vierter Wert | Nein |
| Blur Radius | Berechnung basiert auf einer Pixellänge | Berechnung basiert auf dem stdDeviation-Attribut des SVG-Filters |
Unterstützt inset Schatten | Ja | Nein |
| Leistung | Nicht Hardware-beschleunigt | Hardware-beschleunigt in Browsern, die es unterstützen. Ohne ist es ein großer Aufwand. |
Zusammenfassend
Der Unterschied zwischen box-shadow und filter: drop-shadow() liegt wirklich im CSS-Box-Modell. Eines erkennt es, das andere ignoriert es. Es gibt noch weitere Unterschiede, die die beiden in Bezug auf Browser-Unterstützung, Leistung und dergleichen unterscheiden, aber die Art und Weise, wie die beiden mit dem Box-Modell umgehen, ist der entscheidende Unterschied.
Update: Amelia hat einen weiteren wichtigen Unterschied in den Kommentaren identifiziert, bei dem die Ausbreitung des Radius für drop-shadow() anders berechnet wird als bei box-shadow und sogar bei text-shadow. Das bedeutet, dass der von Ihnen möglicherweise in box-shadow angegebene Spread-Radius nicht eins zu eins mit dem Standard-Spread-Wert für drop-shadow übereinstimmt, sodass die beiden in einigen Fällen keine gleichen Ersatz füreinander sind.
Lassen Sie uns dies mit einigen anderen großartigen Beispielen abschließen, die dies veranschaulichen. Lennart Schoors hat auch einen schönen Artikel mit praktischen Beispielen für Tooltips und Icons, die wir bereits vorgestellt haben.
Ich wünschte wirklich, der Blur Radius wäre bei box-shadow und drop-shadow gleich. Der gleiche Blur-Betrag in beiden ergibt unterschiedliche visuelle Ergebnisse.
Eine Korrektur
Der
drop-shadow()-Filter nimmt nicht den vierten Parameter zur Erhöhung des Spreads – dies ist kein reines Browser-Support-Problem. Aus dem StandardAuf diese Weise ähnelt er eher
text-shadowalsbox-shadow. Er funktioniert, indem er die vorhandene Grafik (die bereits in Pixel konvertiert wurde) weichzeichnet und verschiebt, anstatt eine neue, weichgezeichnete Box zu erzeugen.Und eine zusätzliche Warnung
Der Blur-Parameter für
drop-shadow()ist nicht gleichwertig mit dem, der intext-shadowundbox-shadowverwendet wird. Stattdessen handelt es sich um einen Wert für die „Standardabweichung“ (äquivalent zumstdDeviation-Attribut in SVG-Filtern) und ist die Hälfte des Blur-Radius, der in den Schatteneigenschaften verwendet wird.Mit anderen Worten,
filter: drop-shadow(0 0 30px #333)ist doppelt so unscharf wiebox-shadow: 0 0 30px #333;.Diese Diskrepanz ist meiner Meinung nach sehr bedauerlich, aber alle Browser-Implementierungen von
drop-shadow()sind konsistent, sodass der Standard sie wahrscheinlich nicht ändern wird. (Diskussion hier)Danke @AmeliaBR für die Nachlese bezüglich der Blur-Diskrepanz. Ich wusste, dass sie abwich, aber ich hatte nicht realisiert, dass es um das Doppelte/die Hälfte ging.
Ah, danke für die Korrektur, Amelia! Ich muss zugeben, dass ich über den Hinweis zu Spread-Werten im offiziellen Standard und dem in MDN verwirrt war. Ich habe die Informationen in dem Beitrag korrigiert.
Ihre Warnung ist auch genau richtig und ich habe dafür gesorgt, dass dies auch vermerkt wird. :)
Prost!
Geoff
LOL dein Bild ist episch, „Blick in die Zukunft des Codes“
Cool!
Habe es gerade ausprobiert. Das einzige Problem, das ich erwähnen sollte, ist, dass drop-shadow kein Antialiasing hat, auf Mobilgeräten sieht es verzahnt aus, wenn ich es zoome.
Obwohl es stimmt, dass der drop-shadow-Filter keine durch Kommas getrennten Mehrfachwerte unterstützt, erlaubt die CSS-Eigenschaft filter mehr als einen Filter in ihrem Wert, und nichts hindert daran, dass es sich um denselben Filtertyp mit unterschiedlichen Werten in seinen Argumenten handelt.
Ich meine, es ist möglich, drop-shadow() mehr als einmal in derselben CSS-Deklaration zu verwenden
filter: drop-shadow(xxx) drop-shadow(zzz);Vielen Dank, dass Sie diese alten Mine-Pens aufgenommen haben, Geoff.
Mit freundlichen Grüßen.
Guter Punkt. Das erinnert mich daran, dass man auch box-shadow stapeln kann und Leute es benutzen, um 3D-Objekte zu erstellen. Das Gleiche gilt für text-shadow. Man kann auch box-shadow auf :pseudo-elements anwenden, was die zusätzliche Markierung reduziert. Verdammt, man kann es sogar animieren (das Animieren von Dingen auf :pseudo-elements war früher nicht sehr konsistent, aber ich denke, es funktioniert jetzt)!
Eines der Demos können Sie hier sehen: http://blogs.sitepointstatic.com/examples/tech/css3-3d-text/index.html
Die einzige verbleibende Frage ist, wie aufwendig das Rendern ist. Jemand muss die Berechnung durchführen, um Ihnen die Antwort zu geben.
Frieden!
Ich habe drop-shadow() noch nie auf der filter-Eigenschaft verwendet. Es ist eine erstaunliche Entdeckung für mich, also hier ist meine erste Erkundung: https://codepen.io/o-k-s-a-n-a/pen/oGroMv
Ich habe heute etwas gelernt. Cool. Vielen Dank, das hat meinen Tag gemacht.