1.图片的预加载 总结几个比较实用的方法: 使用方式: 当用户在登录页面时,就去请求主页的图片和一些静态文件,等主页加载的时候以相同的路径去请求静态资源的时候就会去浏览器的缓存中找,找到了直接渲染到页面上
1.使用JavaScript实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <div class ="hidden" > <script type="text/javascript" > var images = new Array () function preload ( ) { for (i = 0 ; i < preload.arguments.length; i++) { images[i] = new Image() images[i].src = preload.arguments[i] } } preload( "http://domain.tld/gallery/image-001.jpg" , "http://domain.tld/gallery/image-002.jpg" , "http://domain.tld/gallery/image-003.jpg" ) </script> </ div>
该方法适用于预加载大量的图片,比如当用户输入登录账号的时候,主页的大部分图片已经被预加载的差不多了
2.使用Ajax
使用ajax不但可以实现图片的预加载,而且还可以预加载一些静态文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 window .onload = function ( ) { setTimeout(function ( ) { var head = document .getElementsByTagName('head' )[0 ]; var css = document .createElement('link' ); css.type = "text/css" ; css.rel = "stylesheet" ; css.href = "http://domain.tld/preload.css" ; var js = document .createElement("script" ); js.type = "text/javascript" ; js.src = "http://domain.tld/preload.js" ; head.appendChild(css); head.appendChild(js); new Image().src = "http://domain.tld/preload.png" ; }, 1000 ); };
这里,我们通过DOM创建三个元素来实现三个文件的预加载,正如上面的Ajax,加载文件不会应用到加载页面上,从这点上看,Ajax方法优于JavaScript
2.图片的懒加载 原理: 将页面可视范围外的img标签src指向一个小的站位图片,然后定义data-src,将需要展示的图片的地址赋值给它,当图片滚动到可视区域内的时候,再把data-src中的地址赋值给img标签的src属性,这样就实现了图片的懒加载
HTML 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <head > <meta charset ="UTF-8" > <title > Document</title > <style > img { display: block; margin-bottom: 50px; width: 400px; height: 400px; } </style > </head > <body > <img src ="default.jpg" data-src ="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt ="" > <img src ="default.jpg" data-src ="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt ="" > <img src ="default.jpg" data-src ="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg" alt ="" > <img src ="default.jpg" data-src ="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg" alt ="" > <img src ="default.jpg" data-src ="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt ="" > <img src ="default.jpg" data-src ="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt ="" > <img src ="default.jpg" data-src ="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt ="" > <img src ="default.jpg" data-src ="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt ="" > <img src ="default.jpg" data-src ="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg" alt ="" > <img src ="default.jpg" data-src ="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt ="" > <img src ="default.jpg" data-src ="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt ="" > </body >
JavaScript 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <script> var num = document .getElementsByTagName('img' ).length; var img = document .getElementsByTagName("img" ); var n = 0 ; lazyload(); window .onscroll = lazyload; function lazyload ( ) { var seeHeight = document .documentElement.clientHeight; var scrollTop = document .documentElement.scrollTop || document .body.scrollTop; for (var i = n; i < num; i++) { if (img[i].offsetTop < seeHeight + scrollTop) { if (img[i].getAttribute("src" ) == "default.jpg" ) { img[i].src = img[i].getAttribute("data-src" ); } n = i + 1 ; } } } </script>
jQuery 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <script> var n = 0 , imgNum = $("img" ).length, img = $('img' ); lazyload(); $(window ).scroll(lazyload); function lazyload (event ) { for (var i = n; i < imgNum; i++) { if (img.eq(i).offset().top < parseInt ($(window ).height()) + parseInt ($(window ).scrollTop())) { if (img.eq(i).attr("src" ) == "default.jpg" ) { var src = img.eq(i).attr("data-src" ); img.eq(i).attr("src" , src); n = i + 1 ; } } } } </script>
使用节流阀进行性能优化
如果直接将函数绑定在srcoll事件上,当页面发生滚动的时候,函数会被高频的触发,这样非常影响浏览器的性能。
因此通过实现限制触发频率,来优化性能。
节流思想: 只允许一个函数在N秒内执行一次
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 function throttle (fun, delay, time ) { var timeout, startTime = new Date (); return function ( ) { var context = this , args = arguments , curTime = new Date (); clearTimeout(timeout); if (curTime - startTime >= time) { fun.apply(context, args); startTime = curTime; } else { timeout = setTimeout(fun, delay); } }; }; function lazyload (event ) { for (var i = n; i < imgNum; i++) { if (img.eq(i).offset().top < parseInt ($(window ).height()) + parseInt ($(window ).scrollTop())) { if (img.eq(i).attr("src" ) == "default.jpg" ) { var src = img.eq(i).attr("data-src" ); img.eq(i).attr("src" , src); n = i + 1 ; } } } } window .addEventListener('scroll' ,throttle(lazyload,500 ,1000 ));