在日常开发,前端coder绕不开一个话题,在页面上添加各种小图标,比如
或者是这样的:
一般来说,总体上有三种方案:
在IE时代,由于浏览器的兼容性问题,png图片是一个不得不采用的方案,实际中我们经常谈论的精灵图,就是这种图片。
字体图标相比位图而言,具有以下优点:
但是,它也有一些问题:
关于字体图标的使用,有两个方面需要考虑:
1.如何制作字体图标;
2.如何使用字体图标;
关于字体图标的制作,有两个方案:
一是,自己亲自动手制作,借助一些现成的工具,比如:Glyphs、IcoMoon
具体制作方法,可以参考这篇文章:如何把你的图标转换成web字体
二是,使用一些现成的第三方服务,比如前面说到的,Font Awesome、icon-font、IcoMoon;
下面我们具体介绍第二种,使用现成的第三方服务:
首先,从两个网站任选一个,下载选取的字体图标;
我们打开看一下里面的目录结构:
然后,针对上面的情况,我们要将字体文件合并成一个fonts
文件夹,icomoon不需要合并,而icofont需要我们调整一下目录。复制style.css
文件(iconfont.css
)中的css样式,粘贴到实际项目的CSS文件中,我姑且将其重命名为iconfont.css
,保持其为一个单独的CSS文件。
最后,将fonts.css
引入到html中;
<link rel="stylesheet" href="iconfont.css" />
注意:在使用
iconfont.css
文件时,一定要根据实际的项目结构,调整字体的路径,类似这样的:
@font-face {
font-family: 'icomoon';
/* 调整路径 */
src: url('fonts/icomoon.eot?ln7h60');
src: url('fonts/icomoon.eot?ln7h60#iefix') format('embedded-opentype'),
url('fonts/icomoon.ttf?ln7h60') format('truetype'),
url('fonts/icomoon.woff?ln7h60') format('woff'),
url('fonts/icomoon.svg?ln7h60#icomoon') format('svg');
font-weight: normal;
font-style: normal;
}
调用图标字体有三种方法:
(1)优点
(2)缺点:
新版的iconfont支持多色图标,这些多色图标在unicode模式下不能使用,推荐使用symbol方式尽心引用;
一、编辑iconfont.css
文件
主要有两个地方:
@font-face
/* 编辑字体文件路径*/
@font-face {
font-family: 'iconfont';
/* 注意路径 */
src: url('iconfont.eot');
src: url('iconfont.eot?#iefix') format('embedded-opentype'),
url('iconfont.woff2') format('woff2'),
url('iconfont.woff') format('woff'),
url('iconfont.ttf') format('truetype'),
url('iconfont.svg#iconfont') format('svg');
}
/* 定义iconfont样式 */
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* 具体的样式是一些伪类 */
.icon-meifa:before {
content: "\e603";
}
.icon-zhijiayou:before {
content: "\e604";
}
.icon-xiangshui:before {
content: "\e605";
}
.icon-yanying:before {
content: "\e606";
}
二、应用于页面
挑选相应图标并获取字体编码:
<link rel="stylesheet" href="./iconfont.css">
<span class="iconfont">span>
unicode编码的查看:iconfont.css文件中伪类元素进行对应即可;
补充:
其实,这编辑iconfont.css文件的时候,有一个地方需要注意一下,就是关于:定义iconfont样式,这部分代码的编写,有两种方式:
第一种:就是前面的方式定义.iconfont
类的样式,这种方式有一个问题,就是在页面引入样式的时候,总是需要重复写上类名iconfont
,可能略显繁琐,那么如何做呢?
第二种:使用属性选择器进行样式匹配:[class^="icon-"], [class*="icon-"] { font-family: "iconfont" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
这样,我们在页面引入时,直接写指定的
icon-xxx
就可以了;这个其实看个人喜欢哪种喽!
font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。
与 Unicode 使用方式相比,具有如下优点:
缺点:
一、编辑iconfonts.css
文件:
这一步于unicode方式一样,主要区别在于页面引入的方式不同;
二、应用于页面
<link rel="stylesheet" href="./iconfont.css">
<i class="iconfont icon-meifa">i>
" iconfont" 是你项目下的 font-family。可以通过编辑项目查看,一般默认是 “iconfont”。
这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章
这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:
优点
因为使用svg-icon后,我再也不用发送woff|eot|ttf| 这些字体库的请求了,所有的svg都可以内联在html内。
缺点:
一、编辑iconfont.css文件
这一步与前面的两种方法是一样的,区别还是在于引入方式的不同;
二、页面应用
引入的时候,我们需要做三件事情:
(1)引入项目下面生成的 symbol 代码:
(2)加入通用 CSS 代码(引入一次就行):
(3)挑选相应图标并获取类名,应用于页面:
<script src="./iconfont.js">script>
<style> .icon { width: 1em; height: 1em; vertical-align: -0.15em; fill: currentColor; overflow: hidden; } style>
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-xxx">use>
svg>
这里是一个最终代码的对比图:
我们再来看一下浏览器编译之后的页面:
好了,到此为止,我们已经介绍了前端开发中icon的引入。其实,在当下的开发中,前端三大框架的使用,我们也会通过一些方式进行引入,随后的文章,我将介绍一下如何在vue项目中引入svg图标。
欢迎,交流,一起进步,我是一名前端coder。