阅读更多

3顶
0踩

Web前端

转载新闻 谈谈CSS Sprites技术及其优化

2012-05-16 17:25 by 副主编 MnouW 评论(6) 有10202人浏览
CSS Sprites 技术对于广大的前端工程师来说应该是一点也不陌生。这个被国内开发者昵称为“CSS精灵”、“CSS雪碧”的家伙到底解决了什么问题,我们又怎样合理使用这个技术呢?下面来详细聊聊。

在大家还在拨号上网的“远古时期”,由于网速的限制,页面开发者都喜欢把网页里面的图片字节数控制的非常小,往往在一个图片文件夹里散落着n多的小碎图。随着网络技术的发展,网速的提升,大家越来越重视页面的加载速度、页面效率问题,过去的那些小图便成为了前端开发者的眼中钉,因为每加载一张图片都会产生一次浏览器请求数,发起的请求数越多那么页面加载的速度也越慢。还有当页面加载时,图片一个个的零星显示,鼠标经过时候背景闪白等也都是我们不能忍受的。于是乎将页面中的背景图整合到一起,利用“background-image”,“background- repeat”,“background-position”的组合进行背景定位的技术被广泛使用与了页面构建中,这就是CSS Sprites。当然CSS Sprites技术也存在着维护不便,内存占用大等等的缺点。

上面这些只是对CSS Sprites技术的一个普及。作为一个开发者我们应该对它有一个更全面的认识,挖掘深度内容,这样才能有利于我们效率开发,团队协作。

头疼的多人拼图游戏

使用CSS Sprites,就好像玩拼图游戏一样。一张白画布,那么多图怎么放到里面去才会完美?这是个让人纠结的事。而且在实际在工作场景中,我们面临着项目开发时间紧张,UI设计图要分期提供,多人协同开发一个项目等等问题。这些问题非常容易让我们在大项目中迷失,造成CSS拼图混乱,维护及其困难的情况。

定好规则,其实拼图也挺好玩的。

先期的准备工作

应对一个项目后期维护成本大的问题,我们最好的解决方案就是在开始前制定一系列的规范来限制问题的产品。好的开始是成功的一半。对于CSS Sprites,在项目开始前,我们要充分认识一个产品,同UI设计师做好良好的沟通,对我们未来组成我们Sprites图的各个元素有个大体的概念,比如我们的背景拼图可能包括什么。

一个好的Sprite画布是必须的

网页设计里面,Grid系统是必不可少的,好的Grid能解决我们很多排版问题。Grid系统同样适用于CSS Sprites。我们需要创建好一个优秀的画板,剩下的工作就是将元素合理的置于画板中了。

这张是我准备的一张CSS Sprites画布,我们将在这个PSD里面组合项目中的图片。

这张画布是由20px*20px像素的格子组成。这个格子基本上由项目决定的,当我们同UI设计师沟通了解这个项目最多的为16px*16px 图标时。我们就可以采用这种Grid尺寸为画布了。



Sprites画布有了,接下来就是对图标进行分组了

对于信息的归纳总结、分类是一个有意思的事情。就拿图标来说,我们就可以根据图标功能,尺寸等等作为信息维度进行归纳。其实无论怎么归纳,都是可以的,只是记得我们以一个方向作为标准就可以了。

下图是根据微博站外某组件完成的CSS Sprites:



根据设计,我们了解在这个页面,需要将图片元素根据功能分为4个维度,即微博品牌展示元素、提交按钮、操作类小按钮、提示类ICON。于是我将画布X轴坐标方向每5个格(其实完全可以10个格或者更多)划分为一个区域,每个这样一个区域的Y轴方向不再划分区域,这样做的目的是为了以后增加图标的扩展性。于是我们可以非常快速得到一个图标的坐标了。比如不可用的灰色的分享按钮 X坐标=5*20px=100px Y坐标=7*20px=140px; 那么我们就取得了这个图标的位置即background-position: -100px -140px。如果抽象成为公式的话,我们设置一个单元格的宽度为变量n。X坐标值Gx,Y坐标值Gy。那么画布中的元素css背景即为:background-position:-Gx*npx –Gy*npx 了。

现在图有了,怎么取图也是关键

因为图片尽可能的被整合到一张拼图,所以我们需要在页面使用图片的位置使用空标签定位的方式将拼图所需展现的部分展示到页面中。

<span class="iconA"></span>
.iconA { display:inline-block; height:16px; width:16px; background:url(icons.png) -20px -20px no-repeat }


项目出现二期需求了,需要增加图标?

需求总是不能控制,我们要尽可能的为未来增加图片做好打算。在刚才的例子的项目里后期产品需要增加图标,于是:



我们可以继续在对应的图区内增加对应的图标。但是这个例子同样暴露了一个缺陷,如果新增一个按钮区域大于5n(100px),我们的图区不足以承载。这时候我们可以同产品,设计师沟通协调,商议是否可以取消过大的按钮设计。如果需求一定,那我们只能沿着X轴方向继续扩展画布。不过,我们也需要注意无限的放大一张画布,同样会造成对页面效率的影响。

及时的制定好规范,记录好修改日志

可能在项目的初期,我们还来不及制定合图的具体规范,在项目中我们会遇到各种各样的问题。及时的总结,维护整张CSS拼图,在拼图的PSD或者PNG(使用Fireworks)做好注释,方便他人开发。拼合好的图片提交到svn时也写明log内容,这样便日后查询。



最终目的

其实CSS Sprites经过了那么多年的演变,前端开发者不断的优化,都是为了提升页面效率,提升团队开发效率,减少开发维护成本而努力。配合最近非常流行的将CSS动态语言化(如SASS LESS等),增加入变量, 继承, 运算, 函数等。CSS Sprites会变的更好玩,会减少更多的开发维护成本。甚至我们在“面向对象”的模块开发方式中,还可以使用一个类的的同一个backgroud-position:(x y)值,在不同的页面通过引用不同的图片(background属性)实现将一个页面内图片请求量进一步减少的目的。随着高级浏览器的普及我们还可以多使用CSS3属性,减少渐变背景图的使用,将纯色ICON制作成字体取代拼图等我们能更大程度上减少图片的使用量。这篇文章只是抛砖引玉。实际上还有很多关于CSS Sprites的方法,还有众多的拼图生成工具。

说了那么多,我们如果在日常的开发中,只要我们多注意总结,敢于创新,敢于制定规范,那么再小的事也能干的很漂亮,对于CSS Sprites的优化就是这么一个例子。

  • 大小: 15.3 KB
  • 大小: 45.3 KB
  • 大小: 47.4 KB
  • 大小: 36.9 KB
来自: 新浪UDC
3
0
评论 共 6 条 请登录后发表评论
6 楼 jordan_micle 2012-05-17 15:31
1L好工具
5 楼 linder0209 2012-05-17 12:49
坐标原点在整个图片的左上角,所以向下和向右都是负值
4 楼 linder0209 2012-05-17 12:49
左边原点在整个图片的左上角,所以向下和向右都是负值
3 楼 hellostory 2012-05-17 11:35
为什么是“background-position: -100px -140px”,X轴也是负数,那坐标原点在哪里?
2 楼 chenleijiangjun 2012-05-17 09:38
1楼V5啊
1 楼 achun 2012-05-17 08:40
有个在线工具 http://www.spritecow.com/
超方便,当然要在FireFox下工作

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • mysql 存储过程详解

    mysql 存储过程详解

  • oracle存储过程超详细使用手册

    oracle存储过程超详细使用手册,内容很详细,绝对受用

  • ORACLE存储过程

    oracle存储过程 目录 一.什么是存储过程 二.为什么要写存储过程 三.存储过程基础 1.存储过程结构 2.存储过程语法 3.pl/sql处理存储过程 四.存储过程进阶 1.BUIK COLLECT 2.FORALL 3.pl/sql调试存储过程 ...

  • MySQL中的存储过程(详细篇)

    由MySQL5.0 版本开始支持存储过程。 如果在实现用户的某些需求时,需要编写一组复杂的SQL语句才能实现的时候,那么我们就可以将这组复杂的SQL语句集提前编写在数据库中,由JDBC调用来执行这组SQL语句。把编写在...

  • SQL存储过程

    SQL存储过程是一组预定义的SQL语句,它们以一种事务性的方式封装在一个单元中,可以通过单一的调用来执行。存储过程通常在数据库服务器上创建、编译和存储,然后可以由应用程序通过命名调用。可以提高数据库操作的...

  • mysql存储过程学习笔记

    本文主要记录了本人学习mysql存储过程时的笔记,文档中用到的表结构在文档结尾处有说明。 一、定义  存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,...

  • 【PostgreSQL】存储过程

    存储过程是一段预编译的SQL代码,它被存储在数据库中,并赋予一个名称。存储过程被视为某种语言的子程序或子例程,可以像调用函数一样在数据库中调用它们。存储过程可以接受参数,并且它们可以返回一组结果或者一组...

  • 老大说不要在项目中使用存储过程

    作为技术人,我不愿看到因为xxx问题而直接拒接xxx技术这种情况,该篇文章是网上多方技术人针对“存储过程到底是值不值得用”这个问题的一些见解

  • MySQL的存储过程

    MySQL5.0版本开始支持存储过程,存储过程就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法,存储过就是数据库SQL与层层面的代码封装与重用 特性 1.有输入输出参数,可以声明变量,...

  • Oracle存储过程入门教程(通俗理解存储过程)

    Oracle存储过程入门教程(通俗理解存储过程),存储过程执行调用代码方式,存储过程语法,表增删改查、判断、循环、异常捕获、嵌套存储过程。使用存储过程对数据判断遍历效率提高,减少与数据库的IO链接的消耗,提高...

  • mysql存储过程输出_MySQL存储过程

    存储过程简介我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定...

  • 第63讲:MySQL存储过程变量传参的核心概念与案例

    由于inout类型即可以传参输入,又可以传参输出,在调用存储过程,输入传参的内容时,无法直接填写变量值,因为输出传参不会识别变量值只会识别变量名,所以需要先将inout的变量通过自定义变量赋值,再调用存储过程时...

  • MySQL存储过程批量插入数据

    踩了哪些坑 1.1 新建存储过程的语法 1.2 声明变量 1.3 存储过程参数 1.4 WHILE循环 1.5 写存储过程 1. 怎么写出来的?踩了哪些坑 因为阿里Java开发手册上面不建议使用存储过程,所以并没有学习过存储过程。因为测试...

  • mysql execute 存储过程_Mysql存储过程调用

    1.1create procedure (创建)create procedure存储过程名 (参数列表)beginsql语句代码块end注意:由括号包围的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个in参数。要指定为其它...

  • SQL 存储过程

    SQL 存储过程的学习

  • Mysql 创建存储过程和函数及各种例子

    Mysql 创建存储过程和函数及各种例子

  • mysql 创建存储过程

    mysql创建存储过程

  • mysql存储过程fetch into_存储过程fetch into

    SQL Server 中,对结果集及游标的使用[总结]一、对结果集使用的解决办法如何在存储过程中使用另一个存储过程的结果集,或者对动态SQL语句的执行结果再次使用,可以使用下面这样的语句:INSERT INTO table_name EXEC ...

  • 基于springboot大学生就业信息管理系统源码数据库文档.zip

    基于springboot大学生就业信息管理系统源码数据库文档.zip

  • 基于java的驾校收支管理可视化平台的开题报告.docx

    基于java的驾校收支管理可视化平台的开题报告

Global site tag (gtag.js) - Google Analytics