原生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 相关文章推荐
js 窗口抖动示例
Sep 04 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
Dec 01 Javascript
Javascript常用小技巧汇总
Jun 24 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
Sep 05 Javascript
Javascript获取background属性中url的值
Oct 17 Javascript
简单实现bootstrap选项卡效果
Feb 08 Javascript
详解Angular 4 表单快速入门
Jun 05 Javascript
vue中使用ueditor富文本编辑器
Feb 08 Javascript
JavaScript中字符串的常用操作方法及特殊字符
Mar 18 Javascript
ES7之Async/await的使用详解
Mar 28 Javascript
微信小程序获取用户绑定手机号方法示例
Jul 21 Javascript
javascript使用canvas实现饼状图效果
Sep 08 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分页思路以及在ZF中的使用
2012/05/30 PHP
PHP获取windows登录用户名的方法
2014/06/24 PHP
php中二分法查找算法实例分析
2016/09/22 PHP
PHP 无限级分类
2017/05/04 PHP
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
JQuery球队选择实例
2015/05/18 Javascript
三种AngularJS中获取数据源的方式
2016/02/02 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
jQueryUI Datepicker组件设置日期高亮
2016/10/13 Javascript
bootstrap flask登录页面编写实例
2016/11/01 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
Javacript中自定义的map.js  的方法
2017/11/26 Javascript
JavaScript体验异步更好的解决办法
2018/01/08 Javascript
seajs下require书写约定实例分析
2018/05/16 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
nodejs 生成和导出 word的实例代码
2018/07/31 NodeJs
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
Python中使用装饰器来优化尾递归的示例
2016/06/18 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
实例讲解Python3中abs()函数
2019/02/19 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
Python接口测试环境搭建过程详解
2020/06/29 Python
Python WebSocket长连接心跳与短连接的示例
2020/11/24 Python
利用python绘制正态分布曲线
2021/01/04 Python
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
个人函授自我鉴定
2014/03/25 职场文书
2014年个人技术工作总结
2014/12/08 职场文书
小学优秀学生评语
2014/12/29 职场文书
展览会邀请函
2015/02/02 职场文书
环卫工作个人总结
2015/03/04 职场文书
车辆挂靠协议书
2016/03/23 职场文书
纯CSS实现酷炫的霓虹灯效果
2021/04/13 HTML / CSS
Redis基本数据类型String常用操作命令
2022/06/01 Redis