雪碧圖工具sprity

jopen 9年前發布 | 9K 次閱讀 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>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!