Web 项目使用的JQuery框架,项目时间比较久了,图片积累下来,大概光图片就有一两百个,为了减少网络请求数量和加载时间,项目做一个统一的规整,将小图标全部放在精灵图(雪碧图)上。
两百多个小图标,对于UI设计师来说,应该也满多大,后来就在网上找了一个工具,可以把小图标整合在一个雪碧图图上。工具链接为:https://www.toptal.com/developers/css/sprite-generator
合成雪碧图之后 ,最重要 的工作来了,将项目中的引入jpg或者png 的地方,换成雪碧图的方式来进行修改。
在网上找了半天,也看了别的vue项目,但是不行。
vue项目中可以使用工具postcss 进行css的处理,最终的代码如下:
@define-mixin sprite $viw, $vih, $riw, $rih, $rix, $riy, $rpw: 452, $rph: 547 {
width: bpcalc($viw);
height: bpcalc($vih);
background-image: url(../../../static/assets/csss.png);
background-repeat: no-repeat;
background-size: bpcalc(($viw * $rpw)/ $riw) bpcalc(($vih * $rph)/ $rih);
background-position: -bpcalc(($viw * $rix) / $riw) -bpcalc(($vih * $riy)/$rih);
},
对应的在JQuery 中,我没有找的可以使用这种工具。
只能苦逼逼的自己想办法处理了。
一开始不是特别理解意思,想着background-size对应的是图片在页面上的大小,结果完全不对,全部否认之前的认识,一切重新开始。
我专门写了一个对应的函数来处理处结果。函数如下:
/* * $viw 页面上显示的宽度 * $vih 页面上显示的高度 * $riw 雪碧图上图标的宽度 * $rih 雪碧图上图标的高度 * $rix 雪碧图上图标的x轴坐标 * $riy 雪碧图上图标的y轴坐标 * $rpw 图片总宽度 * $rph 图片总高度 * */ function sprite($viw, $vih, $riw, $rih, $rix, $riy, $rpw, $rph){ var w = $viw / $riw; var h = $vih / $rih; var bg_widsize = (w * $rpw / 75).toFixed(2); var bg_heisize = (h * $rph / 75).toFixed(2); var bg_widposi = (w * $rix / 75).toFixed(2); var bg_heiposi = (h * $riy / 75).toFixed(2); Utils.Console.log('background-size:'+bg_widsize + 'rem ' + bg_heisize + 'rem;' + 'background-position:-' + bg_widposi + 'rem -' + bg_heiposi + 'rem;'); return 'background-size:'+bg_widsize + 'rem ' + bg_heisize + 'rem;' + 'background-position:' + bg_widposi + 'rem ' + bg_heiposi + 'rem;'; }对应的参数上面注释就有。
每一个对应的$rpw / 75类似,是将px转换成rem,不同的项目转换的不一样,也可以不转换,返回的结果用px接受。
举一个例子(单位为:px),假如一个图标iconA,在设计图上实际显示的大小是20*30,在雪碧图上大小实际是40*60,雪碧图的整体大小为1000*1000,实现原理是,先将雪碧图缩小,缩小倍数是宽:20/40,高30/60,对应的background-size的值时表示雪碧图整体的大小,background-position的值表示这个图标 在雪碧图上的坐标。