CSS——sprites的的原理和作用_csssprites-程序员宅基地

技术标签: css  firefox  前端  

相信大家和我一样之前都没听过sprites这个东西吧,我也是在一次面试题中遇到,这个问题经常会出现在企业面试题中。

CSS Sprites在国内很多人叫css精灵,是一种网页图片应用处理方式。它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片就不会像以前那样一幅一幅地慢慢显示出来了。对于当前网络流行的速度而言,不高于200KB的单张图片的所需载入时间基本是差不多的,所以无需 顾忌这个问题。

加速的关键,不是降低重量,而是减少个数。传统切图讲究精细,图片规格越小越好重量越小越好,其实规格大小无所谓,计算机统一都按byte计算。客户端每显示一张图片都会向服务器发送请求,所以,图片越多请求次数越多,造成延迟的可能性也就越大

CSS Sprites原理

CSS Sprites其实就是把网页中一些背景图片整合到一张图片文件中,再利用CSS的“background-image”,“background- repeat”,“background-position”的组合进行背景定位,background-position可以用数字能精确的定位出背景图片的位置。

CSS Sprites优点

利用CSS Sprites能很好地减少了网页的http请求,从而大大的提高了页面的性能,这也是CSS Sprites最大的优点,也是其被广泛传播和应用的主要原因;
  CSS Sprites能减少图片的字节,曾经比较过多次3张图片合并成1张图片的字节总是小于这3张图片的字节总和

CSS Sprites缺点

诚然CSS Sprites是如此的强大,但是也存在一些不可忽视的缺点
  在图片合并的时候,你要把多张图片有序的合理的合并成一张图片,还要留好足够的空间防止板块内不会出现不必要的背景;这些还好,最痛苦的是在宽屏,高分辨率的屏幕下的自适应页面,你的图片如果不够宽,很容易出现背景断裂
  CSS Sprites在开发的时候比较麻烦,你要通过photoshop或其他工具测量计算每一个背景单元的精确位置,这是针线活,没什么难度,但是很繁琐;幸好腾讯的鬼哥用RIA开发了一个CSS Sprites 样式生成工具(以后用到的时候要记得),虽然还有一些使用上的不灵活,但是已经比photoshop测量来的方便多了,而且样式直接生成,复制,拷贝就OK!

CSS Sprites在维护的时候比较麻烦,如果页面背景有少许改动,一般就要改这张合并的图片,无需改的地方最好不要动,这样避免改动更多的css,如果在原来的地方放不下,又只能(最好)往下加图片,这样图片的字节就增加了,还要改动css。

CSS Sprites非常值得学习和应用,特别是页面有一堆ico(图标)。总之很多时候大家要权衡一下利弊,再决定是不是应用CSS Sprites。

CSS Sprite的使用

有几篇关于CSS Sprites的文章,基本上把其原理和机制说明得很清楚。
  What Are CSS Sprites?
  How to create CSS sprites
  Creating Rollover Effects with CSS Sprites
  Building a Dynamic Banner with CSS Sprites
  High Performance Web Sites中关于CSS Sprites的内容3.2. CSS Sprites

CSS Sprite的例子

1. 图片限制(Image Slicing)[1]
  典型如文本编辑器,小图标特别多,打开时一张张跑出来,给用户的感觉很不好。如果能用一张图解决,则不会有这个问题,比如百度空间、163博客、Gmail都是这么做的。
  Image Slicing’s Kiss of Death
  http://www.alistapart.com/articles/sprites
2. 单图转滚(Single-image Rollovers)[1]
  触发切换图片的需求,传统方案得重新请求新图片,因为网络问题经常造成停留或等待。如果能把多种状态合并成一张图,就能完美解决,然后再使用背景图技术模拟动态效果。
  ColorScheme Ratings
  http://demo.rexsong.com/200608/colorscheme_ratings/
3. 延长背景(Extend Background Image)[1]
  如果图片的某边可以背景平铺无限延长,则不需要每个角、每条边单独搞出来,图片能少一个就少一个。其实,这个理论还可以扩展到四角容器里,好处是能大大简化HTML Structure。
  Extend Background Image
   http://demo.rexsong.com/200705/extend_background_image/
  综合案例
  Google Korea(1和2技巧)
  http://demo.rexsong.com/200705/google_korea/
  CSS Menus(2和3技巧)
   http://demo.rexsong.com/200705/css_background_menus/

CSS Sprites的问题

由于IE6存在的background的flicker问题IE6/Win, background image on , cache=‘check every visit’: flicker!,有人针对此问题提出了解决方案Fast Rollovers Without Preload
  关于IE6的flicker问题,fivesevensix.com上有一篇很不错的研究文章Minimize Flickering CSS Background Images in IE6
  另外:brunildo.org的CSS tests and experiments是关于css各种功能不错的参考手册和测试工具。

图片优化

  1. 对于非动画的GIF更建议使用PNG8因为它同样能做到一样的效果,而且能为你节省10%-30%的文件体积。
  2. Photoshop相比起Fireworks,导出同等质量的PNG图片,体积会稍大。而Fireworks虽然做了相应压缩优化,但没有达到最优秀的压缩。
  3. 我所知的设计软件,对于PNG图片的处理都没做到最优秀的压缩,图片体积还有一定的压缩空间。可以尝试使用下面介绍的”图像优化工具” 做无失真的压缩优化。
  4. 图片体积及尺寸方面,建议体积保持在100K以内(较为符合国情最佳请求SIZE),size为800px(最佳尺寸)。(从某权威人事中得知,具体无从考证)

CSS Sprites图片切割术

  1. CSS Sprites图片顺序合图片由上至下、左至右添加。而background-position一般采用数字组合形式定位,这样能减少维护带来的不必要麻烦。
  2. 不建议CSS Sprites图片中保持一定的间距,因为文件size增大而增加文件体积。
  3. CSS Sprites图片中把颜色较近或相同的组合在一起可以降低颜色数,因为少色数的图片文件体积会相对的小。
  4. size相同的CSS Sprites图片中留有较大空隙,某程度上多数情况会增大了体积,所以CSS Sprites的图片不要有空隙。
  5. 在size相同的CSS Sprites图片中,垂直排列的图片会比水平排列的文件体积要大。
  6. 在CSS Sprites图片中,水平排列的图片会比垂直排列的文件体积要大。
  7. 图片对等合并:应用CSS Sprites图片时,适当地把对等相同的图像合并,以节省空间及减少体积。
  8. 区分开不需要合并的图像:如当前用户确定只显示一种状态或一个级别时,不必要把其他的级别或状态的图片合并。
  9. 黄金切割位:在CSS Sprites图片的最右或左边为最灵活动位置最适宜摆放文本前的icon,因此不会受到其它CSS Sprites图片干预,也不需要预留一定的行宽。

补两条
10. 有的说定位时避免使用bottom或right等,当使用CSS sprite的时候,只用background-position: bottom -300px或background-position: right -200px;非常容易。这刚开始的时候是可行的,但是问题是,当你在宽度上或高度上扩展相关sprite图片的时候,原先设置的位置可能是错的,因为那个图片已经不再Sprite图片的底部或右部了。使用确切的位置来避免这个问题。

其实我感觉一般情况宽度图不片不会改应变,用RIGHT和 LEFT还是挺方便的,但从整体考虑,升级了。改版的。图片宽度还是有可能会改变的。必竟开始时做太宽也没什么好处,还是浪费很多空间。就是多费点时间去对坐标,最好还是不用RIGHT 和 LEIFT的了。

12 有的说竟给每个图片足够的空间
  就像你在本文顶部的实例图片看到的那样,那些小图片都被预留了足够的空间。为什么不把他们塞到一块来让sprite图片更小呢? 因为使用这些图片的元素通常都会有大量的内容而且可能会需要扩展的间距,以至于其它图片不会意外出现。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45819276/article/details/119804056

智能推荐

敏捷测试:探索灵活高效的软件测试方法_敏捷开发环境中,软件测试如何适应和变化-程序员宅基地

文章浏览阅读118次。通过尽早开始测试、持续集成和自动化、小步快跑、频繁交付和协作与沟通等原则,团队可以提高测试效率和质量,及时交付可用的软件版本。通过遵循敏捷测试的原则和实践,团队可以提高测试效率和质量,及时交付可用的软件版本。缺乏足够的时间和资源:由于敏捷开发的迭代周期较短,测试人员可能面临缺乏足够的时间和资源的问题。敏捷测试的概念:敏捷测试是一种基于敏捷软件开发理念的测试方法,强调快速响应变化、持续交付价值和紧密协作。因此,敏捷测试需要采用灵活的需求管理方法,如故事地图、用户故事等,以便更好地理解和管理需求。_敏捷开发环境中,软件测试如何适应和变化

STM32实现呼吸灯和流水灯_stm32103r6做呼吸灯仿真实验代码-程序员宅基地

文章浏览阅读5.3k次,点赞3次,收藏35次。单片机 呼吸灯 流水灯_stm32103r6做呼吸灯仿真实验代码

php支付宝接口实例文档,支付宝接口实例php版-程序员宅基地

文章浏览阅读179次。支付页面:$payr['paymethod']=2;if($payr['paymethod']==0)//双接口{$use_service='trade_create_by_buyer';}elseif($payr['paymethod']==2)//担保接口{$use_service='create_partner_trade_by_buyer';}else//即时到帐接口{$use_servi..._payment_type=1&out_trade_no=ncre_51-2024010312-8051852778∂ner=208822

华为jdk镜像-程序员宅基地

文章浏览阅读1.5k次。https://repo.huaweicloud.com/java/jdk/8u202-b08/https://repo.huaweicloud.com/java/jdk/华为jdk镜像地址,无需登录即可下载jdk。感觉华为_华为jdk镜像

linux文件权限修改_linux不是所有者不能更改权限-程序员宅基地

文章浏览阅读324次。修改linux文件权限命令:chmodLinux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。  文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文_linux不是所有者不能更改权限

vue中的better-scroll横向滚动案例,美团前端面试难度_better-scroll 横向滚动-程序员宅基地

文章浏览阅读808次,点赞12次,收藏15次。if (!} else {});},//新建滚动实例 并监听竖轴滚动的高度click: true, //better-scroll 默认会阻止浏览器的原生 click 事件。当设置为 true,better-scroll 会派发一个 click 事件,我们会给派发的 event 参数加一个私有属性 _constructed,值为 true。probeType: 3, //这个属性设置之后可以监听得到了});//监听滚动事件// 当允许滚动并滚动的y轴小于0。_better-scroll 横向滚动

随便推点

基于ssm高校工会提案管理信息系统的设计与开发的设计与实现(源码+lw+部署文档+讲解等)-程序员宅基地

文章浏览阅读583次,点赞17次,收藏21次。功能对照表的目的是帮助开发团队了解软件的功能状况,及时修复功能缺陷和错误,并提高软件的质量和稳定性。功能编号功能名称功能描述功能状态备注1用户登录用户可以通过提供用户名和密码登录系统正常用户名和密码的验证机制安全性2用户注册用户可以通过提供用户名、密码和电子邮件地址注册新的账户正常无3密码修改用户可以通过提供原密码和新密码修改已有账户的密码正常用户密码的修改操作是否需要提供安全认证4用户信息查看用户可以查看自己的个人信息,如用户名、电子邮件地址、角色等正常无。

《奔跑吧Linux内核》之处理器体系结构_奔跑吧linux内核(第2版)卷1:基础架构-程序员宅基地

文章浏览阅读3.1k次。本文摘自人民邮电出版社异步社区《奔跑吧Linux内核》 第1章 处理器体系结构京东购书:https://item.jd.com/12152745.html 试读地址:http://www.epubit.com.cn/book/details/4835本章思考题 1.请简述精简指令集RISC和复杂指令集CISC的区别。 2.请简述数值0x12345678在大小端字节序处理器的存储器中的存储方_奔跑吧linux内核(第2版)卷1:基础架构

【路径规划】基于matlab吉萨金子塔建造算法栅格地图机器人路径规划【含Matlab源码 2835期】_matlab栅格图路径规划-程序员宅基地

文章浏览阅读582次。吉萨金子塔建造算法栅格地图机器人路径规划完整的代码,方可运行;可提供运行操作视频!适合小白!_matlab栅格图路径规划

如何在命令行中运行 MATLAB_命令行调用matlab-程序员宅基地

文章浏览阅读702次。通过命令行运行 MATLAB,我们可以更高效地执行 MATLAB 相关任务,并将其集成到自动化脚本和批处理任务中。我们将探讨如何设置 MATLAB 运行环境,以及如何在命令行中执行 MATLAB 脚本和命令。首先,我们需要确保 MATLAB 已经正确安装在我们的计算机上,并且 MATLAB 的可执行文件路径已经添加到系统的环境变量中。除了运行脚本,我们还可以在命令行中直接执行 MATLAB 的命令。运行上述命令后,MATLAB 将执行 “sum.m” 脚本,并将结果打印到命令行中。_命令行调用matlab

Python零基础入门篇 - 12 - Python中的布尔类型与空类型-程序员宅基地

文章浏览阅读625次,点赞15次,收藏28次。数字、字符串在布尔类型上的应用(内置函数bool)空类型 None关于 布尔类型 与 空类型的演示小栗子布尔类型的比较运算布尔类型的与或非逻辑运算或运算非运算小结什么是布尔类型及布尔类型的使用场景对于真假的判断 即 布尔类型布尔值类型的数据表示逻辑运算结果,有两种取值:真,使用 True 关键字表示。假,使用 False 关键字表示。 代表布尔类型,也可以对于结果进行真假判断布尔类型的使用场景常备用来判断一件事儿的真假数字、字符串在布尔类型上的应用(内置函数bool)其实在数字与字符串中,有一些固定的值是与

美妆护肤品商城小程序的作用是什么?-程序员宅基地

文章浏览阅读70次。覆盖电脑手机端+手机端打造品牌官网,多种信息呈现及产品上架,客户多渠道进入商城购买产品并多种形式配送,美妆产品品牌多且规格广,基于完善的商品上架流程,分类模块规格化展示产品,让用户进入商城可以快速找到所需产品购买。,产品/订单/数据都能很好的管理及查看,节省大量人力成本,数据分析进一步生意扩张,多种支付方式及配送方式,无论是商城网站还是美妆小程序商城都有多个流量入口,方便商家推广及用户点击/分享/搜索进入查看内容并购物咨询。7、然后上传产品、设置支付、营销、分销等各功能及完善信息,并在商城里呈现。

推荐文章

热门文章

相关标签