纯CSS3绘制图标利器之一:box-shadow属性

       box-shadow属性是CSS3中新增加的属性之一,能够给元素设置各种漂亮的阴影效果。在支持该属性的浏览器中,box-shadow实现的效果在以前需要写很多行的代码。不过目前只有IE9+Firefox 4ChromeOpera 以及 Safari 5.1.1 支持 box-shadow 属性。在低版本的IE浏览器中可能需要借助滤镜才能实现相应的效果。

       事实上,边框阴影只是box-shadow的普通应用。随着CSS3标准逐渐成熟,业界出现了一种新的技术发展趋势:使用纯CSS3代码绘制扁平化的图标。扁平化设计是目前UI设计界的发展方向,一切设计都尽量简洁的线条色块组成。这种设计以今年发布的windows 8/8.1, iOS 7/8, Windows Phone为代表。在Android平台,从5.0版本开始,更是全部以扁平化设计为主题。
       废话了一堆,开始进入正题:那么怎么用CSS3来绘制图标呢?略一思考,没有什么头绪啊!对于稍微简单一点的几何图形,那还好,矩形、方形、圆形这都不是问题。那么复杂一点的呢?什么椭圆形、弧形、三角形怎么办呵?经过一番研究,发现要绘制这些图形其实并不很难。关键是运用好几个属性:box-shadow首当其冲,用于投影不同部位的色块;其次是borderborder-radius,用于实现规则和不规则几何图形;最后是transform属性和animate属性,用于变换和动画。当然,有了这些还不行,还缺少position属性和伪元素::before::after。当一个图形分成多个组件的时候,一个元素怎么投影变换都显然不够,这时候伪元素的作用就来了。而position属性恰好用于定位好这些组件,构建出漂亮的图标。
       下面以一个礼品盒为例,讲解下这些属性和元素是怎样配合工作的。先看预览图:
礼品盒
       这个图标初略可分成几个部分:上面的两束花,左右各算一部分,这是个不规则的图形,显然要搭配border-radius才能实现。下面盒子部分分成六个部分,由于都是规则的矩形,因此不算困难。我们需要几个元素来实现这几个部分呢?三个就够了!下面六个矩形色块其实用阴影就可以办到。因为在box-shadow属性中我们可以写上多个属性值,如实现上面的功能可以如下写CSS:

1
box-shadow: 2.2em 0 0 rgba(0,0,0,1), 0 1.2em 0 rgba(0,0,0,1), 2.2em 1.2em 0 rgba(0,0,0,1), -0.1em -0.6em 0 0.1em rgba(0,0,0,1), 2.3em -0.6em 0 0.1em rgba(0,0,0,1);

       效果如下:
礼品盒下半部分
       其分解图为:
分解图
       理论上,一个元素的投影可以无限多,这个在张鑫旭的博客中有讲过这种应用。将阴影的作用用到此处,可谓是恰到好处。那么盒子上的两束花怎么办呢?其实用CSS来绘制图标,有一个思想一定要牢牢记在脑海中:所有的不规则图形都是通过规则图形变换而来的!就说这两束花吧,外型上两者都是近似椭圆形,边框有点粗,一个向左倾斜45度,一个向右倾斜45度。这么一分析,左边这束花的css代码似乎可以这么写:

1
2
3
4
border: 0.16em solid #000;
border-width: .4em .2em .4em .4em;
border-radius: 50%;
-webkit-transform: rotate(-45deg);

       通过禁用掉不同的属性,查看不同的效果:
礼品盒的花束礼品盒的花束礼品盒的花束
       右边的那束花代码差不多,就说倾斜角度不一样而已。一个倾斜45度,一个倾斜-45度。当然,这里只是实现了基本的外形,还需要定位到具体的位置。不然的话还是一团散了架的组件。这里就牵涉到position属性定位了。一般的做法是:将基本元素设置为position:relative,而伪元素设置为position:absolute。这样伪元素围绕着基本元素进行调整。如上的礼品盒:

1
2
3
4
5
6
7
8
9
.gift {
position: relative;
}
.gift::before {
position: absolute;
}
.gift::after {
position: absolute;
}

       还有一个问题,怎么实现不同的弧形呢?border-radius属性值其实大有文章可作。通过给border-radius属性设置不同的属性值,可以实现各种弧形。其原理在张鑫旭的博客中有详细讲解。
       在上面这个礼品盒的实现中,通过元素投影和::before, ::after这个三个元素完全可以实现图形中的组件。但是,当图形比较复杂,需要的组件比较多怎么办呢?一种办法是,添加自定义标签。HTML5中是支持自定义标签的。这么一来,基本标签加上自定义标签及其相应的伪元素,就有六个元素可以用了。一般而言,绝大部分图形是能够满足了。

参考文献

  1. CSS3实现的单div图标
  2. CSS3图标图形生成技术个人攻略
  3. box-shadow属性
24K纯开源拥有所有知识产权。