在分析各个网站的CSS时,我们经常可以看到一些网站有很多的元素共享了一张背景图片,而这张背景图片包含了所有这些元素需要的背景,这种技术就叫做CSS Sprites。

淘宝的css sprites

这样做有什么好处呢?我们做一个简单的实验:
假设我需要有一个列表,每一行列表都需要一个自己的修饰符。如果使用普通的img来放置这些图片:

<li><img src="img/01.gif" alt="img" /><a href="#">aaaaa</a></li>
    <li><img src="img/02.gif" alt="img" /><a href="#">bbbbb</a></li>
    <li><img src="img/03.gif" alt="img" /><a href="#">ccccc</a></li>
    <li><img src="img/04.gif" alt="img" /><a href="#">ddddd</a></li>
    <li><img src="img/07.gif" alt="img" /><a href="#">eeeee</a></li>

使用chrome开发者工具来监视网页载入时的情况就会发现,浏览器在载入每一张图片的时候都会发起一个HTTP请求。过多的HTTP请求显然对后台是一个额外的开销。

出现了5个HTTP请求
如果使用CSS Sprites技术,将所有的图片合成一张图片,那么,这5个HTTP请求会被合成一个HTTP请求。

合并成1个HTTP请求了
这样就能大大降低后台服务器的开销。

原理:
CSS Sprites是通过背景图片外加背景图片定位来实现的。现在做一个简单的实验:
在html里面插入一个div,控制宽高都为200px,并将一个高宽都为20px的图片作为背景,并设位置为50px 50px。
html:

<div class="part1"> </div>
css:
.part1{
            background: url(img/x.gif) no-repeat 50px 50px;
        }

此时的效果是这样的:

50px 50px表示背景图片的原点(左上角)离元素的左上角的x轴和y轴偏移都为50px(图上的标注可能有歧义)。当我们将50px 50px改为0 0的时候,红色的方块的左上角会和div的左上角重合。
如果我们拿一幅比div大的背景做图片,会怎么样呢?
css:
background: url(img/tux.png) no-repeat 50px 50px;
和刚才一样,背景图片的左上角离元素的左上角的x,y轴偏移都为50px。图片被挤下来了,超出的部分看不见了。

如果我们使用负的值会怎么样呢?

可以看到,图片的顶点比元素的顶点还要往左上偏,超出的部分看不到了。可见,一个定了高宽的div就像是一个视口,通过设置背景的位置来看到背景图片的不同部分。这就是CSS Sprites的原理。

使用CSS Sprites实现列表修饰:
首先将几个小图片合成一张大图片,保存为bg-group.gif:

html:

<li id="a"><a href="#">aaaaa</a></li>
    <li id="b"><a href="#">bbbbb</a></li>
    <li id="c"><a href="#">ccccc</a></li>
    <li id="d"><a href="#">ddddd</a></li>
    <li id="e"><a href="#">eeeee</a></li>

此时将img元素全部去掉。
设置CSS:
li{
            list-style: none;
            padding-left:16px;/*空出16px来显示图标*/
            height: 16px; /*设定好高度,让超出部分不可见*/
            background: url(img/bg-group.gif) no-repeat;/*所有的li共享一张图片*/
        }
#a{
            background-position:0 0;
        }
        #b{
            background-position:0 -19px;
        }
        #c{
            background-position: 0 -38px;
        }
        #d{
            background-position: 0 -58px;
        }
        #e{
            background-position: 0 -77px;
        }
设定好每个li显示背景的位置。这里定位比较烦,需要拿photoshop去测量每个部分起始的位置,其实这也是CSS Sprites最难的地方。
这样,一个简单的CSS Sprites就实现了。

顺便闲扯一下,网站的静态文件的优化对于性能优化起了很大的作用,CSS Sprites是一种优化。另外一个很重要的概念是动静分离,也就是静态文件,比如图片、CSS、JS之类的都放在专门的静态服务器里,动态的后台代码自己管自己运行。特别是那些用正则表达式来确定路由的后台,由于正则表达式的开销非常大,所以能不用正则分析的东西就单独放一块。

CSS Sprites技术原理和使用的更多相关文章

  1. 7:CSS Sprites的原理(图片整合技术)

    7:CSS Sprites的原理(图片整合技术) 一.将导航背景图片,按钮背景图片等有规则的合并成一张背景图,即将多张图片合为一张整图,然后用background-position”来实现背景图片的定 ...

  2. CSS Sprites的原理(图片整合技术)(CSS精灵)/雪碧图

    CSS Sprites的原理(图片整合技术)(CSS精灵)/雪碧图   一.将导航背景图片,按钮背景图片等有规则的合并成一张背景图,即将多张图片合为一张整图,然后用background-positio ...

  3. 用DIV+CSS切割多背景合并图片 CSS Sprites 技术

    很久之前就在互联网网站和一些js插件中见过这种技术的应用,当时觉得很麻烦,就没有用,也没有去深究. 近段时间一直在做前台的一些东西,涉及到很多div+css的问题.这个东东我又碰到了,所以我花了点时间 ...

  4. CSS Sprites技术

    CSS Sprites技术,国内很多人也叫雪碧图,因为sprite麻 (你买一瓶雪碧就看得到大大的sprite字样了) 主要用于将网站的零碎图标的img标签取代,因为每个img标签引用的src就会造成 ...

  5. CSS sprites 技术

    Css Sprites 技术逐渐流行,各大网站上都可以看到它的身影. 但从本质上,Css Sprites 只是 Css 技术的一个使用小窍门,初学者也能快速上手. Css Sprites 简单解释: ...

  6. css sprites的原理和作用

    CSS Sprites在国内很多人叫css精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片就不会像以前那样一幅一幅地慢 ...

  7. 如何使用CSS Sprites技术进行图片合并

    http://jingyan.baidu.com/article/066074d6757654c3c21cb02d.html

  8. CSS Sprites (CSS图像拼合技术)教程工具

    什么是CSS Sprites? “Sprite”(精灵)这个词在计算机图形学中有它独特的定义,由于游戏.视频等画质越来越高,必须有一种技术可以智能的处理材质和贴图,并且要 同时保持画面流畅.“Spri ...

  9. CSS Sprites的概念、原理、适用范围和优缺点

    CSS Sprites概念 CSSSprites在国内很多人叫css精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片就 ...

随机推荐

  1. js的几个特殊的运算符略解

    js运算符的一些特殊应用及使用技巧. 1. 是否包含指定字符: ~ ~"str1".indexOf("str2") 含义为:str1 被查找的字符串 str2 ...

  2. DOM操作 、js获取id的内容 和修改原来的内容(innerHTML)

    js获取id的内容(getElementById) 和修改原来的内容(innerHTML) 1.通过ID获取元素 学过HTML/CSS样式,都知道,网页由标签将信息组织起来,而标签的id属性值是唯一的 ...

  3. Cocos2d 之FlyBird开发---GameData类

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 现在是大数据的时代,绝大多数的游戏也都离不开游戏数据的控制,简单的就是一般记录游戏的得分情况,高端大气上档次一点的就是记录和保存各方面的游 ...

  4. 系统安装1---U盘启动器制作

    1.下载PE制作工具,现在有很多的PE制作工具,如老毛桃,大白菜等.下面我使用的是IT天空的U盘PE制作工具. 下载地址:https://www.itiankong.net/thread-369670 ...

  5. Python中单下划线和双下划线

    1.双下划线开头和结尾 Python中存在一些特殊的方法,有些方法以双下划线 “__” 开头和结尾,它们是Python的魔法函数,比如__init__()和__str__等等.不用要这种方式命名自己的 ...

  6. 使用VS 2019发布.net core程序并部署到IIS的最新教程

    不管你是使用.net core开发的是web api还是网站类的程序,如果你是部署到IIS,那么下面的内容都适合于你,不会将.net core程序部署到IIS的朋友,可以看看这篇手把手教你部署.net ...

  7. vue - blog开发学习4

    1.新建页面的修改,集成富文本编辑 edit-post.vue(新建和修改都用该组件) <template> <div class="editor"> &l ...

  8. 【笔记目录1】ASP.NET Core分布式项目实战

    当前标签: ASP.NET Core分布式项目实战 共2页: 1 2 下一页  35.Docker安装Mysql挂载Host Volume GASA 2019-06-20 22:02 阅读:51 评论 ...

  9. cookie,seesion学习

    一,为什么需要cookie和session? 1,Web应用程序是使用HTTP协议传输数据的.然而HTTP协议是无状态的协议.一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的 ...

  10. 钉钉机器人SDK 封装预警消息发送工具

    1 群机器人     (1) 引言     钉钉聊天群内支持的群机器人, 类似QQ 群机器人, 可以发天气, 讲笑话那样;     钉钉群机器人支持自定义机器人, 允许开发者管理机器人做预警消息通知; ...