当前位置: 首页 > news >正文

什么叫 “雪碧图”?

大家好,我是前端西瓜哥。今天来随意聊聊雪碧图。

雪碧图是什么?

雪碧图,英文原名叫 CSS sprites。

sprite 指的是精灵。

我们喝的雪碧,它的英文也是 sprite,应该直译为 “精灵” 的。但要符合中国市场,因为你不能说我喝的饮料叫“精灵”,那特别怪。于是就走音译的路线,翻译成 “雪碧” 了。

所以雪碧图更正确的叫法应该是 “精灵图”。

那为什么叫精灵呢?

做 2D 游戏的时候,有一个术语叫做 sprite,其实就是融合了各种资源的图片,图片里面可能会有一个角色的一套动作、或是组成背景的不同内容的块 tile 等等。

游戏角色的行为(攻击、跳跃、蹲下等),表现出来其实就是不同图片的切换,状态很多,对应的图片很多,这样的话我们就要保存非常多的图片,这不太好维护(但也不是不可以)。

所以通常会将这个角色的所有动作放到一个图片上,当角色行为发生变化时,就修改位置和宽高信息截取到对应的状态图片。

图片

前端说,那我也可以这样搞嘛,我们把一些小图片(比如图标)也都整合到一张大图片,然后你通过 background-position 等属性使用你需要的区域就好了。

图片

上面是 stackoverflow 网站中,编辑器所有图标的 normal、hover、actived 状态效果。

然后我们在使用的地方用 background-position 设置好位置:

图片

雪碧图的作用

雪碧图的主要作用是减少 HTTP 请求数量

假如你有 100 张小图片,你要发起 100 个请求。如果你合并成一个大图片,那你只需要发一个请求。

这在 HTTP/1 上是有不错的优化效果的,因为 HTTP/1 下不能充分利用 TCP 带宽,一个 TCP 同时只能有一个请求,请求太多就要排队,导致严重的阻塞。

到了 HTTP/2 因为多路复用特性的缘故,则没有太大必要了,所有的请求都是通过流的方式打散发送的,充分利用 TCP 的带宽。

另一个作用是 提前加载好需要用到的图片

假设我们的一个按钮是用图片做的,hover 时会替换图片。如果分成独立的两个图片,hover 就会出现闪烁的效果。

这是因为图片还没有下载好,在图片完成下载前,显示的是空白,直到图片下载完成才替换上图片。

如果我们将按钮的所有状态都放到雪碧图了,就不会有这个问题了。当然还有一种方式就是通过 JS 手动做其他状态小图片的缓存。

结尾

雪碧图其实和雪碧没关系,它和 sprite(精灵)有关系。

sprite 是一种将多个图片资源合并成一张大图片的做法,用到网页,能减少 HTTP 请求数量,以及提前加载一些还未使用的小图片。

我是前端西瓜哥,关注我,学习更多前端知识。

相关文章:

  • 公众号网课搜题题库使用方法
  • Excel中身份证号码相关操作详解
  • 如何用4行 C 代码实现一个跨平台的命令行 mp3 播放器
  • ES 查询用法
  • golang泛型
  • 如何快速安装JDK 1.8 以及配置环境变量
  • DataGrip 如何导出和恢复整个数据库数据,使用单个 SQL 文件
  • 基于SpringBoot+MyBatisPlus+DynamicDatasource+mysql的多数据源本地事务方案
  • 计算机毕业设计ssm+vue基本微信的健康食谱交流 论坛小程序
  • 天龙八部科举答题问题和答案(全5/8)
  • Python Matplotlib库:基本绘图补充
  • 类与对象(下)
  • 【DouZero】 强化学习+self play达到人类玩家斗地主水平。
  • CMake Tutorial 巡礼(5)_添加系统自察
  • 注意力机制(attention)学习笔记
  • 77. Combinations
  • ES6简单总结(搭配简单的讲解和小案例)
  • golang中接口赋值与方法集
  • JavaScript异步流程控制的前世今生
  • java多线程
  • Java多线程(4):使用线程池执行定时任务
  • JAVA多线程机制解析-volatilesynchronized
  • jquery cookie
  • Laravel Mix运行时关于es2015报错解决方案
  • Spark学习笔记之相关记录
  • unity如何实现一个固定宽度的orthagraphic相机
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 简析gRPC client 连接管理
  • 目录与文件属性:编写ls
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何进阶一名有竞争力的程序员?
  • 深度解析利用ES6进行Promise封装总结
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 首页查询功能的一次实现过程
  • 湖北分布式智能数据采集方法有哪些?
  • ​TypeScript都不会用,也敢说会前端?
  • ​渐进式Web应用PWA的未来
  • #FPGA(基础知识)
  • #控制台大学课堂点名问题_课堂随机点名
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (附源码)ssm高校实验室 毕业设计 800008
  • (九)One-Wire总线-DS18B20
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)Linq学习笔记
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化