Lassen Sie uns Schritt für Schritt eine Situation betrachten, in der Sie nicht ganz das tun können, was sinnvoll erscheint, aber es mit CSS-Tricks trotzdem schaffen. In diesem Fall wird ein Schatten auf eine Form angewendet.
Sie erstellen eine Box

.tag {
background: #FB8C00;
color: #222;
font: bold 32px system-ui;
padding: 2rem 3rem 2rem 4rem;
}
Sie formen sie zu einer schönen Tag-Form
Sie verwenden clip-path, weil es dafür großartig ist.

.tag {
/* ... */
clip-path: polygon(30px 0%, 100% 0%, 100% 100%, 30px 100%, 0 50%)
}
Sie möchten einen Schatten darauf haben, also…
Versuchen Sie, box-shadow zu verwenden.
.tag {
/* ... */
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5);
}
Aber es funktioniert nicht. Nichts wird angezeigt. Sie denken, Sie werden verrückt. Sie gehen davon aus, dass die Syntax falsch ist. Das ist sie nicht. Das Problem ist, dass clip-path es abschneidet.
Sie können stattdessen einen übergeordneten Element mit drop-shadow versehen
Es gibt auch einen Filter, der Schatten erzeugt: drop-shadow(). Aber Sie können ihn nicht direkt auf dem Element verwenden, da clip-path ihn ebenfalls abschneiden würde. Also erstellen Sie ein übergeordnetes Element.
<span class="tag-wrap">
<span class="tag">
Tag
</span>
</span>
Sie können box-shadow auch nicht auf diesem übergeordneten Element verwenden, da das übergeordnete Element immer noch ein Rechteck ist und der Schatten falsch aussehen würde. Sie können jedoch filter verwenden, und der Schatten folgt der Form.
Siehe den Pen
Schatten auf Form von Chris Coyier (@chriscoyier)
auf CodePen.
Das ist alles.
Um die Verwendung eines zusätzlichen Elements zu vermeiden, kann ein absolut positioniertes
:beforezugeschnitten werden unddrop-shadow()auf das Element selbst angewendet werden. Hier ist eine Gabelung, die dies tut.Eine weitere Anmerkung: Beim manuellen Schreiben von Präfixen ist es wahrscheinlich am besten, die ungepräfixte Version zuletzt zu belassen. Das liegt daran, dass sich die Bedeutung eines bestimmten Eigenschaftswertes im Laufe der Zeit ändern kann und die ungepräfixte Version zuletzt zu haben, sicherstellt, dass die zuletzt implementierte Version in Browsern verwendet wird, die sie unterstützen.
Danke für den Beitrag und auch für die Hinweise :)
wirklich schöner Ansatz.
Hm…
Das ist wirklich einfach.
Danke Chris
Sieht gut aus, aber filter: drop-shadow kann ein Performance-Killer sein und muss mit Vorsicht verwendet werden. Messen Sie immer die Leistung, wenn Sie diese beiden kombinieren.
Tolle Sache!!!
Warum folgt der Filter dem Kindelement auf diese Weise? Ich habe die MDN-Dokumentation als Auffrischung durchgelesen (https://developer.mozilla.org/en-US/docs/Web/CSS/filter) und sehe keinen offensichtlichen Grund.
Aus Ihrem angegebenen MDN-Link: „Ein Schlagschatten ist effektiv eine unscharfe, versetzte Version der Alpha-Maske des Eingabebildes, die in einer bestimmten Farbe gezeichnet und unter dem Bild überlagert wird.“ (MDN)
Das „Eingabe“-Bild ist die Grafikquelle, die mit einem Schlagschatten gefiltert wird, d. h. ein transparentes Span unter einem Span-Kind mit einem zugeschnittenen Hintergrund.
Schön gemacht
Ich bin diese Woche auf einen ähnlichen Fall in SVG gestoßen und habe gelernt, dass Filter nach dem Clipping angewendet werden. Dies ist möglicherweise die gleiche Reihenfolge, wenn sie auf ein HTML-Element angewendet werden. Das würde erklären, warum die Anwendung von filter: drop-shadow auf das zugeschnittene Span nicht funktioniert.
https://www.w3.org/TR/SVG11/render.html#Elements
Die Pseudoelement-Lösung von Ana ist schön! Ich habe meinen Fall gelöst, indem ich die Form von einem Rechteck, das sie umschließt, „subtrahiert“ habe (in Adobe Illustrator Pathfinder).
Ich würde sagen, seien Sie vorsichtig damit, da filter: drop-shadow leistungshungrig ist. Ich habe diese Methode in meinen eigenen Projekten verwendet und bin auf dieses Problem gestoßen.
Hallo! Schöner Artikel, aber wie sieht es mit der Kompatibilität von clip-path mit Browsern aus?
Ich habe vor ein paar Monaten nach einem Artikel wie diesem gesucht. Ich habe es aufgegeben, Clip Path mit Box Shadows zu verwenden. Schönes Tutorial.
Fantastischer Ansatz. Ich liebe es. Vielen Dank für Ihren engagierten Service! :)