1. 程式人生 > >基於svg生成iconfont矢量字體圖標

基於svg生成iconfont矢量字體圖標

IT width TE ios 版本 add adding time 自動

對於前端開發,圖標是前端頁面不可缺少的元素,他能更讓前端頁面更加豐富。前端頁面的初期都是使用圖片,對於小的圖標使用圖片拼成雪碧圖不僅影響前端開發的效率,而且圖片文件相對較大也會影響網頁加載的速度。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的下一代,壓縮率更高,文件大小更小,加載速度更快。

基於svg生成iconfont矢量字體圖標