JavaScript实现页面滚动图片加载(仿lazyload效果)


Posted in Javascript onJuly 22, 2011

为什么写这篇文章?

1.优化页面很实用的方法,技术实现不难;

2.搜索了相关内容的文章,好像都是用jQuery的方法,可是如果不用jQuery的站长难道就不能用这种方法了么;

3.做技术分享也是在让更多人帮自己测试,因为这个本人木有在项目中实际用到,都是自己琢磨的,所有如果有问题请大家指出,先谢谢了;

4.这个月的博客还没写;

5.刚好木有工作任务,此时不写更待何时...

现在的页面大多都具有的特点 - 内容丰富,图片较多;像我们经常浏览的淘宝,京东,团购网站之类的(本人网购控,属于一个月不在网上花点钱就不痛快),一个页面几十张图片那叫毛毛雨,所以现在流行起了一个方法 - 滚动动态加载。这个方法能解决很大程度的HTTP请求,首先页面只加载窗口显示区的图片,只有等到页面滚动,且滚动到相应位置的时候再去加载图片,这样做网页加载快了(请求少了,加载的东西少了能不提快么)。在《高性能网站建设指南》第一章就说到,减少HTTP请求的重要性,这是提高网页前端性能,优化页面加载速度很实用的做法。

原理:
1.给页面绑定滚动事件;
2.加载页面的时候把真正的图片地址放在某属性中;
3.然后再滚动过程中判断元素是否进入当前浏览器窗口内;
4.最后加载图片,当然加载什么,用什哪种用户体验都得由你决定;

难点:

浏览器兼容是造成难点的原因所在,DOM标准和IE标准,每天前端的工作都在和它们打交道。思考下面的几段代码

1.window.pageYOffset ? window.pageYOffset : window.document.documentElement.scrollTop
目的:获得当前页面相对于窗口显示区左上角的 Y 位置.
DOM标准:window.pageYOffset;
IE标准:window.document.documentElement.scrollTop

2.window.innerHeight ? window.innerHeight : document.documentElement.clientHeight
目的:声明了窗口的文档显示区的高度和宽度,以像素计.
DOM标准:innerheight 和 innerwidth;
IE标准:document.documentElement 或 ducument.body (与 DTD 相关)的 clientWidth 和 clientHeight 属性作为替代

3.obj.getBoundingClientRect().top + window.document.documentElement.scrollTop + window.document.body.scrollTop
目的:获取页面元素的位置.
当浏览器为 非webkit内核 时,document.body.scrollTop值恒定为0,使用 document.documentElement.scrollTop才能取到正确值 ;
当浏览器为 webkit内核 时,document.documentElement.scrollTop值恒定为0,使用 document.body;
我还搜索到一种说法是和DTD相关(即 当页面指定了 DOCTYPE时,使用 document.documentElement ; 当页面没有指定了 DOCTYPE时,使用 document.body),请确定知道的朋友帮忙指出下,不胜感谢。

细节:
1.因为真正的地址最初是在某属性中(默认是xsrc,可自己设置),所以默认的图片地址最好是一个像素的透明图片,这样可以避免在浏览器中出现红X;
JavaScript实现页面滚动图片加载(仿lazyload效果)
2.在图片load的时候可以加入等待的图片,这样用户才会知道这里有图片需要加载,良好的用户体验是前端一直所追求的(例子中有体现);
3.在图片load成功后可以加入合适的显示效果(例子中木有体现,可以自己尝试);
JavaScript源码如下:

var scrollLoad = (function (options) { 
var defaults = (arguments.length == 0) ? { src: 'xSrc', time: 300} : { src: options.src || 'xSrc', time: options.time ||300}; 
var camelize = function (s) { 
return s.replace(/-(\w)/g, function (strMatch, p1) { 
return p1.toUpperCase(); 
}); 
}; 
this.getStyle = function (element, property) { 
if (arguments.length != 2) return false; 
var value = element.style[camelize(property)]; 
if (!value) { 
if (document.defaultView && document.defaultView.getComputedStyle) { 
var css = document.defaultView.getComputedStyle(element, null); 
value = css ? css.getPropertyValue(property) : null; 
} else if (element.currentStyle) { 
value = element.currentStyle[camelize(property)]; 
} 
} 
return value == 'auto' ? '' : value; 
}; 
var _init = function () { 
var offsetPage = window.pageYOffset ? window.pageYOffset : window.document.documentElement.scrollTop, 
offsetWindow = offsetPage + Number(window.innerHeight ? window.innerHeight : document.documentElement.clientHeight), 
docImg = document.images, 
_len = docImg.length; 
if (!_len) return false; 
for (var i = 0; i < _len; i++) { 
var attrSrc = docImg[i].getAttribute(defaults.src), 
o = docImg[i], tag = o.nodeName.toLowerCase(); 
if (o) { 
postPage = o.getBoundingClientRect().top + window.document.documentElement.scrollTop + window.document.body.scrollTop; postWindow = postPage + Number(this.getStyle(o, 'height').replace('px', '')); 
if ((postPage > offsetPage && postPage < offsetWindow) || (postWindow > offsetPage && postWindow < offsetWindow)) { 
if (tag === "img" && attrSrc !== null) { 
o.setAttribute("src", attrSrc); 
} 
o = null; 
} 
} 
}; 
window.onscroll = function () { 
setTimeout(function () { 
_init(); 
}, defaults.time); 
} 
}; 
return _init(); 
}); 
scrollLoad();
 
可传递一个参数设置src原地址和响应时间
scrollLoad({ 
src:'userSrc', //字符串型 
time: 100 //数字型 
})
 
demo下载
Javascript 相关文章推荐
js菜单点击显示或隐藏效果的简单实例
Jan 13 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
Mar 15 Javascript
一个php+js实时显示时间问题
Oct 12 Javascript
javascript实现状态栏中文字动态显示的方法
Oct 20 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
Jan 20 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
Dec 27 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
Feb 19 Javascript
JS简单验证上传文件类型的方法
Apr 17 Javascript
VUE多层路由嵌套实现代码
May 15 Javascript
AngularJS发送异步Get/Post请求方法
Aug 13 Javascript
详解将微信小程序接口Promise化并使用async函数
Aug 05 Javascript
vue使用openlayers实现移动点动画
Sep 24 Javascript
JS 自定义带默认值的函数
Jul 21 #Javascript
表单切换,用回车键替换Tab健(不支持IE)
Jul 20 #Javascript
在浏览器中获取当前执行的脚本文件名的代码
Jul 19 #Javascript
iframe 异步加载技术及性能分析
Jul 19 #Javascript
15款优秀的jQuery导航菜单插件分享
Jul 19 #Javascript
jQuery .tmpl(), .template()学习资料小结
Jul 18 #Javascript
JS仿flash上传头像效果实现代码
Jul 18 #Javascript
You might like
php 生成WML页面方法详解
2009/08/09 PHP
PHP函数实现分页含文本分页和数字分页
2014/10/23 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
2016/08/08 PHP
PHP编程实现csv文件导入mysql数据库的方法
2017/04/29 PHP
PHP如何实现订单的延时处理详解
2017/12/30 PHP
可兼容IE的获取及设置cookie的jquery.cookie函数方法
2013/09/02 Javascript
jQuery中:lt选择器用法实例
2014/12/29 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
AngularJS equal比较对象实例详解
2016/09/14 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
[54:56]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第三局
2016/03/06 DOTA
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
Flask框架的学习指南之开发环境搭建
2016/11/20 Python
详解Python开发中如何使用Hook技巧
2017/11/01 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
python selenium 弹出框处理的实现
2019/02/26 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
2019/04/11 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
Python3enumrate和range对比及示例详解
2019/07/13 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
利用Python实现Excel的文件间的数据匹配功能
2020/06/16 Python
HTML5的一个显示电池状态的API简介
2015/06/18 HTML / CSS
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
工业设计专业推荐信
2013/10/29 职场文书
2016年高校自主招生自荐信范文
2015/03/24 职场文书
监理中标通知书
2015/04/16 职场文书
个人欠条范本
2015/07/03 职场文书
企业年会祝酒词
2015/08/11 职场文书
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python
nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)
2022/02/12 Servers
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python