一.  为什么要使用sprite (雪碧图)

二. CSS雪碧图原理及应用

三. 生成雪碧图的三种实现方式

一.为什么要使用雪碧图

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

例如  当我们引入如图的4个各不到1k的小图片还占用了4个请求,这显然非常浪费服务器资源

二.CSS雪碧图原理及应用

1.css方法是将小图标和背景图像合并到一张图片上,这样每个元素都会以该合成图为背景,而且页面也只加载一张合成图

然后利用CSS的背景定位(background-position)来显示需要显示的图片部分。

其中要用到 background-image,background-position

其中如下图  背景图 左上角默认和容器框重合的,现在也就是默认会显示 第一个图片 ,现在想要显示第二个图片  就需要把background-image 左移动一个(也即是X轴负方向) 所以显示的{x:-60px;y:0px}

合并图片 方法有很多,图片合并软件  , 在线合并 以及 glup   webpack工具

方法一
这里提供一个很好用的在线的图片合并网站 
http://csssprites.com/可以根据自己的需要添加边距等等,还会生成对应的参考css  如图

使用时候直接引入css 文件 ,定义好对应类名  即可
<div className='icon bg-icon1'></div>
<div className='icon bg-icon2'></div>
<div className='icon bg-icon3'></div>

方法二  目前大多数前端项目都采用 webpack打包   同时可以使用webpack-spritesmith 插件

主要用到:

  • webpack
  • webpack-spritesmith插件
  • file-loader
  • sass-loader (因为 webpack-spritesmith 除了生成雪碧图之外,还会生成相应的 mixin ,使用起来很方便,所以要用 sass )

webpack配置如下

const path = require('path');
const SpritesmithPlugin = require('webpack-spritesmith');module.export = {// ...module: {rules: [{test: /png$/loader:['file-loader?name=i/[hash].[ext]']},{test: /\.(css|scss)$/,use: ExtractTextPlugin.extract({fallback: 'style-loader',use: ['css-loader', 'postcss-loader', 'sass-loader']})}]},resolve: {modules: ['node_modules','assets' //css在哪里能找到sprite图   文件夹的名字]},plugins: [new SpritesmithPlugin({src: {cwd: path.resolve(__dirname, 'src/ico'),  //准备合并成sprit的图片存放文件夹glob: '*.png'  //哪类图片},target: {image: path.resolve(__dirname, 'src/assets/sprites.png'),  // sprite图片保存路径css: path.resolve(__dirname, 'src/assets/_sprites.scss')  // 生成的sass保存在哪里(也可以后缀改成.css 直接生成css文件,在文件中直接使用对应的类名即可)},apiOptions: {cssImageRef: "sprite.png" //css根据该指引找到sprite图}})]
}

注:这是纯webpack的配置的情况  , 现在很多项目才用create-reactp-app 方式创建的 ,上面配置的中rules 部分已经嵌入,可以省略。

下面执行npm start  命令  会在sprite文件夹生成 sprite.png   sprite.scss

除了 对应的数据外,sass文件中自动生成 mixin  如下

//webpack 自动生成的scss文件$icon1-name: 'icon1';
$icon1-x: 0px;
$icon1-y: 0px;
$icon1-offset-x: 0px;
$icon1-offset-y: 0px;
$icon1-width: 32px;
$icon1-height: 32px;
$icon1-total-width: 158px;
$icon1-total-height: 32px;
$icon1-image: '../sprite/sprite.png';
$icon1: (0px, 0px, 0px, 0px, 32px, 32px, 158px, 32px, '../sprite/sprite.png', 'icon1', );//数据略...@mixin sprite($sprite) {@include sprite-image($sprite);@include sprite-position($sprite);@include sprite-width($sprite);@include sprite-height($sprite);
}

在 自己的sass文件中  如下引用  就可以快乐的使用了 ,

//直接在页面中引入的scss文件@import '../sprite/sprite.scss';//生成的尺寸默认是原图大小  如何动态的缩放图片  如下 @mixin spriteScale($sprite,$scale) {$spriteScaled: ();$scaleItems: (3, 4, 5, 6, 7, 8);@for $i from 1 through length($sprite) {$item: nth($sprite, $i);@if (null != index($scaleItems, $i)) {$spriteScaled: append($spriteScaled, $item * $scale);} @else {$spriteScaled: append($spriteScaled, $item);}}@include sprite($spriteScaled);background-size: nth($spriteScaled, 7) nth($spriteScaled, 8);
}//注释: spriteScale 把雪碧图位置以及size涉及的尺寸 scale同样的倍数@mixin sprite_dynamic ($arg1,$arg2,$scale){@include spriteScale($arg1 ,$scale)@media (-webkit-min-device-pixel-ratio:3),(min-device-pixel-ratio: 3){@include spriteScale($arg2 ,$scale)}
}注释:sprite_dynamic 通过@media查询 ,加载2X图或者3X ,$arg1 $arg2,$scale 分别是 2X 3X图变量名  缩放倍率,具体用法如下.icon1{@include sprite_dynamic($wifi_2X,$wifi_3X ,1);
}注释 :最后在需要的类里面引用  $wifi_2x $window_3X

保存刷新页面 ,图片有显示了,但是此时network一个图片请求都没有了,在看element  dom节点,webpack  把背景图片转码为base64

这样以后添加 或者去掉一个图标,只更改少量代码,运行npm runbuild  或者npm start 就ok 的

动态加载 2X &3X图  原理如下 动态加载2X&3X

一键生成sprite(雪碧图)以及 动态加载1X 2X3X 图片相关推荐

  1. Android一键生成包含.dex的Jar及动态加载方案

    Android一键生成包含.dex的Jar及动态加载方案 背景:谈到动态加载相信很多小伙伴都会想到 热更新 及 动态加载dex 的技术,最近也因为项目重构的需求,折腾了下这方面的技术点,以前研究过但时 ...

  2. CSS Sprite雪碧图详解

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

  3. 【HTML+CSS】(2)CSS Sprite雪碧图

    1. 雪碧图的使用场景 (1). 静态图片.不随用户信息的变化而变化 (2). 小图片.图片容量比較小 (3). 载入量比較大 一些大图不建议拼成雪碧图,比如淘宝站点的导航图片都是使用的雪碧图. 2. ...

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

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

  5. SVG进阶-sprite 雪碧图

    前言 由于SVG自身的矢量性质,不管在什么情况下,图标都很清晰,可以适应不同尺寸大小和不用分辨率.不用担心模糊和锯齿.同时还能更改图标的填充颜色. CSS sprite 和SVG Sprite 传统的 ...

  6. CSS Sprite——雪碧图

    CSS Sprites技术被国内一些人称为CSS雪碧图,其实就是把网页中一些背景图片整合到一张图片文件中,再利用CSS的"background-image","backg ...

  7. 雪碧图PHP,Css Sprite(雪碧图、精灵图) - SegmentFault 思否

    一.精灵图使用场景: 二.Css Sprite(优点) 减少图片的字节. 减少网页的http请求,从而大大的提高页面的性能. 解决了网页设计师在图片命名上的困扰,只需对一张集合的图片上命名就可以了,不 ...

  8. 雪碧图的原理与实例解释

    一.原理 1.多个图标组合成一张图片构成雪碧图,通过对不同部位的提取,实现不同效果显示 如下图(图1): 2.雪碧图优点:加载一张图片在来对一张图片操作,相比于加载多张图片来说,占用资源更少,效率更快 ...

  9. webpack雪碧图生成

    原文链接:http://dopro.io/webpack-sprites.html 前言 在HTTP/2.0还没有普及的现在,css sprite(雪碧图)仍是前端工程化中必备的一环,而随着webpa ...

  10. 使用Grunt生成雪碧图

    1.Grunt是基于 Node.js 的项目构建工具,所以使用Grunt之前必须先安装好node.js和npm包管理器 2.全局安装Grunt的命令行支持,安装完之后,命令提示符中将会识别grunt命 ...

最新文章

  1. 深度学习之单目深度估计:无监督学习篇
  2. 从零开始学python电子书-从零开始学Python程序设计 PDF 完整影印版
  3. android+app+wifi+控制+协议,玩转OneNET物联网平台之MQTT服务④ —— 远程控制LED(数量无限制)+ Android App控制...
  4. 安装多个java后,java版本不对
  5. JAVA GUI重要知识点学习心得
  6. comparable和comparator比较
  7. C++:new[]和delete[]一定要配对使用吗?
  8. 盒马要造车?网友调侃:不会就搞个车轮卷蛋糕吧
  9. eclipse乱码解决
  10. 程序员如何通过 Git 来更好地提交消息?
  11. CF 570D. Tree Requests [dsu on tree]
  12. 傅里叶变换复数形式的实部代表什么_二维傅里叶变换与逆变换基于Unity的实现...
  13. 如何正确的将拼多多的买家晒图采集并保存
  14. 多多买菜,拼多多的第二增长曲线
  15. 盘点2018云栖大会的黑科技
  16. ios获取磁力计信息
  17. 超级码力在线编程大赛初赛 第2场 【题解】
  18. python爬虫爬美女图片:“小甲鱼056节轮一只爬虫的自我修养4:OOXX” 最终更新2021.6.27日,更新后可用!!!
  19. K线类型识别—单K线之同价线
  20. 如何选择合适的网银支付接口

热门文章

  1. 关于论坛数据库的设计
  2. 定时任务ScheduledExecutorService
  3. Web编程入门暨个人网站计划:Web前端开发入门
  4. JVM内存管理------GC算法简介
  5. 计算机键盘设置功能键取消,键盘insert操作怎么取消?电脑键盘insert操作取消教程...
  6. JavaScript 每日一题 #9
  7. number of lines annotated by git is not equal to number of linus in the file .check file encoding an
  8. 给Testerhome测试小道消息做个硬广告
  9. [BZOJ1779][Usaco2010 Hol]Cowwar 奶牛战争(最大流)
  10. MAL II,怀槐凝集素II(MAL II)