让我们一步步地介绍一下,在这种情况下,您似乎无法做到的事情,但仍然可以使用 CSS 技巧来完成。 在这种情况下,我们将为形状应用阴影。
您制作了一个盒子

.tag {
background: #FB8C00;
color: #222;
font: bold 32px system-ui;
padding: 2rem 3rem 2rem 4rem;
}
您将它塑造成一个漂亮的标签形状
您使用 clip-path
,因为它非常适合这个。

.tag {
/* ... */
clip-path: polygon(30px 0%, 100% 0%, 100% 100%, 30px 100%, 0 50%)
}
您想给它一个阴影,所以您…
尝试使用 box-shadow
。
.tag {
/* ... */
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5);
}
但是它不起作用。 什么都没有显示出来。 您认为自己疯了。 您假设自己的语法错误。 您没有错。 问题是 clip-path
将其切掉了。
您可以改为为父元素投射阴影
有一个过滤器也执行阴影:drop-shadow()
。 但是您不能直接在元素上使用它,因为 clip-path
也会将其切断。 因此您创建一个父级
<span class="tag-wrap">
<span class="tag">
Tag
</span>
</span>
您也不能在该父级上使用 box-shadow
,因为父级仍然是一个矩形,阴影看起来会很奇怪。 但是您可以使用 filter
,阴影将遵循形状。
查看 Pen
形状上的阴影 by Chris Coyier (@chriscoyier)
on CodePen.
就是这样。
为了避免使用额外的元素,可以使用绝对定位的
:before
进行裁剪,并在元素本身应用drop-shadow()
。 这里有一个 分叉 这样做了。还有一点需要注意:在手动编写前缀时,最好将未添加前缀的版本放在最后。 这是因为某个属性值的作用可能会随着时间的推移而改变,并且将未添加前缀的版本放在最后可以确保在支持它的浏览器中使用最新实现的版本。
感谢您的文章和笔记:)
非常棒的方法。
嗯…
这真的很简单。
谢谢 Chris
看起来不错,但是 filter drop-shadow 会严重影响性能,必须谨慎使用。 在组合这两个元素时,始终测量性能。
太棒了!!!
为什么 filter 会像这样跟随子元素? 我已经回顾了 MDN 文档以作复习 (https://mdn.org.cn/en-US/docs/Web/CSS/filter),但我没有看到任何明显的理由。
从您提供的 MDN 链接中:“投射阴影实际上是输入图像的 alpha 遮罩的模糊、偏移版本,以特定颜色绘制,并与图像复合在一起。”(MDN)
“输入”图像是用投射阴影过滤的图形源,即,在带有裁剪背景的子跨度下方的一个透明跨度。
很棒
我本周遇到了类似的情况,在 SVG 中,我了解到过滤器是在裁剪后应用的。 这可能与应用于 HTML 元素的顺序相同。 这将解释为什么在裁剪的跨度上应用 filter: drop-shadow 不起作用。
https://www.w3.org/TR/SVG11/render.html#Elements
Ana 的伪元素解决方案很棒! 我通过“减去”(在 Adobe Illustrator 的 Pathfinder 中)形状从包装它的矩形中解决了自己的问题。
我想说要小心,因为 filter: drop-shadow 性能很差,我在自己的项目中使用了这种方法并遇到了这个问题。
嗨! 文章很棒,但是裁剪路径与浏览器的兼容性如何?
几个月前,我一直在寻找类似的文章。 我最终放弃了将 Clip Path 与 Box Shadows 一起使用一段时间。 很棒的教程。
太棒的方法了。 我很喜欢。 感谢您提供专门的服务!:)