工程中用到图标是常事,那这些图标我们前端一般是怎么解决的呢?这几种方案有什么优缺点呢?

第一种: SVG Sprite

SVG sprite其实就是svg的集合。SVG即可缩放矢量图形 (Scalable Vector Graphics)的简称,是一种用来描述二维矢量图形的XML标记语言。SVG图形不依赖于分辨率, 因此图形不会因为放大而显示出明显的锯齿边缘.使用svg格式我们可以直接用代码来描绘图像,可以用任何文字处理工具打开svg图像,通过改变部分代码来使图像具有交互功能,并可以随时插入到HTML中通过浏览器来浏览。

单个SVG图的使用

<svg width="16" height="16" viewBox="0 0 16 16">
<path fill="#000000" d="M16 9.226l-8-6.21-8 6.21v-2.532l8-6.21 8 6.21zM14 9v6h-4v-4h-4v4h-4v-6l6-4.5z"></path>
</svg>

多个SVG图的使用

SVG属性中,可以利用 symbol 来定义一个图形模板对象,并利用 use 将其实例化。use 使用时加入 symbol 的id名就可以显示该图标。

<svg>
<symbol id="001-home" viewBox="0 0 16 16">
<path fill="#000000" d="M16 9.226l-8-6.21-8 6.21v-2.532l8-6.21 8 6.21zM14 9v6h-4v-4h-4v4h-4v-6l6-4.5z"/>
</symbol>
<symbol id="002-home2" viewBox="0 0 16 16">
<path fill="#000000" d="M8 0.5l-8 8 1.5 1.5 1.5-1.5v6.5h4v-3h2v3h4v-6.5l1.5 1.5 1.5-1.5-8-8zM8 7c-0.552 0-1-0.448-1-1s0.448-1 1-1c0.552 0 1 0.448 1 1s-0.448 1-1 1z"/>
</symbol>
<symbol id="003-home3" viewBox="0 0 16 16">
<path fill="#000000" d="M16 9.5l-3-3v-4.5h-2v2.5l-3-3-8 8v0.5h2v5h5v-3h2v3h5v-5h2z"/>
</symbol>
</svg> <svg><use xlink:href="#001-home"/></svg>
<svg><use xlink:href="#002-home2"/></svg>

如果 SVG symbol 不是内嵌在 html 中,而是独立的SVG文件,则use 使用路径名来引用。

<svg><use xlink:href="images/aa.svg#001-home"/></svg>

多个SVG文件的合并可以使用gulp构建工具来完成,这里不详细叙述。可以在SVG标签上增加样式名,控制图标的显示。

优点:

  1. 缩放无损还原。
  2. 可设置样式,控制图标的颜色,大小,渐变等效果。
  3. 可利用CSS实现动画。
  4. 减少HTTP请求。

缺点

  1. SVG在绘制的性能上比PNG要差。
  2. 复杂的图形或渐变可能显示不全。
  3. 兼容性稍差,支持 ie9+,及现代浏览器。

第二种:iconfont

使用字体图标,这种方式也正在被大家接受和认可。将多个矢量图合并生成字体文件,然后在CSS中引用对应的字体编码即可显示图标。字体图标适用于各个浏览器屏幕。通过控制font-size的大小调整图标大小。常用的字体图标网站是http://www.iconfont.cn/ 和 https://icomoon.io/


方式一:font class引用

将字体的编码加在样式的伪类上来实现。

css代码如下:

@font-face {
font-family: "iconfont";
src: url('iconfont.eot?t=1502445479693'); /* IE9*/
src: url('iconfont.eot?t=1502445479693#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('iconfont.woff?t=1502445479693') format('woff'), /* chrome, firefox */
url('iconfont.ttf?t=1502445479693') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
url('iconfont.svg?t=1502445479693#iconfont') format('svg'); /* iOS 4.1- */
} .icon {
font-family:"iconfont" !important;
font-size:16px;
} .icon-close:before { content: "\e736"; } .icon-down:before { content: "\e971"; }

html代码如下:

<i class="icon icon-close"></i>

特点:

  1. 兼容性良好,支持ie8+,及所有现代浏览器。
  2. 相比于直接在html代码里写unicode,这种写法语意明确,书写更直观,直接看样式名就知道是什么icon了。
  3. 因为使用class来定义图标,所以当要替换图标时,只需更换样式名就可以了。
  4. 不支持多色图标。

方式二:unicode引用

跟方式一类似,只是unicode代码引用位置不同而已。

css代码如下:

@font-face {
font-family: "iconfont";
src: url('iconfont.eot'); /* IE9*/
src: url('iconfont.eot#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('iconfont.woff') format('woff'), /* chrome, firefox */
url('iconfont.ttf') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
url('iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */
} .icon {
font-family:"iconfont" !important;
font-size:16px;
}

html代码如下:

<i class="icon"></i>
<i class="icon"></i>

特点:

  1. 兼容性最好,支持ie6+,及所有现代浏览器。
  2. 支持按字体的方式去动态调整图标大小,颜色等等。
  3. 只支持单色图标。
  4. 可读性不好,需要在html代码里写上unicode字符。

此种方式已经不常用了。

第三种:DataURI

DataURI是利用规范将图片转换成Base64编码的文本字符,不仅是图片,还可以编码JS、CSS、HTML等文件。通过将图标文件编码成文本字符,从而可以直接写在HTML/CSS文件里面,不会增加任何多余的请求。

但是DataURI的劣势也是很明显的,每次都需要解码从而阻塞了CSS渲染,而且CSS的体积也会增加不少。这种方法一般不建议使用。常用解码网站http://tool.css-js.com/base64.html

第四种:image sprite

将多个小图标合成雪碧图,这是比较古老的图片处理方式了。将多个图标合成一个图片文件,然后利用css的background-position定位显示不同的icon图标。

优点:

  1. PC端兼容性好。不同浏览器公用一个图片文件,不用考虑兼容性问题。
  2. 减少图标的请求数。多个图标合成一个文件后,只需请求一次就可以。且该文件可以被浏览器缓存。
  3. 减少图片字节。合并后的图片字节比单个图标相加的字节少得多。

缺点:

  1. 维护困难。每新增一个图标,都需要改动原来的合并图片源文件。
  2. 定位不够灵活。图标的位置要有一定的规范,图标与图标之间需要留有一定间距,避免相互干扰影响定位。
  3. 操作繁琐。需要维护图片,修改样式。
  4. 对高dpr的屏幕图标还得额外维护一份。

鉴于前面几种更好的方法,此种图片合并的方式已经过时。

web项目中图标的前端处理方案的更多相关文章

  1. 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

    在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...

  2. 转 web项目中的web.xml元素解析

    转 web项目中的web.xml元素解析 发表于1年前(2014-11-26 15:45)   阅读(497) | 评论(0) 16人收藏此文章, 我要收藏 赞0 上海源创会5月15日与你相约[玫瑰里 ...

  3. extjs6整合到web项目中

    最近有一个项目需要应用extjs作为前端界面,因此研究了一下如何将extjs 6引入到项目中.以下是操作步骤 extjs6下载地址 extjs 6有gpl版本的,下载地址https://www.sen ...

  4. 前后端分离Web项目中,RBAC实现的研究

    在前后端分离Web项目中,RBAC实现的研究   最近手头公司的网站项目终于渐渐走出混沌,走上正轨,任务也轻松了一些,终于有时间整理和总结一下之前做的东西. 以往的项目一般使用模板引擎(如ejs)渲染 ...

  5. 一个Web项目中实现多个数据库存储数据并相互切换用过吗?

    最近公司一个项目需要连接多个数据库(A和B)操作,根据不同的业务模块查询不同的数据库,因此需要改造下之前的spring-mybatis.xml配置文件以及jdbc.properties配置文件,项目后 ...

  6. java web 项目中 简单定时器实现 Timer

    java web 项目中 简单定时器实现 Timer 标签: Java定时器 2016-01-14 17:28 7070人阅读 评论(0) 收藏 举报  分类: JAVA(24)  版权声明:本文为博 ...

  7. Java Web项目中使用Freemarker生成Word文档

    Web项目中生成Word文档的操作屡见不鲜.基于Java的解决方式也是非常多的,包含使用Jacob.Apache POI.Java2Word.iText等各种方式,事实上在从Office 2003開始 ...

  8. web项目中的路径问题

    “/”表示根路径 1.“/”代表的意思不是固定的,是要根据具体的方法,才能知道在该方法中"/"所代表的含义,同样相对路径也不是固定的,需要根据具体的方法来判断具体是相对哪个路径的相 ...

  9. C# 动态创建SQL数据库(二) 在.net core web项目中生成二维码 后台Post/Get 请求接口 方式 WebForm 页面ajax 请求后台页面 方法 实现输入框小数多 自动进位展示,编辑时实际值不变 快速掌握Gif动态图实现代码 C#处理和对接HTTP接口请求

    C# 动态创建SQL数据库(二) 使用Entity Framework  创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关 ...

随机推荐

  1. Lamp单独安装(windows下)

    安装的软件清单:apache_2.2.9-win32-x86-openssl-0.9.8h-r2.msimysql-5.1.28-rc-win32.zipphp-5.2.6-Win32.zipphpM ...

  2. php追加数组

    <?php //追加数组 array_merge_recursive()函数与array_merge()相同,可以将两个或多个数组合并在一起,形成一个联合的数组.两者之间的区别在于,当某个输入数 ...

  3. 关于php的一些安全知识

    绝不要以明文形式显示或发送密码.即使是对密码的所有者也应该这样.如果你需要 "忘记密码" 的功能,可以随机生成一个新的 一次性的(这点很重要)密码,然后把这个密码发送给用户 你希望 ...

  4. Chapter 4. The MPEG-4 and H.264 Standards

    本章节介绍一些关于MPEG-4标准与H.264标准的基本知识 比较重要的是第95页关于两种标准的对比表格.其他部分没有什么特别重要的细节.

  5. Example003通过按钮创建窗口

    <!--实例003通过按钮创建窗口--> <head> <meta charset="UTF-8"> </head> <for ...

  6. 10.application对象

    1.application对象实现了用户数据的共享,可存放全局变量 2.application开始于服务器的启动,终止于服务器的关闭. 3.在用户的前后连接或不同用户之间的连接中,可以对applica ...

  7. 统计学习方法 三 kNN

    KNN (一)KNN概念: K近邻算法是一种回归和分类算法,这主要讨论其分类概念: K近邻模型三要素: 1,距离: 2,K值的选择: K值选择过小:模型过复杂,近似误差减小,估计误差上升,出现过拟合 ...

  8. Jenkins+Ant+TestNG+Testlink自动化构建集成(完整版)

    这段时间折腾自动化测试,之前都是在Eclipse工程里面手工执行自动化测试脚本,调用Testlink API执行测试用例,目前搭建Jenkins自动化构建测试的方式,实现持续构建,执行自动化测试. 硬 ...

  9. [Android FrameWork 6.0源码学习] View的重绘过程

    View绘制的三部曲,  测量,布局,绘画今天我们分析测量过程 view的测量是从ViewRootImpl发起的,View需要重绘,都是发送请求给ViewRootImpl,然后他组织重绘在重绘的过程中 ...

  10. asp.net mvc视图中使用entitySet类型数据时提示出错

    asp.net mvc5视图中使用entitySet类型数据时提示以下错误 检查了一下引用,发现已经引用了System.Data.Linq了,可是还是一直提示出错, 后来发现还需要在Views文件夹下 ...