js图片预加载

介绍:当一个页面打开有过多图片需要加载的时候,它的速度就会很慢,这个时候我们就需要预加载。
1、预加载就是图片在看不见的时候还未加载,但是img标签的src属性会一开始就将图片全部加载完毕,所以我们自定义一个属性为data-url里面添加链接
<div class="my-photo"><img data-url="img/4.jpg" alt="img/4.jpg" /></div>
2、计算元素位置
需要的几个高度
可视区域高度(网页窗口的高度):document.documentElement.clientHeight
鼠标滚动的距离:document.documentElement.scrollTop
元素到页面顶部的距离:imgs[i].offsetTop
公式:元素到页面顶部的距离-鼠标滚动的距离<可视区域高度(代表元素进入了可视范围)
3、获取自定义属性中的链接把它赋给scr属性,没有效果
原因:我们的img标签没有src属性,所以获取不到,也无法赋值
解决办法:使用添加属性的方法,将src和data-url中的链接添加到标签中
var dataUrl=imgs[i].getElementsByTagName("img")[0].getAttribute('data-url');
img.setAttribute('src',dataUrl);
大概思路写好了,我那是一个高兴啊,结果发现下拉没有办法自己显示,必须要手动刷新才显示。
-_-||这是什么鬼,手动预加载吗?这么鸡肋(╯‵□′)╯︵┻━┻,肯定不是这样的啦!
4、无法自动刷新
解决方案:在页面打开和鼠标滚动的时候加载预加载函数
window.onload = function() {
ImgToWatch();
};
window.onscroll = function() {
ImgToWatch();
};
这样就可以了!
but又发现一个问题,当网页页面小的时候,被拉大,下面的图片没有加载,只有当鼠标滚动再次被触发时才出现!
5、网页页面小的时候拉大,不能将图片加载出来
解决方案:使用窗口调整事件触发
window.onresize = function() {
ImgToWatch();
};
啦啦啦,♪(^∇^*),这样就好了,下面附上完整的代码
html部分:
 <div class="my-photo"><img data-url="img/1.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/2.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/3.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/4.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/1.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/2.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/3.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/4.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/1.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/2.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/3.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/4.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/1.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/2.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/3.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/4.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/1.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/2.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/3.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/4.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/1.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/2.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/3.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/4.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/1.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/2.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/3.jpg" alt="a.gif" /></div>
  <div class="my-photo"><img data-url="img/4.jpg" alt="a.gif" /></div>

js部分:
function ImgToWatch(){
    var imgs = document.querySelectorAll('.my-photo');
    var clientHeight= document.documentElement.clientHeight;//可视区域高度
    var scrollTop=document.documentElement.scrollTop;//鼠标滚动的距离    
    for (var i=0;i<imgs.length;i++) {
        if(imgs[i].offsetTop-scrollTop<clientHeight){//元素到页面顶部的距离offsetTop
            var img=imgs[i].getElementsByTagName("img")[0];
            //获取自定义属性
            var dataUrl=imgs[i].getElementsByTagName("img")[0].getAttribute('data-url');
            // 添加src元素,直接获取是没有东西的,因为我们没有给img添加src属性,所以获取不到
            img.setAttribute('src',dataUrl);
        }   
    }
}
// 页面加载的时候就要加载函数,不然打开页面是没有图片的
window.onload = function() {
    ImgToWatch();
};
window.onscroll = function() {
    ImgToWatch();
};
window.onresize = function() {//窗口调整时触发
    ImgToWatch();
};  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值