對於前端開發,圖標是前端頁面不可缺少的元素,他能更讓前端頁面更加豐富。前端頁面的初期都是使用圖片,對於小的圖標使用圖片拼成雪碧圖不僅影響前端開發的效率,而且圖片文件相對較大也會影響網頁加載的速度。ionfont字體圖標相較於圖片他的優勢就是文件大小極小,幾百個圖標才幾十上百kb,但是換成圖片可能已經有幾mb了,其次制作簡單,只需UI提供svg圖標可以通過工具自動生成字體文件,或者網上有很多免費的圖標庫可以自動生成矢量字體文件,例如阿里巴巴矢量字體庫。但是iconfont字體圖標因為他就像字體一樣只能設置color屬性,所以他只能是純色的。下面介紹幾種生成方法
1、網上圖標生成網站。以阿里巴巴字體庫為例。登錄http://www.iconfont.cn/,注冊成功后,可以創建項目,然后在免費字體庫中選擇自己項目中需要的圖標,放在購物車里,選擇完了以后將選擇的圖表添加到項目中,然后在項目中將選擇的字體添加到本地。下載下來的文件有.wof,.ttf,.eot,.svg這些是矢量字體文件,稍后解釋這些不同格式的區別,還有生成好的css文件,這些就是頁面中需要引用的矢量字體資源。
2、通過工具生成iconfont字體,這里介紹通過gulp-iconfont,gulp-iconfont-css生成。
首先需要全局安裝gulp然后安裝gulp-iconfont和gulp-iconfont-css。具體的配置文件代碼
var gulp = require('gulp'),
iconfont = require('gulp-iconfont'),
iconfontCss = require('gulp-iconfont-css');
gulp.task('iconfont', function () {
let svg ='./svgs/*.svg';
let fontName = 'iconfont';
gulp.src(svg).pipe(iconfontCss({
fontName: fontName,
targetPath: 'font.css', //生成的css樣式的路徑
fontPath: './' //生成的iconfont的路徑
})).pipe(iconfont({
fontName: fontName, // required
prependUnicode: true, // recommended option
formats: ['ttf', 'eot', 'woff', 'svg'], // default, 'woff2' and 'svg' are available
timestamp: new Date().getTime()
})).pipe(gulp.dest('./dist'));
});
我們將svg字體文件放到配置文件同級的svgs文件夾內,運行gulp iconfont就可以生成iconfont字體文件和對應的css,放在dist目錄下。這里生成矢量字體文件已經生成好了,但是在實際項目中,我們需要知道字體庫里有哪些圖標字體,這樣就不會重復生成圖標。所以我們還要搭建一個展示圖標的服務。這里我們使用koa啟web服務,需要安裝koa,koa-static, koa-router包。我們在根目錄下生成server.js。dist目錄下新建index.html用來展示圖標的網頁,server.js的配置:
const koa = require('koa');
const koa_static = require('koa-static');
const path = require('path')
const router = require('koa-router')();
const fs = require('fs');
const app = new koa();
app.use(koa_static('./dist'))
router.get('/geticonfont', function (ctx, next){
let arr = fs.readdirSync('./svgs')
let tmp = [];
arr.forEach(item=>{
tmp.push(item.split('.')[0])
})
ctx.body = {
status: 200,
data: tmp
}
next();
})
app.use(router.routes()).use(router.allowedMethods());
app.listen('8097', function (){
console.log('listening 8097');
})
這里我們寫了一個獲取ionfont圖標的接口‘/geticonfont’,用來讀取svgs文件夾下的文件名。html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>iconfont</title>
<link rel="stylesheet" href="./font.css">
<style>
ul{
list-style: none;
padding: 0;
margin: 0;
}
ul li{
font-size: 40px;
float: left;
width: 120px;
text-align: center;
margin: 20px;
}
ul li p{
font-size: 14px;
margin-top: 0px;
}
</style>
</head>
<body>
<ul>
<ul id="wrap"></ul>
</ul>
<script src="./jquery.min.js"></script>
<script>
$(function (){
$.ajax({
url:'/geticonfont',
method: 'get',
data: {},
success: function (res){
var arr = [];
for(var i=0;i<res.data.length;i++){
arr.push('<li><i class="icon icon-'+res.data[i]+'"></i><p>icon-'+res.data[i]+'</p></li>')
}
$('#wrap').html(arr.join(''));
}
})
$('#wrap').html()
})
</script>
</body>
</html>
html文件放在dist目錄下。這樣就配置完成了,只要啟服務server.js就可以在本地訪問localhost:8097查看有哪些矢量字體,如下圖

最后我們介紹矢量字體woff,ttf,eot,svg,woff2格式的的區別,以及為什么要將這四種格式都引入。eot格式是兼容ie9以下版本,svg格式是兼容ios4以下版本,ttf,woff格式基本上主流瀏覽器都支持,但是woff格式要比ttf格式的文件小很多,所以加載速度會快很多。最后還有一種woff2這種格式,他是woff的下一代,壓縮率更高,文件大小更小,加載速度更快。
