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 相关文章推荐
JavaScript 创建对象和构造类实现代码
Jul 30 Javascript
我的Node.js学习之路(二)NPM模块管理
Jul 06 Javascript
JS实现控制表格行内容垂直对齐的方法
Mar 30 Javascript
JS简单循环遍历json数组的方法
Apr 22 Javascript
浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预
Jun 25 Javascript
Vue.js实现输入框绑定的实例代码
Aug 24 Javascript
JS库中的Particles.js在vue上的运用案例分析
Sep 13 Javascript
JavaScript插件Tab选项卡效果
Nov 14 Javascript
关于ES6箭头函数中的this问题
Feb 27 Javascript
详解puppeteer使用代理
Dec 27 Javascript
微信小程序实现身份证取景框拍摄
Sep 09 Javascript
详解Vue中的watch和computed
Nov 09 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下载CSS文件中的图片的代码
2013/09/24 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
用php+ajax新建流程(请假、进货、出货等)
2017/06/11 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
jQuery的实现原理的模拟代码 -3 事件处理
2010/08/03 Javascript
javascript刷新父页面的各种方法汇总
2014/09/03 Javascript
JavaScript window.location对象
2014/11/14 Javascript
JavaScript原生对象之String对象的属性和方法详解
2015/03/13 Javascript
js 提交form表单和设置form表单请求路径的实现方法
2016/10/25 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
Vuejs监听vuex中值的变化的方法示例
2018/12/02 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
php使用递归与迭代实现快速排序示例
2014/01/23 Python
python通过BF算法实现关键词匹配的方法
2015/03/13 Python
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
python实现根据给定坐标点生成多边形mask的例子
2020/02/18 Python
利用Python制作动态排名图的实现代码
2020/04/09 Python
python3 re返回形式总结
2020/11/20 Python
pycharm 复制代码出现空格的解决方式
2021/01/15 Python
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
中职生自我鉴定范文
2013/10/03 职场文书
区优秀教师事迹材料
2014/02/10 职场文书
认识深刻的检讨书
2014/02/16 职场文书
《红军不怕远征难》教学反思
2014/04/14 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
2015年清明节扫墓演讲稿
2015/03/18 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书
python双向链表实例详解
2022/05/25 Python