当前位置: 首页 > Web前端 > CSS

【前端Talking】CSS系列-css3box-shadow介绍

时间:2023-03-30 17:50:42 CSS

1.早先在CSS3中编写,您可以使用box-shadow属性创建阴影效果以增加二维平面的深度。这个属性在前端开发中用的比较多。比如segmentfault的首页就使用了box-shadow属性来增加深度效果。今天我们就一起来看看这个属性。2、box-shadowbox-shadow的基本语法:[x-offsety-offsetblur-radiusspread-radiuscolor,inset]+其中,+表示在正则表达式中出现一次或多次,也就是说,box-shadow可以支持同时设置多个阴影。首先我们看一下基本参数的含义:none:默认值,设置后表示无阴影效果;inset:在这个值之后表示内阴影,不设置则默认表示外阴影;x-offset/y-offset:分别表示阴影在水平方向和垂直方向的偏移量。支持正负值设置。正值表示向右下偏移,负值表示向左上偏移;blur-radius:阴影的模糊距离,只能设置0或正值。值越大,阴影边缘越模糊;spread-radius:阴影的扩散半径(可省略,默认为0)。支持正负值。正值表示阴影扩大,负A值表示阴影收缩。这个属性在box-shadow中比较难理解。该属性的含义将在文章后面详细介绍;颜色:阴影的颜色。如果未设置,将使用浏览器的默认颜色。讲解完box-shadow的各个参数,你可能还是不知道怎么用。那么先来看看人们经常使用box-shadow的一个方法:指定三个长度值和一个颜色值来实现阴影效果,如下:box-shadow:2px3px4pxrgba(0,0,0,.5);在浏览器中的效果如下:最后我们实现了左边框阴影和底边框阴影的效果,但是大家有没有想过box-shadow绘制阴影的原理呢?绘图原理见下一节。3.box-shadow绘制阴影的原理下图形象地说明了阴影是如何绘制的。以下面的代码为例:.box{width:200px;高度:200px;背景色:#fb3;box-shadow:2px3px4pxrgba(0,0,0,.5);}那么绘制阴影的步骤将按以下步骤进行:(1)与元素相同的大小和位置,绘制anrgb(0,0,0,.5),如下图1所示;(2)将图1中的矩形向右移动2px,向下移动3px,如下图2;(3)使用高斯模糊算法(或类似的算法)将其模糊成4px,本质上是阴影颜色与阴影边缘的纯透明色之间的颜色过渡长度约为模糊半径的两倍,为如下图3所示;(4)模糊后的矩形和原来元素的交集部分会被切掉,所以我们看到的最终阴影效果如下图4所示,也就是我们看到的最终阴影效果。准确地说,我们会看到顶部有一个1px的阴影(4px-3px),左边有2px(4px-2px),右边有6px(4px+2px),底部有7px(4px+3px)。实际上,阴影看起来会比这些值略小,因为阴影颜色在边缘的过渡不是线性的。说完box-shadow的绘制原理,下面将结合实例对box-shadow的各个属性进行详细说明4.box-shadow属性详解4.1x-offsetx-offset用于声明其偏移量水平方向的影子。如果为正,则阴影在元素的右侧;如果为负,则阴影位于元素的左侧。如下代码所示:box-shadow:10px05px0rgba(0,0,0,.5);box-shadow:-10px05px0rgba(0,0,0,.5);在浏览器中效果如下:第一张图片,设置x-offset为10px,右侧产生阴影;在第二张图片中,将x-offset设置为-10px会在左侧产生阴影。4.2y-offsety-offset用于声明阴影在垂直方向的偏移量。如果为正,则阴影在元素的一侧;如果为负,则阴影位于元素的顶部。如下代码所示:box-shadow:010px5px0rgba(0,0,0,.5);框阴影:0-10px5px0rgba(0,0,0,.5);在浏览器中效果如下:第一张图片,设置y-offset为10px,底部产生阴影;在第二张图片中,将y-offset设置为-10px,顶部会产生阴影。4.3blur-radiusblur-radius表示阴影的模糊半径。值越大,阴影越模糊。此属性不支持负值。如下代码所示:box-shadow:0000rgba(0,0,0,.5);box-shadow:0020px0rgba(0,0,0,.5);box-shadow:0050px0rgba(0,0,0,.5);第一张图,设置x-offset,y-offset,blur-radius为0px,即无位移,无模糊,无阴影效果;第二张图blur-radius设置为20px,第三张图socialgroupblur-radius设置为50px。可以看出blur-radius值越大,阴影越模糊。4.4spread-radius这个属性是box-sizing中最难理解的。我们先看下面这个例子:box-shadow:0px0px0px20pxdeeppink;可以看到20px的边框效果:然后我们动态改变blur-radius,可以看到模糊的部分就是边框部分,也就是颜色为deeppink的边框。其实我们可以把spread-radius理解为元素blur的“margin”。为正时,梯度向外扩展,为负时,梯度向内收缩。4.5colorcolor表示阴影的颜色,支持css中任意颜色。如下代码所示:.box1{box-shadow:0050px0darkgreen;}.box2{box-shadow:0050px0deeppink;}.box3{box-shadow:0050px0blue;}三图片中,阴影的颜色设置不同,会产生相应的阴影效果。4.6insetshadow默认为外阴影,可以使用inset关键字指定阴影为外阴影。如下代码所示:.box1{box-shadow:0050px0darkgreeninset;}.box2{box-shadow:0050px0deeppinkinset;}.box3{box-shadow:0050px0blueinset;}在浏览器中的效果如下:三张图片中,阴影设置为内阴影,最终阴影在元素内部生成。5、box-shadow属性大小写5.1单边投影代码如下:box-shadow:05px4px-4pxblue;5.2双面投影当我们只想在元素的两侧设置阴影时,似乎比较麻烦。由于dilationradius在四个方向上的作用是一样的(也就是说,我们不能指定投影在水平方向上放大,在垂直方向上缩小),所以唯一的方法就是使用两个投影(每边一个)来达到目的。基本上,单侧投影中的技术应用了两次,如下:box-shadow:5px05px-5pxblue,-5px05px-5pxblue;在浏览器中效果如下:5.3模拟边框使用box-shadow属性可以模拟边框的效果,如下图:

.box{显示:内联块;宽度:200px;高度:200px;背景颜色:#fb3;}.box6{盒子阴影:0px0px0px40px深粉色;}.box7{盒子阴影:20px20px0px20px蓝色,-20px-20px0px20px深粉色,0px0px0px40px深绿色;}在浏览器中的效果如下:我们可以看到边框效果是通过使用box-shadow属性模拟出来的,但是与border不同的是,使用box-shadow创建的边框效果不会影响元素的尺寸。我们指定元素的大小为200*200,然后使用box-shadow来模拟边框的效果,但是在浏览器中可以看到元素的大小还是200*200,如下图图:5.4模拟接近和远离用户使用box-shadow和animation属性的效果可以模拟接近和远离用户的效果,如下图:
.box{显示:内联块;宽度:200px;高度:200px;背景色:#fb3;}.popup{变换:比例(1);盒子阴影:0px0px10px5pxrgba(0,0,0,0.3);transition:box-shadow0.5s,transform0.5s;}.popup:hover{transform:scale(1.3);盒子阴影:0px0px50px10pxrgba(0,0,0,0.3);transition:box-shadow0.5s,transform0.5s;}whilebrowsing在浏览器中的效果如下:5.5模拟漂浮效果box-shadow和animation属性一起使用,可以模拟接近和远离的效果用户,如下图:
.easy{position:relative;转换:翻译Y(0);转换:转换1s;}.easy:after{内容:“”;显示:块;位置:绝对;底部:-30px;左:50%;100%;框阴影:0px0px20px0pxdeeppink;边界半径:50%;背景色:深粉色;转换:翻译(-50%,0);ition:transform1s;}/*盒子向上移动*/.easy:hover{transform:translateY(-40px);transition:transform1s;}/*底部阴影形状变化*/.easy:hover:after{transform:translate(-50%,40px)scale(0.75);transition:transform1s;}在浏览器中的效果如下:5.6模拟页面效果使用box-shadow和animation属性(rotation)一起使用还可以实现如下的纸张效果:左下角和右下角的阴影比较多比中间的阴影突出。下面我们就来一步一步的看一下如何制作出上面的页面效果。有以下公共样式:有以下公共样式:.box{display:inline-block;宽度:200px;高度:200px;background-color:#fb3;}具体步骤如下:(1)使用普通div和伪元素创建一个带阴影效果的外壳,为方便演示,添加border属性,边框最终会被删除。.page{position:relative;}.page:before,.page:after{position:absolute;内容:””;底部:15px;左:10px;宽度:50%;顶部:80%;border:1pxsolid#cd0000;}.page:after{right:10px;left:auto;}在浏览器中的效果如下:(2)添加伪元素的阴影效果并旋转一定角度,修改为如下代码:.page{position:relative;}.page:before,.page:after{position:absolute;内容:””;底部:15px;左:10px;宽度:50%;顶部:80%;边框:1px实心#cd0000;box-shadow:015px10px#777;/*添加阴影*/transform:rotate(-3deg);/*添加旋转*/}.page:after{transform:rotate(3deg);/*添加旋转*/右:10px;left:auto;}在浏览器中的效果如下:(3)使用z-index:-1隐藏伪元素并去掉border属性来说明效果,最终效果就是我们想要的页面效果。.page{position:relative;}.page:before,.page:after{z-index:-1;/*New*/position:absolute;内容:””;底部:15px;左:10px;宽度:50%;顶部:80%;/*border:1pxsolid#cd0000;*/box-shadow:015px10px#777;转换:旋转(-3deg);}.page:转换后:旋转(3deg);右:10px;left:auto;}在浏览器中的效果如下:6、css中最后一个box-shadow写的属性比较少,但是刚接触的时候比较抽象,尤其是展开Radius的时候,它刚接触的时候也很难理解,但是根据网上一些博主的例子,然后自己写例子,观察效果,??其实还是比较容易理解的。如果想详细了解box-shadow的MDN和W3C,还有一个比较好的css3gen可以在线查看box-shadow的效果。谢谢阅读。7.参考链接box-shadow属性遇到了,不妨关注我的微信公众号「前端Talking」