雪碧圖工具sprity
原文 http://segmentfault.com/a/1190000003915988
前身是css-sprite,前幾天幫新同事搭建環境,意外發現sprity在window下可以安裝成功了,同時也發現node版本已經4點幾了,自己電腦的版本還停留在0.10,趕緊把自己的node升級到最新版本,win10下,sprity安裝成功,可以使用。
在這里介紹下sprity順便提下自己遇到的問題。
介紹
sprity,一個模塊化的雪碧圖生成工具,會根據目錄中的圖片生成相應的雪碧圖和樣式文件,支持retina圖,可以內嵌base64 編碼格式的圖,支持不同的圖片格式和有不同的圖片引擎可以選擇。
安裝使用
通過npm安裝
npm install sprity --save
也可以全局安裝使用
npm install sprity -g
結合gulp使用,也可以用grunt,這里說下gulp的用法:
var gulp = require('gulp'); var gulpif = require('gulp-if'); var sprity = require('sprity');// 創建sprites任務 gulp.task('sprites', function () { return sprity.src({ src: './src/images/*/.{png,jpg}', //需要進行合并的圖片路徑 style: './sprite.css', //生成的樣式文件名和格式,可以生成scss // 還有很多其他參數,如指定模板、圖片格式、前綴、名稱和圖片合并的方向等,具體可以查看sprity的github內容 processor: 'sass', // 生成的樣式格式 }) .pipe(gulpif('*.png', gulp.dest('./dist/img/'), gulp.dest('./dist/css/'))) });</pre>
配置好options,把圖片放進目錄中,運行gulp sprites,就可以生成對應的雪碧圖和樣式文件了。
sprity支持三種圖片引擎,sprity-lwip、sprity-canvas和sprity-gm。默認使用的是sprity-lwip,好像lwip需要重新編譯node-gyp什么的,所以當時我還是win7系統的時候,經常會報錯,無法編譯成功。另兩個沒試過,不展開說,有興趣的可以去試著使用下。
模板
sprity采用handlebar來處理模板,已經寫好有模板案例可以參考, sprity-css
問題
使用途中,我遇到一個問題無法解決,一個gulp任務里面,我想同時分開生成多張雪碧圖,不知道為什么生成的圖和樣式會合并在一起。
例如,我這樣寫:
gulp.task('sprites', function () { sprity.src({ src: '/img/icon/*.png', style: '_icon.scss', format: 'png', orientation: 'left-right', template: './sprity-css.hbs', processor: 'scss', prefix: 'icon', name: 'icon' }) .pipe(gulpif('*.png', gulp.dest('/img/'), gulp.dest('/css/'))); sprity.src({ src: topicType + '/img/bg/*.png', style: '_bg.scss', format: 'png', orientation: 'left-right', template: './sprity-css.hbs', processor: 'scss', prefix: 'bg', name: 'bg' }) .pipe(gulpif('*.png', gulp.dest('/img/'), gulp.dest('/css/'))); });最后生成兩張圖片:icon.png和bg.png,兩個樣式文件:_bg.scss和_icon.scss,這樣沒錯,可以icon的圖片和樣式里面包含有bg的圖片和樣式:
_icon.scss:
.bg { background-image: url('#{$icon-sprite-path}/bg.png'); }.bg-btn-tg { background-position: -526px -196px; width: 80px; height: 32px; } .icon { background-image: url('#{$icon-sprite-path}/icon.png'); }
.icon-btn-tg { background-position: -510px -280px; width: 80px; height: 32px; }</pre>
_bg.scss:
.bg { background-image: url('#{$icon-sprite-path}/bg.png'); }.bg-btn-tg { background-position: -526px -196px; width: 80px; height: 32px; }</pre>
我不確定是gulp流的問題,還是模板的問題,因為模板循環的是一個數組來的。sprity-css.hbs:
{{#each layouts}} {{#each sprites}}{{#if dpi}} @media (-webkit-min-device-pixel-ratio: {{ratio}}), (min-resolution: {{dpi}}dpi) { {{/if}} .{{cssesc ../classname}} { background-image: url('{{escimage url}}'); {{#if dpi}} background-size: {{baseWidth}}px {{baseHeight}}px; {{/if}} } {{#if dpi}} } {{/if}}
{{/each}}
{{#each layout.items}} .{{../classname}}-{{meta.name}} { background-position: -{{baseDim x}}px -{{baseDim y}}px; width: {{baseDim width}}px; height: {{baseDim height}}px; } {{/each}} {{/each}}</pre></div>