你们都对网站上使用的小图标确定都不陌生,这些小图标做为网站内容的点缀,增长了网站的美观度,提升了用户体验,但是你有没有看过在这些网站中使用的图标都是用什么技术实现的?虽然大部分网站仍是使用普通的图片实现,不过可供使用的技术方案还很多,这些都归功于新的Web技术的应用。css
这个方案是使用最广的方案,简单有效。jQuery UI使用的就是这样的方案。jQuery UI是把全部须要用到的小图标放置在一张大的sprite图片中,相似以下的图片:html
用法也很简单。应用图标时,经过设置背景图来展现不一样的图标。好比,要添加一个邮件的图标,则须要设置class
为ui-icon ui-icon-mail-closed
。ui-icon
和 ui-icon-mail-closed
的定义以下:前端
.ui-icon { background-image: url("/themeroller/images/ui-icons_888888_256x240.png"); } .ui-icon-mail-closed { background-position: -80px -96px; }
能够看到jQuery UI的方案仍是传统的经过设置不一样的background-position
来切换不一样的图标的。此种方法简单,可是不一样的皮肤须要有不一样的颜色的图片来对应,光jQuery UI默认内置的图片就有不少种。jquery
使用图片的缺点也明显,最大的缺点是很差自定义图标的大小和颜色。限制了页面的设计。css3
经过Web Font技术来构建小图标是目前使用最普遍的代替普通图片的方案。Web Font是在CSS3中引入的技术,w3c官方网站上的地址是:css3-webfonts。以下是使用Web Font的示例:git
@font-face { font-family: Delicious; src: url('Delicious-Roman.otf'); } @font-face { font-family: Delicious; font-weight: bold; src: url('Delicious-Bold.otf'); } h3 { font-family: Delicious, sans-serif; }
Web Font目前已经获得了全部主流浏览器的支持,因此在网页中已经大量的使用。caniuse网站上查到的Web Font的浏览器支持情况以下:github
Web Font的使用使得网站再也不是局限于系统内置的字体,网站中字体的显示也更具备个性。Web Font尽管使用普遍,可是中文字体上的应用还不多,这主要是由于中文对应的字体文件过于庞大(中文博大精深~)。目前使用最多的Web Font是由Google提供的服务,这里有一篇文章介绍Google Web Font的使用。这里就不在详细展开。今天重点要说的是Web Font用于构建小图标。web
因为Web Font能够自定义字体,那么就给了设计者设计一种特殊字体的可能,即图标字体。这种字体具备文字的特性,好比能够设置字体的颜色和大小,但同时具备图标的外观。目前使用很普遍的Web Font图标库是font awesome 和 BootStrap框架包含的图标模块glyph icons。Font Awesome提供了多达519个图标,BootStrap中也提供了260个图标。这些图标基本上涵盖了网页中经常使用的图标。若是不知道如何选择图标,这个网站能够辅助查找。以下示例使用Font Awesome 和 BootStrap展现邮件图标:bootstrap
<!—使用Font Awesome 生成图标--> <i class="fa fa-envelope-o"></i> <!—使用BootStrap 生成图标--> <i class="glyphicon glyphicon-envelope"></i>
这类框架生成图标的原理相似,利用 ::before
和 ::after
伪对象在元素中插入内容,而后渲染内容为图标。好比fa
和 fa-envelope-o
的定义以下:api
.fa { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; transform: translate(0, 0); } .fa-envelope-o:before { content: "\f003"; }
fa
类定义了元素的字体,即Web Font字体, fa-envelope-o
的做用是在元素中插入内容文字"\f003"
,内容文字经过定义的Web Font字体渲染为一个邮件图标。
这种方案的优点明显,经过CSS就能够很方便地控制图标的大小和颜色,在开发中带来了极大的便利性。使用Web Font生成的图标,会自动适用不一样的设备分辨率,不会由于放大和缩小而影响图标显示的质量。这个看似很完美的方案,可是在使用过程当中仍是有一些缺点的。最大的缺点是浏览器的支持上不够完美,浏览器把图标做为文字进行渲染,因为抗锯齿的优化很差,使得图标看起来不够锐利。其次,因为浏览器兼容性的问题,须要提供至少四种不一样类型的字体文件。好比BootStrap提供了eot
、 ttf
、woff
、svg
这四种格式的字体文件。网站中每每只须要少数几个图标,可是须要引入全部的图标文件,增长了额外的开销。
SVG是一种基于XML的图形格式。这是一种可缩放的矢量图形。SVG是由W3C制定的标准,在2003年成为了W3C的推荐标准。相比较其余的图像格式,SVG的优点在于:SVG能够被不少工具读取和修改、SVG的尺寸更小、SVG图像在任何的分辨率下均可以高质量地打印。
SVG主要有以下的使用方式:
这种方式简单,直接把SVG格式图片看做为普通的图片来引用。这种方式在实际的使用场景中应用很少。
IE九、Firefox、Opera、Chrome及Safari都支持内联的SVG。IE8及如下版本浏览器能够经过安装插件来支持SVG。内联的SVG直接做为HTML文档的一部分,不须要单独请求。内联的SVG使用上很不方便,若是在HTML中加入大段的SVG代码,则很难维护,代码也没法复用。
这种方式是把SVG文件直接转成base64编码格式,而后以Data URIs的方式引用。示例代码以下:
.icon{ background: url(data:text/svg+xml;base64,<base64 encoded data>) }
<symbol>
元素在SVG的规范中,能够经过<symbol>
元素来组合多个图片到一个SVG文件中。在SVG中每一个<symbol>
表明着一个独立的图片或者图标。代码示例以下:
<svg display="none" width="0" height="0" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <defs> <symbol id="icon-home" viewBox="0 0 1024 1024"> <title>home</title> <path class="path1" d="M1024 590.444l-512-397.426-512 397.428v-162.038l512-397.426 512 397.428zM896 576v384h-256v-256h-256v256h-256v-384l384-288z"></path> </symbol> <symbol id="icon-home2" viewBox="0 0 1024 1024"> <title>home2</title> <path class="path1" d="M512 32l-512 512 96 96 96-96v416h256v-192h128v192h256v-416l96 96 96-96-512-512zM512 448c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64s-28.654 64-64 64z"></path> </symbol> </defs> </svg>
如上代码示例来自于 icomoon.io。能够看到SVG元素中包含了两个symbol元素,每一个元素都有一个id属性。这两个元素其实是两个图标。使用的方法是经过在SVG中使用use引入具体某个symbol对应的id值,即引入了symbol元素对应的图标。以下是在HTML代码中引入symbol的示例:
浏览器渲染后的效果以下图:
能够看到,在SVG中使用use能够引入在一个SVG图片中的不一样图标。这样的效果相似于CSS中的雪碧图。
随着CSS的不断发展,使用CSS不只仅能够产生一些四四方方的线框效果,同时能够产生一些曲线和倾斜效果。主要利用了以下的CSS特性:border-radius、box-shadow、transform等效果及使用伪元素::before
和 ::after
。这些效果的搭配使用,则能够产生一些特殊的形状。这就给了咱们一个单纯使用CSS来生成一些简单图标的机会。以下图是一个常见的RSS图标:
咱们能够尝试使用CSS来生成这样的效果,假设此图标对应的HTML只有一个简单的元素
<i class="icon-rss"></i>
接下来定义这个icon-rss
类,先定义基本的高和宽:
.icon-rss { width: 22px; height: 22px; overflow: hidden; margin: 6px; position: relative; }
接下来利用::before伪对象定义图标左下角的实心圆:
.icon-rss:before { content: ''; width: 6px; height: 6px; box-shadow: 0 0 32px inset; left: 0; bottom: 0; position: absolute; border-radius: 50%; }
如上的代码中,设置元素为绝对定位并定位于左下角。使用border-radius构建一个圆形,而后应用box-shadow,设置圆形内阴影。达到实心圆的效果。
构建完实心圆后,接下来构建右上角的两个半圆弧。此次使用::after
伪元素。
.icon-rss:after { content: ''; width: 27px; height: 27px; right: 15%; top: 15%; position: absolute; border-radius: 50%; border: 4px solid transparent; box-shadow: inset 0 0 0 2px,0 0 0 2px; }
代码中一样设置元素为绝对定位,并定位于右上角。使用border-radius构建一个圆形,但由于设置了元素的高度和宽度远大于外框的高宽,因此超出部分被外框遮挡,达到了1/4圆弧的效果。但仅仅设置这些并不能产生两条圆弧的效果,因此代码中借助了box-shadow
,产生了内外两个阴影,实际显示成为两条圆弧。两条圆弧的距离太近,经过设置一个透明的border
,加大了两条阴影的距离。
至此,一个RSS图标产生。看起来很繁琐,构建这样一个图标须要有很好的CSS功底。好在有第三方库可使用。icono就是这样一个纯CSS生成图标的库。全部的图标效果图以下:
以上就是咱们在网页中常见的图标构建技术。在实际的使用中须要结合浏览器兼容来选择合适的方案。以当前的浏览器发展情况,我的推荐使用Web Font 和 SVG的方案,这样的方案更能适合当前高清屏幕的显示。推荐使用icomoon.io库,icomoon提供了Web Font和SVG两种用于构建图标的方案,也提供了PNG图片用于降级处理。icomoon允许用户选择须要的图标来打包,而不像BootStrap和FontAwsome提供了整个图标文件,这样保证了文件足够小。此外在icomoon中,用户也能够上传自定义的图标。能够看到icomoon提供了极大的便利和良好的浏览器兼容性。纯CSS的方案还不够成熟,浏览器兼容性也不够好,可构建的图标有限,不建议在实际的项目中使用,但能够做为学习的资料。