原生Js页面滚动延迟加载图片实现原理及过程


Posted in Javascript onJune 24, 2013

原理和过程
1.页面滚动加载事件
2.获取元素在页面里的top值 根据滚动条的位置 判断何时显示图片
3.获取元素集合 加载过的图片从集合里删除
效果预览:http://jsfiddle.net/dtdxrk/SkYNq/embedded/result/

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>原生Js页面滚动延迟加载图片</title> 
<style type="text/css"> 
*{margin: 0;padding: 0} 
img.scrollLoading{border: 1px solid #ccc;display: block;margin-top: 10px;} 
</style> 
</head> 
<body> 
<div id="content"></div> 
</body> 
</html> 
<script type="text/javascript"> 
var _CalF = { 
$ : function(object){//选择器 
if(object === undefined ) return; 
var getArr = function(name,tagName,attr){ 
var tagName = tagName || '*', 
eles = document.getElementsByTagName(tagName), 
clas = (typeof document.body.style.maxHeight === "undefined") ? "className" : "class";//ie6 
attr = attr || clas, 
Arr = []; 
for(var i=0;i<eles.length;i++){ 
if(eles[i].getAttribute(attr)==name){ 
Arr.push(eles[i]); 
} 
} 
return Arr; 
}; 
if(object.indexOf('#') === 0){ //#id 
return document.getElementById(object.substring(1)); 
}else if(object.indexOf('.') === 0){ //.class 
return getArr(object.substring(1)); 
}else if(object.match(/=/g)){ //attr=name 
return getArr(object.substring(object.search(/=/g)+1),null,object.substring(0,object.search(/=/g))); 
}else if(object.match(/./g)){ //tagName.className 
return getArr(object.split('.')[1],object.split('.')[0]); 
} 
}, 
getPosition : function(obj) { //获取元素在页面里的位置和宽高 
var top = 0, 
left = 0, 
width = obj.offsetWidth, 
height = obj.offsetHeight; 
while(obj.offsetParent){ 
top += obj.offsetTop; 
left += obj.offsetLeft; 
obj = obj.offsetParent; 
} 
return {"top":top,"left":left,"width":width,"height":height}; 
} 
}; //添加图片list 
var _temp = []; 
for (var i = 1; i < 21; i ++) { 
_temp.push('<img class="scrollLoading" data-src="http://images.cnblogs.com/cnblogs_com/Darren_code/311197/o_' + i + '.jpg" src="http://images.cnitblog.com/blog/150659/201306/23160223-c81dd9aa9a2a4071a47b0ced2c9118bc.gif" /><br />图片' + i); 
} 
_CalF.$("#content").innerHTML = _temp.join(""); 
function scrollLoad(){ 
this.init.apply(this, arguments); 
} 
scrollLoad.prototype ={ 
init : function(className){ 
var className = "img."+className, 
imgs = _CalF.$(className), 
that = this; 
this.imgs = imgs; 
that.loadImg(); 
window.onscroll = function(){ 
that.time = setTimeout(function(){ 
that.loadImg(); 
},400); 
} 
}, 
loadImg : function(){ 
var imgs = this.imgs.reverse(), //获取数组翻转 
len = imgs.length; 
if(imgs.length===0){ 
clearTimeout(this.time); 
return; 
} 
for(var j=len-1;j>=0;j--){ //递减 
var img = imgs[j], 
imgTop = _CalF.getPosition(img).top, 
imgSrc = img.getAttribute("data-src"), 
offsetPage = window.pageYOffset ? window.pageYOffset : window.document.documentElement.scrollTop,//滚动条的top值 
bodyHeight = document.documentElement.clientHeight; //body的高度 
if((offsetPage+bodyHeight/2) > (imgTop-bodyHeight/2)){ 
img.src = imgSrc; 
this.imgs.splice(j,1); 
} 
} 
} 
} 
var img1 = new scrollLoad("scrollLoading"); 
</script>
Javascript 相关文章推荐
JavaScript表单常用验证集合
Jan 16 Javascript
JQuery 实现的页面滚动时浮动窗口控件
Jul 10 Javascript
javascript document.compatMode兼容性
Feb 23 Javascript
javascript 简单抽屉效果的实现代码
Mar 09 Javascript
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
May 07 Javascript
jQuery Validate 验证,校验规则写在控件中的具体实例
Feb 27 Javascript
浅谈javascript事件取消和阻止冒泡
May 26 Javascript
jQuery插件passwordStrength密码强度指标详解
Jun 24 Javascript
vue-cli的webpack模板项目配置文件分析
Apr 01 Javascript
Vue.js教程之axios与网络传输的学习实践
Apr 29 Javascript
vue监听对象及对象属性问题
Aug 20 Javascript
Node.js中的异步生成器与异步迭代详解
Jan 31 Javascript
jquery可见性过滤选择器使用示例
Jun 24 #Javascript
jquery子元素过滤选择器使用示例
Jun 24 #Javascript
struts2+jquery+json实现异步加载数据(自写)
Jun 24 #Javascript
通过javascript获取iframe里的值示例代码
Jun 24 #Javascript
javascript实现焦点滚动图效果 具体方法
Jun 24 #Javascript
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
Jun 24 #Javascript
onbeforeunload与onunload事件异同点总结
Jun 24 #Javascript
You might like
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
javascript优先加载笔记代码
2008/09/30 Javascript
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
NodeJS的模块写法入门(实例代码)
2012/03/07 NodeJs
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
2013/11/08 Javascript
jquery提交form表单时禁止重复提交的方法
2014/02/13 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
如何使用headjs来管理和异步加载js
2016/11/29 Javascript
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
Python 详解基本语法_函数_返回值
2017/01/22 Python
python 正确保留多位小数的实例
2018/07/16 Python
详解Django解决ajax跨域访问问题
2018/08/24 Python
python障碍式期权定价公式
2019/07/19 Python
python selenium实现发送带附件的邮件代码实例
2019/12/10 Python
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
银行见习期自我鉴定
2014/01/29 职场文书
金融事务专业毕业生求职信
2014/02/23 职场文书
聚美优品的广告词
2014/03/14 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
毕业设计指导教师评语
2014/12/30 职场文书
考教师资格证不要错过的4个最佳时机
2019/07/17 职场文书
Java使用Unsafe类的示例详解
2021/09/25 Java/Android
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技