ECMAScript扩展 -12 【图片的预加载与懒加载】

一.图片预加载

(1).多张图片

通过实例化Image对象 调用onload方法来实现(onload之后)

var oDiv = document.getElementsByClassName('div')[0],
    img = ['https://zza.jpg', 'https://zzb.jpg'];
    img.forEach(function(elem){
        var oImg = new Image();
        oImg.src = elem;
        oImg.style.width = '100%';
        oImg.onload = function(){
            oDiv.appendChild(oImg);
        }
    })

(2).单张照片

var oDiv = document.getElementsByTagName('div')[0],
var oImg = new Image();
oImg.src = 'https://zzz.jpg';
oImg.style.width = '100%';
oImg.onload = function(){
    oDiv.appendChild(oImg);
}

二.图片懒加载

(1).实现思路

1.首先正常渲染,但是真正的路径要放到data-src中去

2.获取当前窗口高度,滚动高度

3.滚动时进行判读,如果当前元素距离窗口高度小于窗口高度+滚动高度则将data-src中的数据放到src中(记得要加上防抖或者节流)

4.删除data-src属性

5.让n来控制循环开始数(防止滚回去还会操作src的问题)

6.控制页面刷新后让滚动条复位(要加延迟否则可能不生效)

(2).实现代码

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>
<body>
    <div>
        <ul class="img-list J_imgList"></ul>
    </div>
    <div style="display: none;" id="J_data">
      [{
      "img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581004370914&di=1724f04a58ec9850f168ed5a1faac7d1&imgtype=0&src=http%3A%2F%2Fthumb11.jfcdns.com%2Fthumb%2F2018-05%2Fbce5b03e404d7f24_600_566.jpeg","name":"图片1"
      },
        {
      "img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581004370914&di=1724f04a58ec9850f168ed5a1faac7d1&imgtype=0&src=http%3A%2F%2Fthumb11.jfcdns.com%2Fthumb%2F2018-05%2Fbce5b03e404d7f24_600_566.jpeg","name":"图片2"
      },
      {
      "img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581004370914&di=1724f04a58ec9850f168ed5a1faac7d1&imgtype=0&src=http%3A%2F%2Fthumb11.jfcdns.com%2Fthumb%2F2018-05%2Fbce5b03e404d7f24_600_566.jpeg","name":"图片3"
      },
      {
      "img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581004370914&di=1724f04a58ec9850f168ed5a1faac7d1&imgtype=0&src=http%3A%2F%2Fthumb11.jfcdns.com%2Fthumb%2F2018-05%2Fbce5b03e404d7f24_600_566.jpeg","name":"图片4"
      },
      {
      "img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581004370914&di=1724f04a58ec9850f168ed5a1faac7d1&imgtype=0&src=http%3A%2F%2Fthumb11.jfcdns.com%2Fthumb%2F2018-05%2Fbce5b03e404d7f24_600_566.jpeg","name":"图片5"
      },
      {
      "img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581004370914&di=1724f04a58ec9850f168ed5a1faac7d1&imgtype=0&src=http%3A%2F%2Fthumb11.jfcdns.com%2Fthumb%2F2018-05%2Fbce5b03e404d7f24_600_566.jpeg","name":"图片6"
      },
      {
      "img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581004370914&di=1724f04a58ec9850f168ed5a1faac7d1&imgtype=0&src=http%3A%2F%2Fthumb11.jfcdns.com%2Fthumb%2F2018-05%2Fbce5b03e404d7f24_600_566.jpeg","name":"图片7"
      },
      {
      "img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581004370914&di=1724f04a58ec9850f168ed5a1faac7d1&imgtype=0&src=http%3A%2F%2Fthumb11.jfcdns.com%2Fthumb%2F2018-05%2Fbce5b03e404d7f24_600_566.jpeg","name":"图片8"
      },
      {
      "img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581004370914&di=1724f04a58ec9850f168ed5a1faac7d1&imgtype=0&src=http%3A%2F%2Fthumb11.jfcdns.com%2Fthumb%2F2018-05%2Fbce5b03e404d7f24_600_566.jpeg","name":"图片9"
      },
      {
      "img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581004370914&di=1724f04a58ec9850f168ed5a1faac7d1&imgtype=0&src=http%3A%2F%2Fthumb11.jfcdns.com%2Fthumb%2F2018-05%2Fbce5b03e404d7f24_600_566.jpeg","name":"图片10"
      },
      {
      "img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581004370914&di=1724f04a58ec9850f168ed5a1faac7d1&imgtype=0&src=http%3A%2F%2Fthumb11.jfcdns.com%2Fthumb%2F2018-05%2Fbce5b03e404d7f24_600_566.jpeg","name":"图片11"
      },
      {
      "img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581004370914&di=1724f04a58ec9850f168ed5a1faac7d1&imgtype=0&src=http%3A%2F%2Fthumb11.jfcdns.com%2Fthumb%2F2018-05%2Fbce5b03e404d7f24_600_566.jpeg","name":"图片12"
      },
      {
      "img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581004370914&di=1724f04a58ec9850f168ed5a1faac7d1&imgtype=0&src=http%3A%2F%2Fthumb11.jfcdns.com%2Fthumb%2F2018-05%2Fbce5b03e404d7f24_600_566.jpeg","name":"图片13"
      },
      {
      "img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581004370914&di=1724f04a58ec9850f168ed5a1faac7d1&imgtype=0&src=http%3A%2F%2Fthumb11.jfcdns.com%2Fthumb%2F2018-05%2Fbce5b03e404d7f24_600_566.jpeg","name":"图片14"
      },
      {
      "img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581004370914&di=1724f04a58ec9850f168ed5a1faac7d1&imgtype=0&src=http%3A%2F%2Fthumb11.jfcdns.com%2Fthumb%2F2018-05%2Fbce5b03e404d7f24_600_566.jpeg","name":"图片15"
      }
      ]
    </div>
    <script type="text/html" id="J_imgTpl">
        <li class="img-item">
        <div class="img-wrap">
            <img src="q.png" alt="cc" data-src="{{img}}" class="img"  style="width: 100px;height:100px"/>
         </div>
         <div class="img-tt">
             <h1>{{name}}</h1>
         </div>
        </li>
    </script>
    <script src="js/utils.js"></script>
    <script src="js/index.js"></script>
</body>
</html>

js

;(function(doc){
    var oUl = doc.getElementsByClassName('J_imgList')[0],
        jdata = JSON.parse(doc.getElementById('J_data').innerHTML),
        jImpl = doc.getElementById('J_imgTpl').innerHTML,
        img = doc.getElementsByClassName('img');
    function init(){
        oUl.innerHTML=renderList(jdata);
        bindEvent();
        setTimeout(function(){
            window.scroll(0, 0);
        },150)
    }
    function bindEvent(){
        document.onscroll = window.onload = debounce(imgLazyLoad(img),2000,false)
        // addElemEvent(document,'scroll',throttle(imgLazyLoad(img),2000),false);
        // addElemEvent(window,'load',throttle(imgLazyLoad(img),2000),false);
    }
    function renderList(jdata){
        var list = "";
        jdata.myForEach(function(elem){
            list += jImpl.replace(/{{(.*?)}}/g,function(node, key){
                return{
                  img: elem.img
                }[key]
            })
        });
        return list;
    }

    init();

}(document));
 function imgLazyLoad(img){
        var imgLen = img.length,
            n = 0;//这样就不会每次滚动都去删除data
        return function(){
            var cHeight = browseSeeDist().height,//浏览器高度
                cScrol = browseScrollDist().top,//滚动距离
                imgItem;
            for(var i = n; i < imgLen; i++){
                imgItem = img[i];
                //当前图片是否小于高度+距离
                if(imgItem.offsetTop < cHeight+cScrol){

                    imgItem.src = imgItem.getAttribute('data-src');
                    imgItem.removeAttribute('data-src');
                     n++;
                }

            }
        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值