css Sprites指的是網頁圖片的一種處理技巧,一般是將一些體積小的不常更換的圖片進行處理,目的是爲了減小HTTP請求次數,也是優化必不可少的工做。
這裏是對本身在gulp中合成雪碧圖的一些的經驗和總結!css
gulp中用於合成雪碧圖的模塊有許多,我只是針對gulp-css-spriter和gulp.spritesmith這兩個作了嘗試,在嘗試過程當中發現寫對css文件和images文件路徑是關鍵問題,只有把路徑配對了那幾乎沒有啥問題了。html
tip:這個模塊好久沒有更新了,下載量也很小,瞭解一下便可,能夠有時候也是能夠用到的.
首頁看一下目錄結構方便對照觀察瞭解:git
var gulp=require("gulp"), spriter=require('gulp-css-spriter'); gulp.task('sprite',function(){ var timestamp= + new Date();//生成時間戳 gulp.src('src/spriteTest/css/test.css') .pipe(spriter({ // 生成的spriter的位置 'spriteSheet':'src/spriteTest/dist/images/sprite_'+timestamp+'.png', // 生成樣式文件圖片引用地址的路徑 'pathToSpriteSheetFromCSS':'../images/sprite_'+timestamp+'.png' })) //圖片合併後css文件中圖片名也響應替換掉輸出的css文件的目的地址 .pipe(gulp.dest('src/spriteTest/dist/css/')); /*.pipe(autoprefixer({ browsers:['last 2 Chrome versions', 'Safari >0', 'Explorer >0', 'Edge >0', 'Opera >0', 'Firefox >=20'], cascade:false, remove:false }))*/ });
說明在編譯css的時候背景圖都加了一個參數用了說明是要css sprite的;
例如test.css文件中添加了"?__spriter"用來標識是要替換的github
.icon1:after { background: url("../images/icon1.png?__spriter") no-repeat center center; } .icon2:after { background: url("../images/icon2.png?__spriter") no-repeat center center; } .icon3:after { background: url("../images/icon3.png?__spriter") no-repeat center center; } .icon4:after { background: url("../images/icon4.png?__spriter") no-repeat center center; }
當你在npm install gulp-css-sprite --save-dev下該模塊時是默認不加標識的,從網上了解到修改該模塊能夠加上標識,這裏就不具體說明了,能夠參考以下博文自行修改:npm
博客園:http://www.cnblogs.com/dreamb...gulp
spritesmith的做用就是拼接圖片並生成樣式表,而且還能輸出SASS,Stylus,LESS甚至是JSON。
這個模塊不須要事先寫一個css文件而後根據css去尋找圖片進行合併,這個模塊是將但願合併的小圖先進行合併而後根據cssTemplate去生成css文件
先看文件目錄:優化
//雪碧圖gulp.spritesmith gulp.task('spritesmith',['clean'],function(){ return gulp.src('src/spriteTest/images/*.png') .pipe(spritesmith({ imgName:'images/sprite20161010.png', //保存合併後圖片的地址 cssName:'css/sprite.css', //保存合併後對於css樣式的地址 padding:20, algorithm:'binary-tree', cssTemplate:"src/spriteTest/handlebarsStr.css" })) .pipe(gulp.dest('//雪碧圖gulp.spritesmith
gulp.task('spritesmith',['clean'],function(){ui
return gulp.src('src/spriteTest/images/*.png') .pipe(spritesmith({ imgName:'images/sprite20161010.png', //保存合併後圖片的地址 cssName:'css/sprite.css', //保存合併後對於css樣式的地址 padding:20, algorithm:'binary-tree', cssTemplate:"src/spriteTest/handlebarsStr.css" })) .pipe(gulp.dest('src/spriteTest/dist'));
})'));url
})
說明一下路徑問題:
1.imgName上寫的路徑是相對於輸出路徑(gulp.dest),上述代碼輸出的路徑實際是:
"src/spriteTest/dist/images/sprite20161010.png"
2.同理cssName的輸出路徑也是同樣的:
"src/spriteTest/dist/css/sprite.css"
-~v~- 若是不注意這些路徑會不容易找見生成的文件滴!spa
algorithm:如何排布合並圖片,默認是:「binary-tree」
可選參數有:top-down、left-right、diagonal、alt-diagonal、binary-tree
cssTemplate 值爲String或者Function
cssTemplate用了渲染出css文件
官網給的一個簡單demo:
{{#sprites}} .icon-{{name}}:before { display: block; background-image: url({{{escaped_image}}}); background-position: {{px.offset_x}} {{px.offset_y}}; width: {{px.width}}; height: {{px.height}}; } {{/sprites}}
輸出的爲:
.icon-fork:before { display: block; background-image: url(sprite.png); background-position: 0px 0px; width: 32px; height: 32px; } .icon-github:before { /* ... */
// var yaml = require('js-yaml'); { imgName: 'sprite.png', cssName: 'sprite.yml', cssTemplate: function (data) { // Convert sprites from an array into an object var spriteObj = {}; data.sprites.forEach(function (sprite) { // Grab the name and store the sprite under it var name = sprite.name; spriteObj[name] = sprite; // Delete the name from the sprite delete sprite.name; }); // Return stringified spriteObj return yaml.safeDump(spriteObj); } }
輸出爲:
fork: x: 0 "y": 0 width: 32 height: 32 source_image: /home/todd/github/gulp.spritesmith/docs/images/fork.png image: sprite.png total_width: 64 total_height: 64 escaped_image: sprite.png offset_x: -0.0 offset_y: -0.0 px: x: 0px "y": 0px offset_x: 0px offset_y: 0px height: 32px width: 32px total_height: 64px total_width: 64px github: # ...