gulp.spritesmith的學習教訓

前言:

css Sprites指的是網頁圖片的一種處理技巧,一般是將一些體積小的不常更換的圖片進行處理,目的是爲了減小HTTP請求次數,也是優化必不可少的工做。
這裏是對本身在gulp中合成雪碧圖的一些的經驗和總結!css

gulp中用於合成雪碧圖的模塊有許多,我只是針對gulp-css-spriter和gulp.spritesmith這兩個作了嘗試,在嘗試過程當中發現寫對css文件和images文件路徑是關鍵問題,只有把路徑配對了那幾乎沒有啥問題了。html

gulp-css-sprite

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

gulp.spritesmith

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

spritesmith的參數說明:

  • algorithm:如何排布合並圖片,默認是:「binary-tree」
    可選參數有:top-down、left-right、diagonal、alt-diagonal、binary-tree

clipboard.png

  • cssTemplate 值爲String或者Function
    cssTemplate用了渲染出css文件

    官網給的一個簡單demo:

Template String:

{{#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 {
/* ... */

Template function的demo:

// 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:
# ...
相關文章
相關標籤/搜索