最近读了 SitePoint 的文章,发现SVG
的图标方案有很多地方优于字体图标方案,如语义性良好,以及无损还原显示效果。
于是兴冲冲的准备把自己的站点的图标都改成SVG方案,可折腾了许久后,发现会出现各种各样的问题,并不是想象中如此完美,在此做个对比总结,分享给有需要的人。
简评
目前所有图标方案,每一个都会存在这样或那样的缺陷,我们需要的是针对不同场景,不同需求,来选用不同的方案。
|
优点 |
缺点 |
Icon Fonts |
向下兼容所有浏览器(IE6+);引用方便,对单个图标的控制也方便 |
语义性欠缺;不同浏览器渲染方式不同,存在锯齿现象 |
SVG |
无损还原,显示清晰;语义性良好 |
原生只支持到IE9+;方案众多,不同方案都存在一定缺陷 |
字体图标方案
字体图标方案提出的本意是为了解决切图带来的不便,以及对高清设备显示模糊现象的问题。
因此引用了矢量图标,并采用类似<icon class="icon-user"></icon>
的方式方便引用。
但后来发现该方案在一些复杂图标的显示上并不是那么好,原因是因为不同浏览器对字体的渲染方式不同,抗锯齿的效果欠佳,详细的可见这篇文章的说明。
并且由于缺乏语义性,对搜索引擎或是其他阅读设备的支持并不友好。如下面这个例子:
请点击 来分享
如果使用某些可口述的阅读设备来读这段文字,那么就会变成如下结果:
请点击来分享
这类问题就如同<img>
标签不添加alt
属性一样。
而如果采用svg方案,它会自带有title
功能,即仍可以把图标用语音描述出来。
See the Pen LpXwmq by Hector Guo (@hectorguo) on CodePen.
当然,字体图标也可以采用如下方式,解决这类不友好的问题。
请点击
<icon class="icon-share">
<span class="sr-only">"分享"</span>
</icon>
来分享
SVG 6种方案实现
1. CSS sprite
2. Background Image (路径引用)
3. Background Image - Data Uri (直接嵌入SVG)
4. SVG <use>
- 内嵌
5. SVG <use>
- 外部引用
6. <img>
标签
方案汇总
See the Pen rOQXKd by Hector Guo (@hectorguo) on CodePen.
SVG 6种方案优劣对比
6种svg方案都存在些缺陷,对比如下:
|
优点 |
缺点 |
1.CSS sprite |
- 单一http请求
- 可用
background-size 调整大小(整体调整) - 易于引用(如
<span class="icon icon-chrome"></span> )
|
对单个图标调整大小繁琐(需要同时调整background-size 和background-position ) |
2.Background Image (外部引用) |
- 可用
background-size 调整大小(个体调整) - 易于引用(同上)
|
多个http请求 |
3.Background Image (直接嵌入SVG) |
- http请求减少;
- 易于引用(同上)
|
- 性能欠佳(CSS样式表文件变大,若放入html中则不易做缓存)
- 兼容性不佳(IE9+?)
|
4.SVG <use> - 外部引用 |
- 单个图标大小调整灵活
- 易于引用(
<svg><use xlink:href="def.svg#icon--feed"/></svg> ) - 单独样式控制
- 易于缓存
|
- 声明较烦琐
- 兼容性问题(IE9、10下外部引用svg文件存在问题)
|
5.SVG <use> - 内嵌 |
- 单个图标大小调整灵活
- 易于引用(
<svg><use xlink:href="#icon--feed"/></svg> )
|
- 声明较烦琐
- 性能欠佳(每个html文件都存在svg文件,不易缓存)
|
6.<img> |
- 单个图标大小调整灵活
- 易于引用(
<img src="xxx.svg"> )
|
- 多个http请求
- 样式调整困难
|
总结
综上所述,没能找到一个最佳的svg方案,之前采用方案4,但发现引用起来并没有字体图标方案来的简单,为了引用一个图标,着实添加了不少代码量,而且由于是在html中引用,如果在不同的路径下统一用相对路径的话(尤其针对Jekyll这类静态博客系统),会带来不少问题,采用绝对路径那引用起来更加麻烦。 且根据这篇文章,当随着图标的增多,svg的文件大小显然要高于字体。
因此,后来又改回了字体图标方案。当然,如果你的图标不多,又恰好想新增几个图标上去,显然用svg直接放进html里会更方便,也省去了重新合并字体的麻烦。
如果各位有什么其他更好的方案,欢迎在下面评论探讨。
参考
- Implementing an SVG Icon System
- 高清ICON SVG解决方案
- The Great Icon Debate: Fonts Vs SVG
- Inline SVG vs Icon Fonts
- svgs are cool, but icon fonts are just 10% of their file size