javascript

位置:IT落伍者 >> javascript >> 浏览文章

js图片延迟加载的实现方法及思路


发布日期:2020年08月23日
 
js图片延迟加载的实现方法及思路
这里延迟加载的意思是拖动滚动条时在图片出现在浏览器显示区域后才加载显示

大概的实现方式是
在页面的load没有触发之前把所有的指定id的元素内的img放入到imgs中将所有的图片的src值放入到一个新建的_src属性中把src设置为指定的显示图片
然后在documentbody的scroll事件触发时循环计算imgs中的img元素位置是否正好在浏览器显示框范围内如果是则将img元素的_src属性的值赋给src这样图片就能显示出来
这 里比较麻烦地方是如何计算img的位置获得元素的相对于页面的绝对位置通常是用offsetLeft和offsetTop但这两个属性是元素的 offsetParent指向的元素的相对位置  如果offsetParent所指的元素是设置了浮动的或使用绝对定位那么offsetLeft来获得绝对位置就不正确呢
在这里我是将元素的所有父级元素的offsetTop之和来获得文档绝对位置的

复制代码 代码如下:
//取元素的页面绝对 X位置
var getLeft = function(El){
var left = ;
do{
left += EloffsetLeft;
}while((El = EloffsetParent)nodeName != BODY);
return left;
};
//取元素的页面绝对 Y位置
var getTop = function(El){
var top = ;
do{
top += EloffsetTop;
}while((El = EloffsetParent)nodeName != BODY);
return top;
};


在设置窗口的scroll事件时ie使用是documentdocumentElement而其他的浏览器都使用document
接下来是要获得浏览器显示窗口现对于文档的位置用了下面的代码来计算

复制代码 代码如下:
//读取滚动条的位置和浏览器窗口的显示大小
var top = isGoo ? documentbodyscrollTop : documentdocumentElementscrollTop
left = isGoo ? documentbodyscrollLeft :documentdocumentElementscrollLeft
width = documentdocumentElementclientWidth
height = documentdocumentElementclientHeight;


谷歌浏览器要通过body来获得scrollTop而其他浏览器通过documentElement
最后迭代判断img的位置并显示图片

复制代码 代码如下:
//对所有图片进行批量判断是否在浏览器显示区域内
for(var i= ; i < imgslength; i++){
var _top = getTop(imgs[i])_left = getLeft(imgs[i]);
//判断图片是否在显示区域内
if( _top >= top &&
_left >= left &&
_top <= top+height &&
_left <= left+width){
var _src = imgs[i]getAttribute(_src);
//如果图片已经显示则取消赋值
if(imgs[i]src !== _src){
imgs[i]src = _src;
}
}
}


可以运行的代码

复制代码 代码如下:


<!DOCTYPE html PUBLIC "//WC//DTD XHTML Transitional//EN" "
<html>
<head>
<title>js图片延迟加载</title>
</head>
<body>
<table id="out" style="height:px;">
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
<tr>
<td><img src="
<td><img src="
</tr>
</table>
<table id="out" style="width:px">
<tr>
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
<td><img src="
</tr>
</table>
</body>
</html>
<script type="text/javascript">
function delayload(option){
//读取参数
//图片未加载时显示的图片
var src = optionsrc ? optionsrc :
//指定那些id下的img元素使用延迟显示
id = optionid ? optionid : [];
//图片列表
var imgs = [];
//获得所有的图片元素
for(var i= ; i < idlength ; i++){
var idbox = documentgetElementById(id[i])_imgs;
if(idbox && (_imgs = idboxgetElementsByTagName(img))){
for(var t= ; t < _imgslength ; t++){
imgspush(_imgs[t]);
}
}
}
//将所有的图片设置为指定的loading图片
for(var i= ; i < imgslength ; i++){
//图片本来的图片路径放入_src中
imgs[i]setAttribute(_srcimgs[i]src);
imgs[i]src = src;
}
//取元素的页面绝对 X位置
var getLeft = function(El){
var left = ;
do{
left += EloffsetLeft;
}while((El = EloffsetParent)nodeName != BODY);
return left;
};
//取元素的页面绝对 Y位置
var getTop = function(El){
var top = ;
do{
top += EloffsetTop;
}while((El = EloffsetParent)nodeName != BODY);
return top;
};
//是否为ie并读出ie版本
var isIE = !!navigatoruserAgentmatch(/MSIEbs*([][]);/img);
isIE && (isIE = RegExp$);
//是否为chrome
var isGoo = !!navigatoruserAgentmatch(/AppleWebKitb/img);
//获得可以触发scroll事件的对象
var box = isIE ? documentdocumentElement : document;
//body元素的scroll事件
var onscroll = boxonscroll = function(){
//读取滚动条的位置和浏览器窗口的显示大小
var top = isGoo ? documentbodyscrollTop : documentdocumentElementscrollTop
left = isGoo ? documentbodyscrollLeft :documentdocumentElementscrollLeft
width = documentdocumentElementclientWidth
height = documentdocumentElementclientHeight;
//对所有图片进行批量判断是否在浏览器显示区域内
for(var i= ; i < imgslength; i++){
var _top = getTop(imgs[i])_left = getLeft(imgs[i]);
//判断图片是否在显示区域内
if( _top >= top &&
_left >= left &&
_top <= top+height &&
_left <= left+width){
var _src = imgs[i]getAttribute(_src);
//如果图片已经显示则取消赋值
if(imgs[i]src !== _src){
imgs[i]src = _src;
}
}
}
};
var load = new Image();
loadsrc = src;
loadonload = function(){
onscroll();
};
}
delayload({id:[outout]src:});
</script>

               

上一篇:JS特效代码--日历生成器

下一篇:Jquery选择子控件大于号和 区别介绍及使用示例