天猫首页迷思之-有层次的懒加载

懒加载是众所周知的减少网页负载,提高性能的方法,不少大型用图片用的多的网站都用到了。

于是我网上一搜,得到一插件:jquery.lazyload    网址:http://www.appelsiini.net/projects/lazyload

然而看了简单的demo之后,仍然只会写这种按照独立的控件来懒加载的代码:

$("img main").lazyload({placeholder:"images/cat_change_cloth.gif"});

既然要做一个肯钻研的人 ,当然不能止步于此。

简单观察以下天猫的首页。

1.主幻灯片div的第一次张幻灯片的加载,是长这样的。未加载完成之前,用户没法切换其他菜单栏。

2.第一张幻灯片加载完成后,是长这样的

你没看错,不是每张图片一个懒加载请求,而是多个图片,一个父div有一个懒加载请求。

那么难点来了。

1. 怎么把加载完成的替代图片放到中间。

2.怎么把懒加载请求转移到多个图片上。

首先,别着急用框架,了解以下jquery.lazyload的实现原理

框架,只针对能设置src的img或者background的div。然而我需要的是能够懒加载整个div中的元素,包括img和其他元素。

以为自己是没看懂,找了一天资料也没找到直接用jquery.lazyload的方法。

好吧,关键时刻,特殊需求,还是自己来写吧。

基本思路:懒加载是通过监听网页滚轮,在指定的时刻加载容器中的图片。那么,加载图片之前要有一个假的容器像用户展示正在加载,加载完成之后将innerhtml填充成真正要展示的。

1.给懒加载的div设置默认背景图片(添加一个class专门展示背景图片bg-loading),用作placeholder

2.第一次监听到滚轮到了懒加载div所在的位置,(等到div中图片全部加载完毕后),去掉bg-loading类,填充innerhtml。

3.此后的每次监听到滚轮滚到指定位置,都不做任何处理 or 最好是不监听了。

好,详细到jquery中的每个操作:

源代码:

 1 <!DOCTYPE html>
 2 <html>
 3 <header>
 4     <meta http-equiv="Content-type" content="text/html;charset=utf-8">
 5     <title>jquery ajax</title>
 6     <style type="text/css">
 7         .loading{
 8             background:url(https://img.alicdn.com/tps/i1/TB1Q4fJFVXXXXXiXFXXJgUmHVXX-184-38.gif) no-repeat scroll 50% 50%;
 9         }
10     </style>
11     <script src="jquery.min.js"></script>
12     <script type="text/javascript">
13         $(document).ready(function(){
14             lazyload_cc("loading",400);//body超出窗口400px之后再启用
15
16         });
17         function lazyload_cc(className,beginHeight){
18             //功能:当div完整出现在屏幕时,加载。
19             //参数className,需要进行懒加载的元素的类名,要取一样的名字
20             //参数beginHeight,滚动条滚到哪里,开始监听
21             //必须有inited熟悉你给,request-url属性,loading的图片自己准备。可以卸载.loading中。
22             if(!className) {
23                 console.error("lazyload_cc方法中缺少className参数");
24                 return;
25             }
26             if(!beginHeight) beginHeight=0;
27             lazyDivList=$("."+className);
28             $(window).scroll(function(){
29                 srcTop=$(window).scrollTop();
30                 if(srcTop>=beginHeight){
31                     lazyDivList.trigger("lazyme",$(window).scrollTop());
32                 }
33             });
34             lazyDivList.bind("lazyme",function(e,scrTop){
35                 var offset=$(this).offset().top;
36                 var interval=$(window).height()-$(this).height();//当前页面可视高度
37                 var sumB=offset;
38                 var sumS=offset-interval;
39                 var url=$(this).attr("request-url");
40
41                 if(scrTop>=sumS && scrTop<=sumB){
42                     $(this).load(url,function(responseTxt,statusTxt,xhr){
43                         if (statusTxt=="success") {
44                             $(this).removeClass(className);
45                             $(this).unbind("lazyme");
46                         };
47                     });
48                 }
49             });
50         }
51     </script>
52
53 </header>
54 <body style="height:3000px;">
55     <div class="loading" style="border:1px solid black;position:absolute;top:800px;left:500px;width:300px;height:400px;"  id="lazyu" request-url="requestU.html">abc</div>
56     <div class="loading" style="border:1px solid black;position:absolute;top:1400px;left:500px;width:300px;height:400px;"  id="lazyu2"  request-url="requestU2.html">abc2</div>
57 </body>
58 <footer>
59 </footer>
60 </html>

完成插件后,以后要实现类似的效果可以直接使用 lazyload_cc(懒加载类名),默认的beginHeight为0;

效果:

div还没到页面中间时,显示正在加载的背景图:

div在页面中间了,显示要展示的详细内容:背景图和原本div.innerhtml都消失了。

源码git地址:https://github.com/HappyBangs/bang_plugins/tree/master/plugin_TmallLazyLoad

建议在虚拟服务器上启动。

时间: 2024-10-04 13:01:46

天猫首页迷思之-有层次的懒加载的相关文章

天猫首页迷思之-jquery实现整个div的懒加载(2)-插件面向对象化-闭包和原型的实例

前文有简单的实现了一个制作懒加载的方法,但其实以方法的形式做插件扩展性不强.那么本文就来用面向对象的方法将其制作成一个真正的插件: 我想要的最终的调用效果是: 1 $(".loading").lazyLoadDiv_cc({ 2 //自定义效果,可不填 3 "beginHeight":400, 4 "loadingBgClass":"loading", 5 "whenToLoad":"someIn

天猫首页迷思之-jquery实现左侧广告牌图片轮播

本次要实现的是天猫首页每个楼层左侧的图片轮播效果.见图: 功能点有:点击右箭头向右滑动:点击左箭头向左滑动:什么都不点自动滑动. 1.实现样式.简单分析一下大概的html结构.一个大的div里面包含两个箭头以及轮播的容器.图片是由三个p标签组成,每个p标签中包含3个图片.css见github 1 <div class="floor-show-middle"> 2 <a class="floor-show-middle-arrow arrow-left&quo

抛砖引玉:大型网站性能优化之Javascript异步懒加载技术

懒加载技术是现在许多大型网站的都使用的提高网站性能的方式,它的核心思想是当用户想看页面某个区域时,再加载该区域的数据.这在一定程度上减轻了服务器端的压力,也加快了页面的呈现速度. 其实国内很多网站都用到了懒加载技术,比如国内两个大型电商网站的页面都运用到了这项技术: 天猫首页: 京东商品列表页: 最近在学习时,自己写了一个带懒加载功能的电影列表展示页,大家可以先看下页面效果: http://f81236211.w4w7.tumm.top/lazyload/ 然后自己在页面底部写了一个分页功能,页

深入懒加载

[javascript] view plain copy 懒加载(LazyLoad)一直是前端的优化方案之一.它的核心思想是:当用户想看页面某个区域时,再加载该区域的数据.这在一定程度上减轻了服务器端的压力,也加快了页面的呈现速度. 懒加载多用于图片,因为它属于流量的大头.最典型的懒加载实现方案是先将需要懒加载的图片的src隐藏掉,这样图片就不会下载,然后在图片需要呈现给用户时再加上src属性. 公司内部库的懒加载正是采用这种方案.它会遍历页面中所有的图片,将其src缓存起来后删除图片的src属

图片懒加载

一.什么是图片滚动加载? 通俗的将就是:当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次),只有在图片出现在浏览器的可视区域内时,才设置图片真正的路径,让图片显示出来.这就是图片懒加载. 二.为什么要使用这个技术? 比如一个页面中有很多图片,如淘宝.京东首页等等,如果一上来就发送这么多请求,页面加载就会很漫长,如果js文件都放在了文档的底部,恰巧页面的头部又依赖这个js文件,那就不好办了.更为要命的是:一上来就发送百八十个请求

前端优化-图片懒加载

一.什么是懒加载 懒加载技术(简称lazyload)是对网页性能优化的一种方案.lazyload的核心是按需加载,避免网页打开时加载过多资源,让用户等待太久,在适当的时候加载用户需要的资源(这里用户需要的资源指该资源呈现在浏览器可视区域).这里我们主要是对img标签使用懒加载技术,使用jquery的query.lazyload.js库实现. 通俗的讲就是:当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次),只有当图片出现在浏览

【Spring源码分析】非懒加载的Bean实例化过程(下篇)

doCreateBean方法 上文[Spring源码分析]非懒加载的Bean实例化过程(上篇),分析了单例的Bean初始化流程,并跟踪代码进入了主流程,看到了Bean是如何被实例化出来的.先贴一下AbstractAutowireCapableBeanFactory的doCreateBean方法代码: 1 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[]

进一步优化SPA的首屏打开速度(模块化与懒加载) by 嗡

前言 单页应用的好处在于一次载入所有页面资源,利用本地计算能力渲染页面,提高页面切换速度与用户体验.但缺点在于所有页面资源将被一次性下载完,此时封装出来的静态资源包体积较大,使得第一次打开SPA页面时候需要的载入时间较长. 在上一篇文章Angular2 单页应用一些优化总结 中提到的利用压缩.混淆.开启gzip传输后,我们成功将3.5兆的资源包压缩到350k.但是如果SPA应用的页面数进一步增加,100个甚至1000个页面的时候,还是无法避免巨大的首页资源包加载的问题.所以350k的资源包是否还

ionic 懒加载页面模块合并

ionic3 懒加载 ionic3 默认使用了懒加载技术,相较以前预加载的版本,ionic3构建的app在首页加载时间上有较大的优化,但是,ionic3默认每个页面都会对应一个模块,对于页面较多,但是每个模块都很小的应用可能并不怎么合理.于是,尝试将几个小模块合并为几个大的模块. 1. 一个模块对应一个页面: 默认状态下每个页面都会对应一个模块,如果项目之中的页面比较多那么最后构建的项目中的将会看到有很多的 js . 原setting.module.ts 1 import { NgModule