关于css三角形阴影

1,594 阅读2分钟

问题

在为infoWindow的锚点anchor添加阴影时发现的问题:由于anchor的小三角是用css border边框写的,直接加box-shadow会导致三角外面的整个方形外框出现阴影效果。

解决方案:利用css3 filter:drop-shadow在伪元素里增加阴影。

解决方案

以方向为bottom-center的锚点为例:

image.png

可以发现三角形没有阴影效果,锚点的指向不够显眼。

锚点代码:

.anchor {
    width: 0;
    height: 0;
    align-self: center;
    position: absolute;
    border: 7px solid transparent;
    border-bottom: none;
    border-top-color: #fff;
    top: 0px;
}

可见此锚点是通过CSS border的属性进行绘制的,border-top为白色,其他border为透明,从而产生一个向下的白色尖头。

此时如果为anchor直接添加属性box-shadow属性:

box-shadow: 0 1px 2px rgba(0, 0, 0, 0.10);

image.png

如上图,效果是整个border的外缘出现矩形阴影。因为box-shadow绘制的为整个div的阴影,无论其中的元素是否transparant。

因此这里使用filter:drop-shadow属性就比较合适,因为该属性是真正意义上的投影,他只会投影出真实图形的阴影,也就是说transparent的部分不再会有阴影。

并且应该写在body和anchor的父级元素mtmap-infowindow里。具体代码:

.infowindow  {
    filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.1));
}

image.png

就可以实现anchor阴影效果啦!

八个方向的优化效果:

顺便总结box-shadow与filter: drop-shadow的区别

一、兼容性不一

box-shadow从IE9浏览器开始就支持了,兼容性:

而filter中的drop-shadow IE13才开始支持,兼容性:

二、同样的参数值,表现效果有差异

filter中的drop-shadow语法如下:

filter: drop-shadow(x偏移, y偏移, 模糊大小, 色值);

例如:

代码块

CSS

filter:drop-shadow(5px 5px 10px black)

但是,如果使用同样参数值的box-shadow,例如:

代码块

CSS

box-shadow: 5px 5px 10px black;

box-shadow的阴影距离更小,色值要更深:

三、drop-shadow没有内阴影效果

box-shadow支持inset内阴影,如:

代码块

CSS

box-shadow: inset 5px 5px 10px black;

但drop-shadow没有

四、drop-shadow不能阴影叠加

box-shadow阴影可以任意累加,因此,理论上我们可以使用box-shadow绘制任意的图片。

但drop-shadow则不行

五、阴影 vs 盒阴影

这也是两者最重要的区别。

box-shadow顾名思意“盒阴影”,只是盒子的阴影;即使这盒子中间是透明的,阴影的时候,光线也不能穿透;但是drop-shadow就符合真实世界的投影,非透明的颜色,就有投影;透明部分,光线穿过,没投影,跟盒子没有任何关系。

PS:drop-shadow不仅可以穿透代码构建的元素的透明部分,PNG图片的透明部分也是可以穿透的。