另一种实现这一点的方法,特别是对于像我一样需要使用等边甚至不等边三角形的人来说,是使用filter: drop-shadow(...)
多个值且没有模糊半径。这具有不需要多个元素或同时访问:before 和 :after 的额外好处(我试图通过内联的 :after 内容来完成此操作,因此也希望避免绝对定位)。
对于上述情况,:after 的 CSS 可能如下所示(小提琴):
.container {
margin-left: 15px;
width: 200px;
background: #FFFFFF;
border: 1px solid #CAD5E0;
padding: 4px;
position: relative;
min-height: 200px;
}
.container:after {
content: '';
display: block;
position: absolute;
top: 10px;
left: 100%;
width: 0;
height: 0;
border-style: solid;
border-width: 20px 0 40px 15px; /* skewed to show support for non-right-angle triangles */
border-color: transparent transparent transparent #fff;
filter: drop-shadow(1px 0 0 #CAD5E0) drop-shadow(0 .5px 0 #CAD5E0);
}
<div class="container">
Test Container
</div>
不过,我认为有一些限制或奇怪之处:
- 不支持 IE11(虽然在 FF、Chrome 和 Edge 中看起来不错)
- 我不太确定为什么上面
<offset-y>
第二个 drop-shadow() 中的值的 0.5px 看起来更像 1px 而不是 1px,尽管我认为它与三角函数有关(尽管至少在我的显示器上我看不出两者之间的区别实际的基于 trig 的值或 0.5px 甚至 0.1px)。
- 大于 1px 的边框(嗯,它们的外观就是这样)似乎效果不佳。或者至少我还没有找到解决方案,尽管请参阅下面的不太理想的方法来扩大一点。(我认为
<spread-radius>
drop-shadow()的记录但不受支持的第四个参数(超过 1px(小提琴)时开始发生:
.container {
background-color: #eee;
padding: 1em;
}
.container:after {
content: "";
width: 0;
height: 0;
border-style: solid;
border-width: 20.4px 10px 0 10px;
border-color: yellow transparent transparent transparent;
margin-left: .25em;
display: inline-block;
filter: drop-shadow(-6px -4px 0 green) drop-shadow(6px -4px 0 red) drop-shadow(0 6px 0 blue);
}
<div class="container">
Test Container
</div>
请注意第一个(绿色)被应用一次,但第二个(红色)被应用到通过边框创建的黄色三角形以及绿色阴影()和最后一个(蓝色)的有趣之处适用于上述所有内容。(也许这也与 .5px 外观有关)。
但我想如果你需要看起来比 1px 更宽的东西,你可以利用这些相互叠加的阴影,将它们更改为如下所示(小提琴):
filter: drop-shadow(0 0 2.5px red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red);
其中第一个具有模糊半径集(在这种情况下为 2.5px,尽管结果看起来是相乘的),其余所有的模糊都为 0。但这仅适用于所有侧面的相同颜色,结果在一些看起来圆润的角落以及相当粗糙的边缘,你走的越大。