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 相关文章推荐
DOM_window对象属性之--clipboardData对象操作代码
Feb 03 Javascript
jQuery的缓存机制浅析
Jun 07 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
Dec 28 Javascript
js仿小米官网图片轮播特效
Sep 29 Javascript
原生js实现淘宝购物车功能
Jun 23 Javascript
jQuery实现图片滑动效果
Mar 08 Javascript
jsonp跨域请求实现示例
Mar 13 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
Sep 19 Javascript
详解tween.js 中文使用指南
Jan 05 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
May 25 Javascript
解决layui下拉框监听问题(监听不到值的变化)
Sep 28 Javascript
ESLint 是如何检查 .vue 文件的
Nov 30 Vue.js
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
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
提升PHP速度全攻略
2006/10/09 PHP
php出现Cannot modify header information问题的解决方法大全
2008/04/09 PHP
PHP企业级应用之常见缓存技术篇
2011/01/27 PHP
解析如何去掉CodeIgniter URL中的index.php
2013/06/25 PHP
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
JavaScript实现在标题栏上显示当前日期的方法
2015/03/19 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
JS实现的贪吃蛇游戏完整实例
2019/01/18 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
2020/10/28 Javascript
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
[00:48]食人魔魔法师至宝“金鹏之幸”全新模型和自定义特效展示
2019/12/19 DOTA
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
Python字典遍历操作实例小结
2019/03/05 Python
Python数据库小程序源代码
2019/09/15 Python
python银行系统实现源码
2019/10/25 Python
Django自带的加密算法及加密模块详解
2019/12/03 Python
安装PyInstaller失败问题解决
2019/12/14 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
Footshop法国:购买运动鞋
2020/01/19 全球购物
英国儿童设计师服装和玩具购物网站:Zac & Lulu
2020/10/19 全球购物
物业公司采购员岗位职责
2013/12/31 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
励志演讲稿800字
2014/08/21 职场文书
解除租房协议书
2014/12/03 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
学校工会工作总结2015
2015/05/19 职场文书
话题作文之诚信
2019/11/28 职场文书
python设置 matplotlib 正确显示中文的四种方式
2021/05/10 Python