原生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 type=file是否有已经选择好文件的代码
May 23 Javascript
jquery获得option的值和对option进行操作
Dec 13 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
Mar 03 Javascript
js实现编辑div节点名称的方法
Dec 17 Javascript
常用原生JS兼容性写法汇总
Apr 27 Javascript
Angular CLI 安装和使用教程
Sep 13 Javascript
JS实现websocket长轮询实时消息提示的效果
Oct 10 Javascript
Vue数据监听方法watch的使用
Mar 28 Javascript
玩转vue的slot内容分发
Sep 22 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
Aug 08 Javascript
详解Javascript实践中的命令模式
May 05 Javascript
vue项目支付功能代码详解
Feb 18 Vue.js
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+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
PHP把网页保存为word文件的三种方法
2014/04/01 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
提高 DHTML 页面性能
2006/12/25 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
2016/11/22 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
nodejs 最新版安装npm 的使用详解
2018/01/18 NodeJs
微信小程序与公众号卡券/会员打通的问题
2019/07/25 Javascript
原生JavaScript实现滑动拖动验证的示例代码
2019/12/06 Javascript
[03:31]DOTA2英雄基础教程 大地之灵
2013/12/17 DOTA
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
[00:17]DOTA2荣耀之路5:It’s a disastah!
2018/05/28 DOTA
[01:21:58]守擂赛DOTA2第一周决赛
2020/04/22 DOTA
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
详细解读Python中解析XML数据的方法
2015/10/15 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
Python实现Kmeans聚类算法
2020/06/10 Python
python爬取网易云音乐评论
2018/11/16 Python
Python利用itchat库向好友或者公众号发消息的实例
2019/02/21 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
python Gabor滤波器讲解
2020/10/26 Python
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
乌克兰机票、铁路和巴士票、酒店搜索、保险:Tickets.ua
2020/01/11 全球购物
企业标语口号
2014/06/10 职场文书
学习普通话的体会
2014/11/07 职场文书
《分数的意义》教学反思
2016/02/20 职场文书
vue3如何优雅的实现移动端登录注册模块
2021/03/29 Vue.js
利用python做数据拟合详情
2021/11/17 Python
使用HttpSessionListener监听器实战
2022/03/17 Java/Android
sentinel支持的redis高可用集群配置详解
2022/04/01 Redis