对于前端而言,图标的发展可谓突飞猛进。从img
标签,到雪碧图,再到字体图标,svg
,甚至svg
也有了相似于雪碧图的方案svg-sprite-loader
。雪碧图没有什么好讲的了,只是简单地利用了background-position
来作图标定位。今天我们先聊聊怎么使用字体图标和svg
图标。其实字体图标也不陌生了,bootstrap
,font-awesome
,element-ui
等UI
库都基本标配了字体图标。css
unicode
预留了E000-F8FF
范围做为私有保留区域,这个区间的unicode
码很是适合作字体图标,前端根据unicode
码就能显示对应的图标。html
注:这里修正一下,前缀应该是test-icon-
。前端
index.scss
中引入在线字体@font-face { font-family: 'iconfont'; /* project id 1254715 */ src: url('//at.alicdn.com/t/font_1254715_s1khj1whikd.eot'); src: url('//at.alicdn.com/t/font_1254715_s1khj1whikd.eot?#iefix') format('embedded-opentype'), url('//at.alicdn.com/t/font_1254715_s1khj1whikd.woff2') format('woff2'), url('//at.alicdn.com/t/font_1254715_s1khj1whikd.woff') format('woff'), url('//at.alicdn.com/t/font_1254715_s1khj1whikd.ttf') format('truetype'), url('//at.alicdn.com/t/font_1254715_s1khj1whikd.svg#iconfont') format('svg'); }
使用时很不友好,使用的是unicode
码表示,使用图标还必须去iconfont
项目去查询下unicode
码。vue
<template> <div> <i class="iconfont"></i> <i class="iconfont"></i> <i class="iconfont"></i> <i class="iconfont"></i> </div> </template>
效果图以下:webpack
有时候网络不是那么给力的,或者是内网环境,那么就不要考虑用在线引用的方式了。web
在全局样式文件中定义以下代码chrome
@font-face { font-family: "iconfont"; src: url('../fonts/iconfont.eot'); /* IE9*/ src: url('../fonts/iconfont.eot#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('../fonts/iconfont.woff') format('woff'), /* chrome, firefox */ url('../fonts/iconfont.woff2') format('woff2'), /* chrome, firefox */ url('../fonts/iconfont.ttf') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ url('../assets/fonts/iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */ } .iconfont { font-family: "iconfont" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
使用方式element-ui
与在线引用方式是同样的,都是使用unicode
码去展现图标。bootstrap
<template> <i class="iconfont"></i> </template>
ie6+
,及全部现代浏览器。一种更友好的封装,相似于font-awesome
,咱们只要使用class
,就能够调用图标了。其原理就是利用before
伪元素来显示图标。浏览器
超级简单,只要在线生成代码,引用在线的css
文件便可使用。
在index.html
中引用它。
<link rel="stylesheet" href="//at.alicdn.com/t/font_1261797_48wm20jf8z.css">
项目中就可使用字体图标了。
<template> <i class="iconfont cl-icon-fold"></i> <i class="iconfont cl-icon-delete-solid"></i> </template>
与unicode
方式相似,下载代码到本地。由于我是用scss
管理样式的,须要在下载的代码中提取出关键部分。除了引用字体库,还要将其中的iconfont.css
中定义的before
伪元素所有复制到本身的scss
文件中。
@font-face { font-family: "iconfont"; src: url('../fonts/iconfont.eot'); /* IE9*/ src: url('../fonts/iconfont.eot#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('../fonts/iconfont.woff') format('woff'), /* chrome, firefox */ url('../fonts/iconfont.woff2') format('woff2'), /* chrome, firefox */ url('../fonts/iconfont.ttf') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ url('../assets/fonts/iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */ } .iconfont { font-family: "iconfont" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } // 列了一部分举例 .cl-icon-user:before { content: "\e64b"; } .cl-icon-video:before { content: "\e66b"; } .cl-icon-pause:before { content: "\e7bd"; } .cl-icon-orgnazation:before { content: "\e61b"; }
ie8+
,及全部现代浏览器。unicode
语意明确,书写更直观。能够很容易分辨这个icon
是什么。class
来定义图标,因此当要替换图标时,只须要修改class
里面的unicode
引用。因为加了新的图标须要从新在iconfont.cn
从新生成代码,因此这种方式也不算很方便,可是相对于unicode
仍是高级很多。根据个人经验,建议在调试时,不要每次图标更新,就下载到本地更换。应该先使用在线使用的方式,调试完毕确认无误后,再下载到本地使用,这样对于效率提高有很大帮助。
svg
的symbol
提供了相似于雪碧图的功能,让svg
的使用变得更简单,也能够知足作图标系统的需求。能够参考张大大博客了解更多关于svg symbol
的知识。
首先在iconfont
项目中选择symbol
方式,并在线生成js
代码
而后在index.html
中引入这个js文件
<script src="//at.alicdn.com/t/font_1254715_oewlgci0ut.js"></script>
这个js
的做用是在文档中生成svg symbol
最后就能够在页面中经过use
标签使用svg
图标了。xlink:href
的值设置为对应的symbol
的id
便可。
<svg aria-hidden="true"> <use xlink:href="#test-icon-word-ext"></use> </svg>
效果以下:
多色图标仍是酷!
本地使用也是同样的道理,主要是依赖这个在线生成的js
文件,将在线js
文件的连接在浏览器空标签中打开,就能够获得其内容,而后复制内容,本身命名一个js
文件,并把它放在本地项目静态资源目录下,引用便可。
<script src="./static/js/symbols.js"></script>
即便使用了symbol
方式,当设计小姐姐新增图标时,咱们仍是没法避免从新生成图标代码。那么有没有更优雅的解决方案呢?答案是有的。svg-sprite-loader
+ require.context
。
svg-sprite-loader
网上已经有太多文章了。
关于require.context
,我却是有一点本身的理解。请查看一张图带你了解webpack的require.context。
css
属性进行定制。ie9+
,及现代浏览器。svg
的性能通常,还不如png
。