gulp 生成 css-spriter

田七發表於2018-09-07
使用gulp-css-spriter 預設會合並CSS中的所有圖片,即生成一張css spriter圖片

檔案路徑:
  • index.html
  • gulpfile.js
  • sass
    • a.sass
    • b.sass
  • img //存放原始圖片和css spriter圖片
    • 1.png
    • 2.png
  • css //存放壓縮後的css和經過圖片處理的css檔案


gulpfile.js頁面

var gulp = require('gulp'),    
    sass = require('gulp-sass'),    
    minifycss = require('gulp-minify-css'),    
    concat = require('gulp-concat'),    
    merge = require('merge-stream'),    
    spriter = require('gulp-css-spriter'),    
    rename = require('gulp-rename');

//正常的編譯sass 和壓縮
gulp.task('css1', function() {    
   var miancss = gulp.src(['./sass/b.scss', './sass/a.scss'])        
     .pipe(sass()).pipe(minifycss()) //對樣式進行壓縮        
     .pipe(concat('./main.min.css'))        
     .pipe(gulp.dest('./css/'));    
   return merge(miancss);
});

//合併css圖片 --執行了css1,編譯了sass之後。  再執行css2壓縮裡面的圖片
gulp.task('css2', ['css1'], function () {    
  gulp.src(['./css/main.min.css']) //該任務針對的檔案         
  .pipe(spriter({            
    // 生成的spriter圖片存放的位置            
    spriteSheet: './img/a.png',            
    // 生成後的樣式檔案圖片引用地址的路徑            
    pathToSpriteSheetFromCSS: '../img/a.png'}      
  ))       
  .pipe(rename('a.min.css'))        
  .pipe(gulp.dest('./css/'));
});

複製程式碼

sass || css裡的圖片最終會被合成一張,並且在最終的樣式檔案裡,圖片引入的地址全部變成自定義的spriter地址,還會自己加上background-postion。如果原來選擇器裡就有background-position,則會覆蓋。

注意,原本就使用了css spriter的圖片在這一環合併會出錯。它會直接覆蓋掉原本的background-postion。


sass || css裡不需要特別申明,會直接全部圖片都合併。如果圖片路徑後面加了?xx則該圖片不參與合併


如果希望只合並檔案裡的部分圖片,可以修改 gulpfile.js裡的spriter屬性includeMode

includeMode:
  • explicit 直接宣告需要合併圖片在圖片前加/* @meta {"spritesheet": {"include": true}} */的最終會被合併成一張圖片
  • implicit 為預設值,會把所有定義的圖片最終合併為一張。其中不包含定義了/* @meta {"spritesheet": {"include": false}} */的圖片
舉例:

設定includeMode:"implicit",或者不設定時:

如果需要某些圖片不參與合併,則在sass程式碼前面申明:

/* @meta {"spritesheet": {"include": false}} */
background:url(../a.jpg); //則a.jpg不參與合併,切記meta放在background上面,並且壓縮後不要去掉註釋


設定includeMode:"explicit":

如果需要某些圖片需要被合併,則在sass程式碼前面申明,最終生成的圖片會包含所有定義為true的圖片:

/* @meta {"spritesheet": {"include": true}} */