背景

在开发过程中,我们需要用到很多图标,这些图标的大小不是很大,但是每次需要向服务器发送请求,从而加重服务器的负担,尤其是当网站处于高访问量的情况下或网络不稳定的时候,服务器性能会明显下降。这种情况不符合被广泛遵循的雅虎军规“尽量减少HTTP请求数”的要求(雅虎前端优化的35条军规)。

为了避免这种情况,我们需要使用到雪碧图将这些图标整合到一张图片上,再使用CSS背景及其定位,将需要显示的图标移动到元素背景中。

传统方式,我们需要将图标拼接到一张图片上,计算好位置信息,这种方式维护起来比较麻烦。自从有了打包工具grunt、gulp和webpack之后,这一切似乎容易了许多。这里我重点介绍webpack雪碧图插件webpack-spritesmith的使用。

雪碧图插件 webpack-spritesmith 详解

本人是在 vue-cli 中增加了该雪碧图插件,关键步骤如下,细节上以 vue-cli 为背景,其他框架类似配置。

1. 安装配置

首先在项目中按照官方说明 install 之后,在 bulid/webpack.base.conf.js 中进行如下配置。需要说明的是,雪碧图是开发模式和生产模式都要使用的功能,因此我们在 webpack 的基础配置中进行设置。

1.1 首先引入插件 const SpritesmithPlugin = require('webpack-spritesmith');;

1.2 其次在 module.rules 将 png 图标的默认配置注释掉,避免 url-loader 将其编译成行内图片,同时单独设置 png 图标的配置,如下:

{

// test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, // 注释掉原有配置,去掉对png图标的匹配

test: /\.(jpe?g|gif|svg)(\?.*)?$/,

loader: 'url-loader',

options: {

limit: 10000,

name: utils.assetsPath('img/[name].[hash:7].[ext]')

}

},

// 对图标单独设置,以便生成雪碧图

{

test: /\.png$/,

loaders: [

'file-loader' // 使用 file-loader 对 png 图标进行设置

]

},

1.3 接着在 webpack 的配置对象中找到 plugins 属性(没有请自行创建),添加雪碧图的处理。基本配置如下:

plugins: [

// 雪碧图设置

new SpritesmithPlugin({

src: {

cwd: path.resolve(__dirname, '../src/assets/images/icons/'), // 图标根路径

glob: '**/*.png' // 匹配任意 png 图标

},

target: {

image: path.resolve(__dirname, '../src/assets/css/sprites-generated.png'), // 生成雪碧图目标路径与名称

// 设置生成CSS背景及其定位的文件或方式

css: [

[path.resolve(__dirname, '../src/assets/css/sprites-generated.css'), {

format: 'function_based_template'

}]

]

// css: path.resolve(__dirname, '../src/assets/spritesmith-generated/sprite.less')

},

customTemplates: {

'function_based_template': templateFunction,

},

apiOptions: {

cssImageRef: "./sprites-generated.png", // css文件中引用雪碧图的相对位置路径配置

},

})

],

这里我使用的是CSS定制方式,即在 target.css 中,配置对应的format函数名 function_based_template(注意数组元素的层次关系,切勿配错)。然后在 customTemplates 中配置对应名称的属性名。

这里我引用了自定义函数 templateFunction,该函数基本参考了官方示例。由于本人使用的是二倍图,所以此处使用了图片缩放和垂直居中的方式。大家选择参考:

const templateFunction = function (data) {

// console.log(data.sprites);

const shared = '.w-icon { background-image: url(I); }'

.replace('I', data.sprites[0].image);

// 注意:此处默认图标使用的是二倍图

const perSprite = data.sprites.map(function (sprite) {

// background-size: SWpx SHpx;

return '.w-icon-N { width: SWpx; height: SHpx; }\n.w-icon-N .w-icon, .w-icon-N.w-icon { width: Wpx; height: Hpx; background-position: Xpx Ypx; margin-top: -SHpx; margin-left: -SWpx; } '

.replace(/N/g, sprite.name)

.replace(/SW/g, sprite.width / 2)

.replace(/SH/g, sprite.height / 2)

.replace(/W/g, sprite.width)

.replace(/H/g, sprite.height)

.replace(/X/g, sprite.offset_x)

.replace(/Y/g, sprite.offset_y);

}).join('\n');

return shared + '\n' + perSprite;

};

其实关键之处就是利用定制函数,将参数中每个图标的信息用来进行样式的定制。这些信息中包括图标名、宽高和在雪碧图中的位置信息等。

当然我们也可以将目标生成成 less 文件,然后再进行使用(示例代码中注释部分)。但本人发现会生成大量变量,而这些变量我们并不经常使用,所以本人没有采用这种方式。

2. 使用方法

进行完上述配置之后,再在我们配置的源文件夹中添加我们需要处理的图标。然后启动 vue-cli 的开发者模式 npm run start(其他框架,运行对应命令)。

启动完成之后,我们可以发现在目标目录下生成了 sprites-generated.png 和 sprites-generated.css 两个文件。在样式文件中,形如:

.w-icon { background-image: url(./sprites-generated.png); }

.w-icon-apply { width: 25.5px; height: 27px; }

.w-icon-apply .w-icon, .w-icon-apply.w-icon { width: 51px; height: 54px; background-position: -208px -58px; margin-top: -27px; margin-left: -25.5px; }

接下来就是在使用组件中引用上述样式即可。

3.遇到的问题

3.1 放大页面时,有些雪碧图标边缘出现相邻图标的边缘,从而出现白线,怎么破?

做完雪碧图之后,高高兴兴的拿给UI参看一下,没过多久就被鄙视了:怎么页面放大时,旁边有一条白线?

纳尼?怎么可能啊!仔细一看,放大之后有些图标周边出现一些线条,而有些图标则没有。而不放大时,则没有这种情况。

难道是其他图表也显示进来了?再回去看看生成的雪碧图,果然是一个图标一个图标的紧紧的靠在一起,即图标之间没有空隙。而且有些图标计算的结果有 .5px ,我们知道有些浏览器会解析成1px,从而出现上述问题,瞬间恍然大悟。

于是仔细翻阅官方说明,其中提到核心组件是 spritesmith and spritesheet-templates ,于是进入 spritesmith 插件中查阅,发现果然有关于边距问题的描述和解决方法 spritesmith: padding。

可是在 webpack-spritesmith 又该怎么使用呢?

查阅 webpack-spritesmith 源代码和文档,发现:

spritesmithOptions - optional. Options for spritesmith

好的,就是你啦!然后在 webpack 配置文件中,增加 padding 属性,这里单位为 px:

plugins: [

// 雪碧图设置

new SpritesmithPlugin({

// ... 省略其他配置

// 核心组件配置

spritesmithOptions: {

padding: 4,

}

})

],

重新启动项目编译,打开雪碧图和样式,发现图标之间有间隙了,且放大页面后,图标边缘也没有出现白线问题。好了,搞定!

总结

有了这个插件之后,我们就可以在配置目录下动态添加图标,此时webpack 会立即重新编译生成新的雪碧图和对应样式,这样我们就可以在页面上立刻使用对应图标,再也不用担心自己设置的 background-position 有不对的地方了。好了,Have Fun!

在html中雪碧图的坐标怎么看,Webpack中雪碧图使用详解相关推荐

  1. ❤️导图整理数组6:四数组的四数之和,详解Counter类实现哈希表计数,力扣454❤️

    此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...

  2. 在html中雪碧图的坐标怎么看,详解CSS Sprite雪碧图的应用

    CSS雪碧图,即CSS Sprite,也有人叫它CSS精灵图,是一种图像拼合技术.该方法是将多个小图标和背景图像合并到一张图片上,然后利用CSS的背景定位来显示需要显示的图片部分. 雪碧图的使用场景 ...

  3. 京东主图怎么保存原图_京东自营怎么做?详解京东平台操作方法

    随着2020年实体行业的受损,越来越多企业想要做出改变以打破目前的僵局.于是大家都盯上了受疫情冲击最小的电商行业.但是做电商自己完全没经验啊,该怎么办呢? 这时候就有人想到了京东自营,一个你只要往仓库 ...

  4. 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解

    邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...

  5. python数据挖掘课程】二十一.朴素贝叶斯分类器详解及中文文本舆情分析

    #2018-04-06 13:52:30 April Friday the 14 week, the 096 day SZ SSMR python数据挖掘课程]二十一.朴素贝叶斯分类器详解及中文文本舆 ...

  6. 图注意力网络GAT - 《Graph Attention Networks》论文详解

    目录 前言 正文 图注意力机制层(Graph Attentional Layer) 层的输入 注意力系数 归一化注意力系数 通过邻居节点更新自身节点 层的输出 GAT相比于先前研究的优势 附作者简介 ...

  7. 数据库学习笔记第三弹——MySQL常用的图形化管理辅助工具及相关问题(图文详解2022))

    数据库学习笔记第三弹--MySQL常用的图形化管理辅助工具(图文详解2022) 文章目录 数据库学习笔记第三弹--MySQL常用的图形化管理辅助工具(图文详解2022) 1.MySQL常用的图形化管理 ...

  8. html画折线图没有坐标数值,教大家excel折线图纵坐标轴数值与实际值不一致怎么办...

    近日有关于excel折线图纵坐标轴数值与实际值不一致怎么办的问题受到了很多网友们的关注,大多数网友都想要知道excel折线图纵坐标轴数值与实际值不一致怎么办的具体情况,那么关于到excel折线图纵坐标 ...

  9. cityscapes场景图_图像语意分割训练Cityscapes数据集SegNet-ConvNet神经网络详解

    版权声明:本文首发于本人CSDN博客. 前言:经过将近一个月的陆续学习研究,在神经网络中训练多分类任务识别Cityscapes数据集,终于在最近得到了理想中的实验结果.在我陷入对细节参数调整不当及诸多 ...

最新文章

  1. 上升沿判断语句_FPGA入门系列6判断语句
  2. spring 使用redis集群配置
  3. 多 LDAP 目录服务器的 FileNet P8 系统介绍和配置实例
  4. 深圳.NET俱乐部7月活动小结及照片
  5. oracle count最快的方法,Oracle count哪种写法更快
  6. kattis ones简单题取模运算+枚举
  7. Java字符串、文件MD5工具类
  8. 开放下载!《阿里云存储白皮书》全面解读阿里云存储二十年的技术演进
  9. git push时如果不再弹出用户和密码的输入提示框该怎么办
  10. SQLServer数据库实例相关知识笔记
  11. java中的规范是什么意思_Java中的异常规范有什么好处?
  12. macos必做的设置_如何在MacOS上设置PHP,CaddyServer和Kirby —以及为什么要这样做
  13. Mysql索引成本计算规则 Optimizer Trace
  14. 数据分析,如何做才算“深入”?
  15. redis分布式锁+事务+AOP一起使用注意点
  16. SpringSecurity下做POST测试以及传递实体
  17. VMware Workstation16安装
  18. 如何利用python监控主机存活并邮件、短信通知
  19. 【Latex学习】Latex中插入超链接/网址
  20. mro python_Python之super与MRO

热门文章

  1. 妈妈写给热恋中的女儿的信!(建议女孩都要看!)
  2. java qlv转mp4 代码_Java实用工具类五:URL转码、解码类
  3. 关于kbsync的研究
  4. h5-自定义生成海报
  5. 批量查询谷歌PR权重的方法有哪些?是什么影响着谷歌PR值?
  6. 精读《素书》精彩语录及感悟篇(二)
  7. discuz x3.1 整站搬家换域名攻略
  8. 攻略:邮件搬家同一个域名操作步骤,设置邮箱搬家功能的方法
  9. poj解题报告——poj 1528 Perfection
  10. 小技巧:如何让你办公更高效(技巧大集合持续更新中)!