原生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 相关文章推荐
将查询条件的input、select清空
Jan 14 Javascript
struts2+jquery组合验证注册用户是否存在
Apr 30 Javascript
javascript实现二级级联菜单的简单制作
Nov 19 Javascript
基于JQuery实现分隔条的功能
Jun 17 Javascript
js中遍历Map对象的简单实例
Aug 08 Javascript
详细讲解JavaScript中的this绑定
Oct 10 Javascript
seajs模块之间依赖的加载以及模块的执行
Oct 21 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
Dec 08 Javascript
基于MVC方式实现三级联动(JavaScript)
Jan 23 Javascript
JS实现点击链接切换显示隐藏内容的方法
Oct 19 Javascript
详解CommonJS和ES6模块循环加载处理的区别
Dec 26 Javascript
JavaScript代码调试方法实例小结
Jan 05 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
PHP 验证身份证是否合法的函数
2017/02/09 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
javascript 一些用法小结
2009/09/11 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
JavaScript利用append添加元素报错的解决方法
2014/07/01 Javascript
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
angular十大常见问题
2017/03/07 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
详解如何使用webpack打包JS
2018/06/21 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
2018/11/13 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
javascript实现动态时钟的启动和停止
2020/07/29 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
2021/01/07 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
python使用自定义user-agent抓取网页的方法
2015/04/15 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
Python实现一个简单的验证码程序
2017/11/03 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
python如何利用paramiko执行服务器命令
2020/11/07 Python
python3字符串输出常见面试题总结
2020/12/01 Python
荷兰和比利时时尚鞋店:Van Dalen
2018/04/23 全球购物
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
Spotahome意大利:公寓和房间出租
2020/02/21 全球购物
小学校园活动策划
2014/01/30 职场文书
弘扬职业精神演讲稿
2014/03/20 职场文书
作风年建设汇报材料
2014/08/14 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript
Python中itertools库的四个函数介绍
2022/04/06 Python