一、缩小图片大小
当图片很多的时候,减少图片大小是提高下载速度最直接的 方法。
1.
使用PNG8
代替GIF(
非
动画图片)
,因为PNG8
在效果一样的情
况,图片大小比GIF
要小。
?
2.
用fireworks
处理PNG
图
片,在我们产品中很多PNG
图片是美工直接用photoshop
导
出的,后来让美工用fireworks
处理PNG(
大
概的方式是选择保存为PNG8,
删除背景色)
。
处理后100K
的图片大小基本减少了3/4
,
但图片质量也会有少许降低,要看自己是否能接受。
3.
使用Smush.it(http://www.smushit.com/ysmush.it/
)
压缩图片,Smush.it
是YUI
团
队做1
个在线压缩图片的网站,该网站在不影响原图片的质量下去掉图片中一些元数据,所以可以放心使
用该网站进行压缩,但这个压缩比例也是比较有限的。
?
4. 也可使用Java 生成高品质缩略图 如:源代码
?
二、合并图片和拆分图片
1. CSS Sprites
合并图片以减少请求数来提高性能大家都知道。但不要把图片合并太多,太多太大了,就会因为这1
个图片影响这个页面的显示了。
2.
有时候我们需要把1
个大图片拆分成多个小图片,比如产品首页图片比较少,就1
个很大的banner
图片,因浏览器都可以并发下载
图片,所以如果不拆分,只使用1
个大图片的话,下载速度反而会比较慢
?
三、透明图片处理
IE6 不能显示透明的PNG 图片,是很多开发人员特 别头 疼的事,分别介绍下几种方式的优缺点。
1.
使用AlphaImageLoader
,IE6
支
持filter,
使用下面的CSS
代码,可
以让IE6
支持PNG
#some-element { background: url(image.png); _background: none; _filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png', sizingMethod='crop'); }
?
?
优点:使用简单
缺点:性能损耗很大,AlphaImageLoader
会花费很多资源去处理透明图
片,使用AlphaImageLoader,IE
使用内存会迅速上升。
而且AlphaImageLoader
所有处理都在同1
个线程中同步进行,所以当AlphaImageLoader
多
的时候,会阻塞UI
的渲染。
使用_filter
,IE7
也
可以识别,其实IE7
是可以识别PNG
透明
图片的,如果在IE7
下使用上面代码,IE7
不
会直接使用图片,而是使用 AlphaImageLoader
。
注:个人建议尽量避免使用
AlphaImageLoader
2. JS
处理
使用DD_belatedPNG(http://www.dillerdesign.com/experiment/DD_belatedPNG/),
可
以很简单的对界面上所有的透明图片进行同一处理。
优点:使用简单(
比AlphaImageLoader
还
简单)
缺点:当页面上需要处理的图片比较多的时候,速度也比较慢,而且不能动态改变图片。
3. VML
IE6
支持VML
,VML
可以使用透明图片,代码如下:
修改html
代码头部
< html? xmlns ="http://www.w3.org/1999/xhtml" ?xmlns:v > ?????????? < head > ??????? < style? type ="text/css" > ????????????v\:* { behavior : url(#default#VML) ; } ??????????? </ style> ?????????? </ head > ? ?????????? < body > ????????????? < v:image? src ="image.png" ? /> ?????????? </ body > ???????? </ html >
?
优点:性能好,速度快
缺点:使用复杂,而且不支持firefox
等浏览器,需要判断不同的浏览器输出不同
的HTML
代码。
四、多域名下载图片
因每个浏览器对同1
个域名同时只能发送固定的
请求,比如 IE6
好像是2
个,所以可以对
图片资源开通多个域名进行请求,
比如img1.abc.com,img2.abc.com
。但域名不要开启太多,因
为解析域名和打开新的连接都需要消耗时间,域名多了,说不定反而会更
慢。一般2-4
个域名就够了。
五、IE6
下
缓存背景图片
IE6
背景图片缓存是个麻烦事,很多人知道使用下面的
JS
来让IE6
缓存背景图片
try{ document.execCommand("BackgroundImageCache", false, true); }catch(e){}
但是这样做的效果并不是非常好,当出现鼠标移动改变背景图片的时候,IE6
老是会发
送1
个图片请求(
尽管该背景图片已经下载)
,虽然返回结果是304
,但还是要花费不少时间。在
这种情况下,可以使用下面1
个变通的方式来处理,
在页面上直接使用1
个DIV
元
素来加载该图片,这样加载图片就能真正被缓存,鼠标移动也不会发送请求了。
?? ? ? ?
六、预加载图片
使用下 面代码可以在页面加载完毕后预加载下1
个
页面的图片,当进入下1
个页面就不用再下载图片了。
window.onload=function(){ var img = new Image(); img.src = "images/image.png"; img = null; };?
?
七、 延迟 加载图片
经常上 tudou 网,发现 tudou 首页加载图片的功能很有意思, tudou 首页从 " 娱乐 " 这个板块往下的所有视频的缩略图并不是在页 面打开后就加载的, 而是当用户拖动滚动条到了 " 娱乐 " 这个板块,才开始加载图片的。这样做的好处 当然是如果有用户不需要查看下面的内容,则免去了下面所有图片的请求,这对减 少服务器的压力还是很有帮助的。
tudou 的实现原理:
1、 先把所有需要 延迟加载的图片的 src 都设置成同 1 个小图片的连接 (sprite.gif) ,把真正图片的连接放进图片的 alt 属性中,如下代码:
<a class="inner" target="new" title="史上最重街舞选手和最柔软街舞选手" href="http://www.tudou.com/programs/view/Utmt1_6Z-lU/"> <img width="120" height="90" class="pack_clipImg lazyImg" alt="http://i01.img.tudou.com/data/imgs/i/051/720/095/p.jpg" src="http://css.tudouui.com/skin/__g/img/sprite.gif" coords="_DAA"/> </a>
2、? 绑定 window.scroll 事件,在该事件里面的重设所有 class 为 lazyImg 的图片的 src 值
示例代码:
?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gbk" /> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script> </head> <body> 默认看到的图片:<img src="http://www.google.com.hk/intl/zh-CN/images/logo_cn.png"/> <div id="lazyBox" style="margin-top:100px;"> 滑动滑动条才能看到的图片: <img width="120" height="90" style="border:1px solid blue;" class="lazyImg" alt="http://www.baidu.com/img/baidu_logo.gif" src="http://css.tudouui.com/skin/__g/img/sprite.gif" coords="_DAA"/> <img width="120" height="90" style="border:1px solid blue;" class="lazyImg" alt="http://img1.gootrip.com/gootrip/_20upload/photo/2008-03-07/70525_1.jpg" src="http://css.tudouui.com/skin/__g/img/sprite.gif" coords="_DBA"/> </div> <div style="height:1000px;"></div> <script type="text/javascript"> var hasShow = false; $(window).bind("scroll",function(){ if(hasShow==true){ $(window).unbind("scroll"); return; } var t = $(document).scrollTop(); if(t>50){ // 滚动高度超过50,加载图片 hasShow = true; $("#lazyBox .lazyImg").each(function(){ $(this).attr("src",$(this).attr("alt")); }); } }); </script> </body> </html>
把上面代码 copy 到本地运行下就可以看到效果了。
?