提高网站速度之图片技巧

网站的首页响应速度极其重要,这直接决定了新用户是选择留下还是选择放弃你的站点。有统计数据显示,用户的耐心通常<2秒。最好能让你的页面在2秒内呈现,起码部分呈现,否则时间越往后,你的站点被用户放弃的可能性越将指数级上升。

提高页面响应速度的需要考虑很多方面,其中非常重要的一项就是尽量减少HTTP请求的次数

通常网站会对脚本文件和CSS文件进行了合并处理,这样用户在第一次无任何缓存的前提下,(统计数据显示)访问米国排名前十的门户网站平均只会加载6-7个脚本文件和1-2个CSS文件。合并处理大大减少了HTTP请求的次数。那么图片呢?本篇将探讨一下如何技巧性地加载图片的方式以提高网站响应速度。

  • 图片内联
  • CSS Sprites
  • Image Map

图片内联

常见的加载图片的方式如:<img src=”img/25/1.jpg” />会导致一次HTTP请求,请求服务器回传图片。其实图片的本质也是数据,如果能直接获得图片的数据,就可以直接让屏幕绘制该图片,避免了HTTP请求。

获取图片数据可以用FileReader的readAsDataURL方法,你也可以参照HTML5 Doctor里关于生成图片预览的说明,原理都是一样的。

用JS写个小工具,代码其实没几行,如果懒得写。也有现成的工具站点如Encode Data URL(有兴趣可以查看该页面源码,同样是通过File API实现的,原理也是一样的),可以让你轻松获取图片的数据。获取到的数据被封装到了Data URL里,之后将Data URL传递给img的src或background-image的URL等属性即可实现图片内联。

例如将本地图片拖动到工具站点Encode Data URL里,自动生成的Data URL:

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABg……U+LQ/9k=
  //data:image/jpg;为数据协议及类型名
  //base64为数据编码格式
  //后面一串就是经Base64编码后的图片数据了

将上面的Data URL直接塞入CSS端的img的src属性里即可:<img src=”data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABg…U+LQ/9k=” />

现在浏览器可以直接显示图片,不必再通过HTTP请求和服务器交互了。而且因为是浏览器直接显示,规避了跨域的问题。

但图片内联也不是没有缺点的:

  • 比如图片一旦更新就需要同步更新CSS里Data URL的值,而用普通的图片加载方式的话,服务器端直接替换同名图片即可。
  • 比如Base64编码后数据大小会变大,因此将Data URL写入CSS后,CSS增加的大小会大于图片的实际大小。虽然CSS可以gzip压缩,而图片不能压缩,但庞大的CSS文件是不可取的。
  • 比如旧版本的IE6/7不支持(说真的,放弃它们吧)。

结合内联图片的优缺点,图片内联最好用于很少变更,且实际尺寸很小的图片。

CSS Sprites

CSS Sprites将多张图片合并成一张。所谓一图胜千言:



合并成一张图片后,原本多次HTTP请求减少为1次。加载后用background-position位置偏移来显示需要的图片。例如:

#navbar span {
  width:  31px;
  height: 31px;
  float:  left;
  background-image:url(/images/navbar.gif);
}
.nav1 {background-position:0 0; margin-right:4px;}
.nav2 {background-position:-32px 0; margin-right:4px;}
.nav3 {background-position:-64px 0; margin-right:4px;}
……

按常理合并图片后边缘处会有一些多余的空白部分,理应合并后尺寸变大才对。但出乎预料的是多张图片合并成一张后,合并后的尺寸要比多张图片加起来的尺寸要小。因为可以共享色表,而单独的一张图片会有单独的色表。

CSS Sprites的缺点主要是后期维护困难,一旦图片要发生变动,很容易导致CSS里位置重新计算偏移量。况且Photoshop切图合并也不是很容易的事。

因此CSS Sprites一般用于不常变动的背景,按钮,导航条,链接等地方。但如果图片太多,一张庞大的合并图可能是后期维护的恶梦。

Image Map

如上例用CSS Sprites合并成一张导航条图片后,还可以用Image Map。用<map>标签直接在一张图片上绑定多个连接,这样就不需要background-position位置偏移来显示图片了:

<img usemap="#map1" src="/images/navbar.gif">
<map name="map1">
  <area shape="rect" coords="0,0,31,31" href="nav1.html" title="nav1">
  <area shape="rect" coords="36,0,66,31" href="nav2.html" title="nav2">
  <area shape="rect" coords="71,0,101,31" href="nav3.html" title="nav3">
  ……
</map>

效果显然易见,如果你想在图片不同区域点击获得不同效果,可以告别请求多张图片并在页面端拼图的方式了。在本地处理合并好图片后,用Image Map可以有效减少HTTP请求数量。

总结

图片是网页不可或缺的一部分,而且加载图片通常比较吃带宽,对图片应该尽量用缓存和CDN来加快页面显示速度。但首次访问站点没有缓存或缓存过期时,上面3种方式(仅我所知)可以减少HTTP请求次数,并部分缩小图片尺寸,来加速页面的响应的速度。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,630评论 1 92
  • 网站优化离不开前后端的互相协作,但是对于前端工程师来说,在保证后端技术方案不变时,能不能只利用前端技术来优化网站呢...
    留七七阅读 6,243评论 0 31
  • 前端开发面试知识点大纲: HTML&CSS: 对Web标准的理解、浏览器内核差异、兼容性、hack、CSS基本功:...
    秀才JaneBook阅读 2,251评论 0 25
  • 什么是 FOUC(无样式内容闪烁)?你如何来避免 FOUC? FOUC - Flash Of Unstyled ...
    MrThorn阅读 390评论 0 1
  • 生命中的每一次邂逅都是命运与我们开的一个无关痛痒的玩笑。事实上, 我们总会拥有一些美丽的邂逅, 即使故事的结局是那...
    94暖暖阳光阅读 365评论 0 2