前言
说起box-shadow那第一个想法当然就是用来实现阴影,其实它还能用于实现其他好玩的效果的,本篇就打算说说box-shadow的那些事。
二话不说看效果
3D小球
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<style type="text/css"> .ball{ background: rgba(100,100,100,0.2); width: 100px; height: 100px; padding: 10px; border-radius: 50%; box-shadow: -14px 8px 100px #333 inset, 0 0 2px #888, 3px -1px 4px #444; } </style> <div class="ball"></div> |
纸张阴影(来自@张鑫旭老师)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<style type="text/css"> .curved_box { display: inline-block; *display: inline; width: 200px; height: 248px; margin: 20px; background-color: #fff; border: 1px solid #eee; -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.27), 0 0 60px rgba(0, 0, 0, 0.06) inset; -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.27), 0 0 40px rgba(0, 0, 0, 0.06) inset; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.27), 0 0 40px rgba(0, 0, 0, 0.06) inset; position: relative; *zoom: 1; } .curved_box:before { -webkit-transform: skew(-15deg) rotate(-6deg); -moz-transform: skew(-15deg) rotate(-6deg); transform: skew(-15deg) rotate(-6deg); left: 15px; } .curved_box:after { -webkit-transform: skew(15deg) rotate(6deg); -moz-transform: skew(15deg) rotate(6deg); transform: skew(15deg) rotate(6deg); right: 15px; } .curved_box:before, .curved_box:after { width: 70%; height: 55%; content: ' '; -webkit-box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3); -moz-box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3); box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3); position: absolute; bottom: 10px; z-index: -1; } </style> <div class="curved_box"></div> |
细读属性
看到上面这么绚丽的效果,是不是迫不及待想弄清box-shadow呢?下面我们来一步步解密它吧!
概述属性语法
box-shadow: none | <shadow>[,<shadow>]*
默认值为none
<shadow>
:inset? && <length>{2,4} && <color>?
shadow pattern,默认为outset,即采用outer box-shadow。通过设置为inset时,则采用inner box-shadow。
horizontal offset,阴影距离原位置的水平位移,正数表示向右移动,负数表示向左移动。
vertical offset,阴影距离原位置的垂直位移,正数表示向下移动,负数表示向上移动。
blur radius,默认值为0,阴影模糊度半径。
spread distance,默认值为0,扩展或缩小阴影的作用面积。
<color>
,阴影颜色,默认与color
属性一致。
注意:我们可以同时设置多个阴影,而阴影的z-index值从左向右递减。
outer box-shadow 和 inner box-shadow怎么玩?
默认情况下采用的是outer box-shadow,当在box-shadow
中添加inset关键词后,则采用inner box-shadow了,但到底它俩的效果是如何的呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<style type="text/css"> .box{ float: left; background: #888; width: 100px; height: 100px; margin-right: 20px; } .outer-box-shadow{ box-shadow: 10px 10px #F00; } .inner-box-shadow{ box-shadow: 10px 10px #F00 inset; } </style> <div class="box outer-box-shadow"></div> <div class="box inner-box-shadow"></div> </div> |
outer-box-shadow
特点:阴影落在元素的border box之外。
实现原理:
- 创建一个与元素border box尺寸一致的阴影盒子;
- 将阴影盒子定位到于元素border box重合,并位于元素之下;
- 根据
horizontal offset
和vertical offset
来相对原位置作移动; - 根据
spread distance
缩放阴影盒子的尺寸(会影响盒子的位移); - 根据
blur radius
对阴影盒子作加工; - 最后将阴影盒子与元素border box重合部分剪切掉。
123456789101112<style type="text/css">.box{background: #888;width: 100px;height: 100px;}.outer-box-shadow{box-shadow: 90px 10px #F00;}</style><div class="box outer-box-shadow"></div></div>
模拟一下:
1234567891011121314151617181920212223<style type="text/css">.box{position: relative;}.box-shadow{position: absolute;z-index: -1;background: #F00;width: 100px;height: 100px;left: 20px;top: 20px;}.box-content{background: #888;width: 100px;height: 100px;}</style><div class="box"><div class="box-shadow"></div><div class="box-content"></div></div>
inner-box-shadow
特点:阴影落在元素的padding box之内。
实现原理(纯个人理解):
- 创建一个与元素padding box尺寸一致的阴影盒子;
- 将阴影盒子定位到于元素padding box重合,并位于元素之上;
- 水平和垂直各画两条线,分别跟元素padding edge重合;(共4条分别记为left/top/right/bottom-guideline)
- 根据
horizontal offset
和vertical offset
移动left/top/right/bottom-guideline。 - 根据
spread distance
移动4条线。spread distance为正数时,left-guideline向右移动,top-guideline向下移动,right-guideline向左移动和bottom-guidelien向上移动;spread distance为负数时,则相反。 - 根据
blur radius
加工元素各padding edge至其对应的guideline间的区域. - 对阴影盒子进行剪裁
- 剪切掉不与元素padding box重叠的部分;
- 仅显示元素各padding edge至其对应的guideline间的区域。
12345678910111213141516171819202122232425<style type="text/css">.box{float: left;background: #888;width: 100px;height: 100px;margin-right