说明
研究了一通在webpack中生成雪碧图,尝试了两种方式:
方式一:webpack-spritesmith
方式二:postcss-sprites
参考链接:webpack-spritesmith、postcss-sprites
代码地址:demo
webpack-spritesmith
预处理:先将图片生成雪碧图,同时自动生成引用雪碧图的样式文件(css/less等预处理文件),使用时手动使用样式文件中的内容
项目路径![]()
1 | webpack.config.js |
在配置的target路径下生成图片和样式文件(demo中生成的是less文件),如下![]()
生成了两个雪碧图,一个一倍的一个两倍的,需要注意的是此方法是根据路径将路径下所有图片合成雪碧图,所以不会使用的图片及时删除,避免多余图片拖大小![]()
sprite.less文件没有截全,上部分主要都是变量,主要使用的方法是图中.sprites和.retina-sprites方法,分别处理1@x图片和2@x图片
在base.less文件中使用方式如下(具体使用方法在生成的文件注释中有说明):1
2
3
4
5
6
7
8
9
10base.less
@import "./spritesmith-generated/sprite.less";
...
.img1 {
.retina-sprite(@china-group)
}
.img2 {
.sprite(@japan)
}
效果如下:![]()
![]()
postcss-sprites
后处理:是postcss-loader的插件,两者差异在于此种方式配置好后自动全部替换成引入雪碧图,不用手动再使用,但是需要自己配置宽高!!(因为只是切换了引用雪碧图以及定位位置,但是div需要自己根据图片大小设置宽高),而webpack-spritesmith是根据图片的大小自动设置了div的宽高(见上图)
1 | webpack.config.js |
1 | postcss.config.js |
css的使用按照原图片引用1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17base.less
<!-- 需手动根据图片原大小设置宽高,这一点不太好,需要自己计算 -->
.img {
width: 100px;
height: 100px;
float: left
}
.img1 {
background-image: url("../assets/image/sp/sp1/china@2x.png")
}
.img2 {
background-image: url("../assets/image/sp/sp1/japan@2x.png")
}
.img3 {
background-image: url("../assets/image/sp/sp2/korea@2x.png")
}
效果如下:
在设置的目录下生成两个雪碧图,而且因为是替换方式,所以引用的图片才会被合成雪碧图![]()
![]()
![]()
后记
看到一篇优化移动端使用rem单位进行计算时不同浏览器对小数点的不同处理方式造成Retina屏下的CSS雪碧图问题,方式是改变源码,先马一下