圖文實(shí)操詳解前端處理小圖標(biāo)的那些解決方案
前言
在開始本文之前,我們先做一個(gè)選擇題:前端開發(fā)使用構(gòu)建工具的目的是什么?
A、因?yàn)楝F(xiàn)在流行node.js,都在使用構(gòu)建工具
B、讓前端開發(fā)變得高大上,和后端一樣編譯才能運(yùn)行
C、讓自動(dòng)化工具替代重復(fù)的手工操作,比如合并代碼,刷新瀏覽器預(yù)覽效果等。
選擇A、B請(qǐng)直接關(guān)閉此文,選擇C請(qǐng)繼續(xù)閱讀。
其實(shí)使用工具的目的就一個(gè): 自動(dòng)化一些重復(fù)操作,提升工作效率。ok,明確了這一點(diǎn)之后再來(lái)探究有哪些方式,可以把一堆小圖標(biāo)合并成一個(gè)圖片文件并生成相應(yīng)的樣式。
按照生成文件和使用方式來(lái)看,可以大致分成3類處理方式:
png sprite
合成雪碧圖是歷史最悠久最成熟的解決方案,把不同的png小圖標(biāo)拼接成一張png圖片。
手動(dòng)操作
有的公司甚至讓UI設(shè)計(jì)師來(lái)合并小圖標(biāo)(UI設(shè)計(jì)師成了自動(dòng)化工具,囧~),這樣做減少前端工作量的同時(shí)也帶來(lái)一些問(wèn)題。
- 溝通問(wèn)題。如果只想簡(jiǎn)單地修改某個(gè)圖標(biāo)顏色,大小,都要與設(shè)計(jì)師溝通,一來(lái)一回增加時(shí)間成本。
- 樣式問(wèn)題。設(shè)計(jì)師提供的小圖標(biāo)不能直接用,要配合特定的樣式(偏移值,大?。┎判小?/li>
- 命名問(wèn)題。即使有犀利的設(shè)計(jì)師提供了css文件,樣式類的命名也難以符合前端開發(fā)規(guī)范和需求(真有這樣的設(shè)計(jì)師歡迎私信推薦給我(●^◡^●))
所以這種處理方式不推薦也不在我們的討論范圍之列。
自動(dòng)化工具
當(dāng)我們擁有了自動(dòng)化工具的時(shí)候,部分問(wèn)題就可以對(duì)整個(gè)流程進(jìn)行優(yōu)化了。
- 根據(jù)psd切出小圖標(biāo)(前端必備,自己動(dòng)手,豐衣足食),并把小圖標(biāo)放入源文件夾。
- 構(gòu)建工具自動(dòng)生成圖片和css文件,并根據(jù)小圖標(biāo)名生成對(duì)應(yīng)的樣式名。
- 代碼中引入樣式和圖片。
配置文件
以 npm 的 gulp.spritesmith 模塊為例實(shí)現(xiàn)整個(gè)流程。
這是 gulpfile.js 中配置的任務(wù):
var gulp = require('gulp');
var $ = require('gulp-load-plugins')();
gulp.task('png', function () {
gulp.src('./src/*.png')
.pipe($.spritesmith({
imgName: 'icon.png', //參數(shù),生成圖片文件名
cssName: 'icon.css', //參數(shù),生成的樣式文件名
cssTemplate: './src/png_template.hbs' //參數(shù),樣式文件模板的路徑,默認(rèn)使用的是handlerbars模板
}))
.pipe(gulp.dest('dist/png'));
});
功能比較強(qiáng)大,除了css文件外還可以生成scss和less文件,同時(shí)也可以用模板文件對(duì)其進(jìn)行格式化。這里我自定義了一個(gè) png_template.hbs 文件,內(nèi)容如下:
// 主要增加了一個(gè)通用樣式,給圖標(biāo)賦予內(nèi)聯(lián)塊級(jí)樣式
.icon {
display: inline-block;
}
{{#sprites}}
.icon-{{name}} {
background-image: url({{{escaped_image}}});
background-position: {{px.offset_x}} {{px.offset_y}};
width: {{px.width}};
height: {{px.height}};
}
{{/sprites}}
開發(fā)流程
配置完成之后,在源文件夾中放入兩個(gè) question.png、hook.png 兩個(gè)小圖標(biāo)進(jìn)行調(diào)試。
gulp 處理后生成了兩個(gè)文件:icon.css、icon.png。 打開 icon.css,可以看到根據(jù)圖標(biāo)名生成了兩個(gè)樣式類:
.icon {
display: inline-block;
}
.icon-hook {
background-image: url(icon.png);
background-position: -40px 0px;
width: 16px;
height: 16px;
}
.icon-question {
background-image: url(icon.png);
background-position: 0px 0px;
width: 40px;
height: 40px;
}
在代碼中使用起來(lái)很簡(jiǎn)單
// 引用生成的css文件 <link rel="stylesheet" href="./png/icon.css" charset="utf-8"> ... //直接給標(biāo)簽添加樣式類 <i class="icon icon-hook"></i> <i class="icon icon-question"></i>
預(yù)覽效果見文末截圖
問(wèn)題
感謝技術(shù)的進(jìn)步和人民生活水平的提高,這種高效的方式馬上碰到一個(gè)“天敵”:高dpr的視網(wǎng)膜屏幕。
用響應(yīng)式判斷dpr的話,前面所有的工作量都要倍增,同時(shí)還要加載多余的樣式。而且隨著屏幕更新?lián)Q代,dpr增多就要多做一張圖片和樣式,想想都太磨人 -_-||
那么是否有圖片可以自適應(yīng)不同dpr的屏幕?css3的曙光給我們指引了新的方向。
font-face
也稱作字體圖標(biāo),這種技術(shù)簡(jiǎn)單來(lái)說(shuō)就是把矢量圖合并生成字體文件,然后在css中引用對(duì)應(yīng)的字體編碼即可渲染成圖片。因?yàn)樽煮w是適應(yīng)各種屏幕的,所以字體圖標(biāo)也繼承了這個(gè)優(yōu)點(diǎn)。
手動(dòng)操作
目前有不少制作字體圖標(biāo)的網(wǎng)站,比較火的有icomoon、阿里巴巴圖標(biāo)庫(kù)等。
基本操作都是在線上編輯圖標(biāo),然后下載一個(gè)壓縮包,包含字體文件和樣式。首先的問(wèn)題是不同圖標(biāo)大小需要手動(dòng)調(diào)整 font-size 屬性;其次就是手工操作太頻繁:上傳 - 編輯 - 下載;最后就是依賴網(wǎng)絡(luò)環(huán)境,沒(méi)網(wǎng)絡(luò)就沒(méi)法編輯圖標(biāo)。既然如此,我們嘗試使用自動(dòng)化工具離線生成文件。
自動(dòng)化工具
依然使用的是github上star數(shù)比較多的模塊 gulp-iconfont ,但是要同時(shí)生成css還需另一個(gè)模塊 gulp-iconfont-css。
配置文件
配置 gulpfile.js
var gulp = require('gulp');
var $ = require('gulp-load-plugins')();
gulp.task('iconfont', function () {
// 先配置樣式,再配置字體文件
return gulp.src(['src/*.svg'])
.pipe($.iconfontCss({
fontName: 'iconfont', //字體名
path: './src/font_template.css', //模板文件路徑
cssClass: 'iconfont' //樣式類名
}))
.pipe($.iconfont({
fontName: 'iconfont', //字體名
formats: ['ttf', 'eot', 'woff', 'woff2', 'svg'] //輸出的字體文件格式
}))
.pipe(gulp.dest('dist/font'));
});
此處省略模板文件~
開發(fā)流程
配置完成之后,在源文件夾中放入兩個(gè) question.svg、hook.svg 兩個(gè)小圖標(biāo)進(jìn)行調(diào)試。
gulp 處理后生成了6個(gè)文件: _icon.css、iconfont.eot、iconfont.svg、iconfont.ttf、iconfont.woff、iconfont.woff2。 打開 _icon.css,可以看到根據(jù)圖標(biāo)名生成了兩個(gè)樣式類:
@font-face {
font-family: "iconfont";
src: url('./iconfont.eot');
src: url('./iconfont.eot?#iefix') format('eot'),
url('./iconfont.woff2') format('woff2'),
url('./iconfont.woff') format('woff'),
url('./iconfont.ttf') format('truetype'),
url('./iconfont.svg#iconfont') format('svg');
}
.iconfont:before {
font-family: "iconfont";
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-style: normal;
font-variant: normal;
font-weight: normal;
/* speak: none; only necessary if not using the private unicode range (firstGlyph option) */
text-decoration: none;
text-transform: none;
}
.iconfont-hook:before {
content: "\E001";
}
.iconfont-question:before {
content: "\E002";
}
在代碼中使用起來(lái)也很簡(jiǎn)單
// 引用生成的css文件 <link rel="stylesheet" href="./font/_icons.css" charset="utf-8"> ... //直接給標(biāo)簽添加樣式類 <i class="iconfont iconfont-hook"></i> <i class="iconfont iconfont-question"></i>
預(yù)覽效果見文末截圖
使用問(wèn)題
和之前的介紹的工具一樣,可以使用模板,也可以生成scss、less、css多種格式文件。蛋疼的問(wèn)題是:生成的所有的字體圖標(biāo)都會(huì)取最高的那個(gè)圖標(biāo)的高度。也就是說(shuō)一些圖標(biāo)需要重新設(shè)置高度! 自動(dòng)化操作瞬間降級(jí)為半自動(dòng)化~而且生成的圖片還帶鋸齒(不知道是不是配置問(wèn)題),所以只能算是失敗的方案。
svg sprite
正當(dāng)愁眉不展之時(shí),看到張?chǎng)涡褚黄恼隆?a rel="external nofollow" target="_blank" >未來(lái)必?zé)幔篠VG Sprite技術(shù)介紹》
(末尾的結(jié)束語(yǔ)將字體圖標(biāo)和svg sprite做了對(duì)比,有興趣的朋友可以看一下)才讓我感覺(jué)柳暗花明:原來(lái)還有更強(qiáng)大的svg sprite。將svg矢量圖標(biāo)整合成一個(gè)svg文件,使用的時(shí)候以 symbol 或 use 等標(biāo)簽的形式展現(xiàn)。
手動(dòng)操作
考慮這個(gè)方案之時(shí)就沒(méi)打算用手動(dòng)化,因?yàn)槿绻枰謩?dòng)操作還不如使用字體圖標(biāo),所以直接考慮自動(dòng)化工具。
自動(dòng)化工具
使用的是github上star數(shù)僅次于gulp-svgstrore的模塊 gulp-svg-sprite 。支持scss、less、css文件格式輸出。
配置文件
var gulp = require('gulp');
var $ = require('gulp-load-plugins')();
gulp.task('svg', function () {
return gulp.src('./src/*.svg')
.pipe($.svgSprite({
mode: {
symbol: {
prefix: `.svg-`,
dimensions: '%s',
sprite: '../icon.svg',
symbol: true,
render: {
css: {
dest: '../icon.css'
}
}
}
}
}))
.pipe(gulp.dest('dist/svg'));
});
開發(fā)流程
整個(gè)流程同上,配置完成之后,在源文件夾中放入兩個(gè) question.svg、hook.svg 兩個(gè)小圖標(biāo)進(jìn)行調(diào)試。
gulp 處理后生成了2個(gè)文件: icon.svg、icon.css。 打開 icon.css,可以看到根據(jù)圖標(biāo)名生成了兩個(gè)樣式類:
.svg-hook {
width: 16px;
height: 16px;
}
.svg-question {
width: 40px;
height: 40px;
}
非常簡(jiǎn)潔有么有!??!
使用起來(lái)稍稍復(fù)雜一點(diǎn):
//引用樣式文件 <link rel="stylesheet" href="./svg/icon.css" charset="utf-8"> ... <svg class="svg-hook"> <use xlink:href="./svg/icon.svg#hook"></use> </svg> <svg class="svg-question"> <use xlink:href="./svg/icon.svg#question"></use> </svg>
預(yù)覽效果見文末截圖
相比字體圖標(biāo):
- 據(jù)說(shuō)SVG圖標(biāo)跟字體圖標(biāo)相比,還支持漸變,甚至彩色圖標(biāo)。
- 改變大小直接調(diào)整width和height屬性即可,而不是調(diào)整font-size那種“曲線救國(guó)”的方式。
- 填充顏色也很簡(jiǎn)單,設(shè)置fill屬性的值即可(前提是svg中不能使用fill,如果svg自帶fill屬性,設(shè)置失效)。
使用問(wèn)題
所有的IE瀏覽器(包括IE11)還不支持獲得外鏈SVG文件某個(gè)元件。但是也很好解決,使用第三方j(luò)s即可——svg4everybody。
總結(jié)
文中所示代碼地址:https://github.com/yalishizhude/sprite-demo 或者可以本地下載

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章

純CSS3實(shí)現(xiàn)的動(dòng)態(tài)天氣小圖標(biāo)特效源碼
是一段實(shí)現(xiàn)了各大網(wǎng)站中經(jīng)常出現(xiàn)的動(dòng)態(tài)天氣圖標(biāo)效果的代碼,本款代碼是純CSS3實(shí)現(xiàn)的天氣出太陽(yáng),下雨,雷陣雨等動(dòng)畫圖標(biāo)特效代碼,本段代碼適應(yīng)于所有網(wǎng)頁(yè)使用,有興趣的朋2015-06-16
純CSS3實(shí)現(xiàn)的帶小圖標(biāo)和tooltip提示框的垂直下拉菜單效果源碼
這是一款效果非常不錯(cuò)的CSS3垂直下拉菜單,菜單左側(cè)是每一個(gè)菜單項(xiàng)的功能小圖標(biāo),右側(cè)也可以定義一些數(shù)字小圖標(biāo),并且在菜單項(xiàng)最右側(cè)是tooltip的樣式2014-11-07
純CSS3實(shí)現(xiàn)的帶小圖標(biāo)垂直動(dòng)畫菜單效果源碼 效果很酷
今天我們來(lái)分享一款CSS3垂直菜單,這款垂直菜單不僅有漂亮的小圖標(biāo),而且鼠標(biāo)滑過(guò)時(shí)還有非??岬腃SS3動(dòng)畫,大家可以試試這款CSS3垂直菜單2014-11-07
今天要向大家分享一款基于CSS3和jQuery的帶小圖標(biāo)精美輸入表單,該CSS3表單一共有3款樣式,需要高版本的瀏覽器才能支持,不過(guò)真的是一款很酷的CSS3表單。2014-10-27通過(guò)CSS樣式來(lái)修改ExtJS:TreePanel的小圖標(biāo)
這篇文章主要介紹了如何通過(guò)CSS樣式來(lái)修改ExtJS:TreePanel的小圖標(biāo),下面有個(gè)不錯(cuò)的示例,大家可以參考下2014-05-28
CSS3+SVG鏤空效果質(zhì)感背景小圖標(biāo)按鈕
一款用CSS3和SVG實(shí)現(xiàn)的質(zhì)感背景小圖標(biāo)2014-04-23
HTML5+CSS3內(nèi)置功能按鈕提示框帶有關(guān)閉小圖標(biāo)
一款功能的HTML5+CSS3彈出提示框,帶有小圖標(biāo),而且可以關(guān)閉提示框2014-04-23- 文字前的小圖標(biāo)在一些列表展示中特別的有用,本文會(huì)介紹一些實(shí)現(xiàn)的此效果的具體方法,感興趣的你可不要錯(cuò)過(guò)了哈,希望本教程對(duì)你有所幫助2013-03-20

css3實(shí)現(xiàn)按鈕背景小圖標(biāo)旋轉(zhuǎn)效果
css3實(shí)現(xiàn)按鈕背景小圖標(biāo)旋轉(zhuǎn)效果,喜歡的朋友可以測(cè)試下2012-10-03








