问题
在为infoWindow的锚点anchor添加阴影时发现的问题:由于anchor的小三角是用css border边框写的,直接加box-shadow会导致三角外面的整个方形外框出现阴影效果。
解决方案:利用css3 filter:drop-shadow在伪元素里增加阴影。
解决方案
以方向为bottom-center的锚点为例:
可以发现三角形没有阴影效果,锚点的指向不够显眼。
锚点代码:
.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);
如上图,效果是整个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));
}
就可以实现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图片的透明部分也是可以穿透的。