• 图片懒加载


    懒加载:页面渲染时不加载不在页面窗口内的资源,防止页面一次性向服务器响应大量请求导致服务器响应慢,页面卡顿或崩溃。优点:页面加载速度快、可以减轻服务器的压力、节约了流量,

    图片懒加载思路

    1. 获得需要使用懒加载的DOM元素
    2. 计算视口高度  window.innerHeight || document.documentElement.clientHeight; //视口高度
    3. 懒加载函数:判断DOM元素是否在视口中,可以用ele.getBoundingClientRect().top 获得元素距离视口的高度,大于视口高度,即不加载,小于则加载
    4. window绑定滚动事件(第三步)

    优化处理

    1. 对滚动事件进行节流处理
    2. 针对加载过的资源不在进行加载,做法是给每个DOM元素设置一个isReset属性,元素加载资源前是false,加载后是true,该属性也作为上面“思路中第三部的一个条件”
    3. 解除绑定:当所有的懒加载的元素的isReset属性的值都是true是,解除绑定
    4. 对于懒加载图片来说,可以先实例化一个Image(),设置src后等实例对象onload再给DOM元素设置stc,这样可以解决加载过程中图片显示空白

     

    下面是对图片的懒加载,html中img的src的都是同一个基础资源,所以页面渲染之初对于图片资源只加载一次,真实的资源储可以存在img的自定义属性上,也可以储存在js的变量中

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0 maximum-scale=1.0 user-scalable=0">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            div{
                padding: 100px;
                border: 1px solid red
            }
            img{
                 400px;
                height: 300px;
            }
        </style>
    </head>
    <body>
        <div><span></span><img src="C:UsersAdministratorDesktopwhite.jpg" alt="" data_src='C:UsersAdministratorDesktopstrawberry.jpg'></div>
        <div><span></span><img src="C:UsersAdministratorDesktopwhite.jpg" alt="" data_src='C:UsersAdministratorDesktoporange.jpg'></div>
        <div><span></span><img src="C:UsersAdministratorDesktopwhite.jpg" alt="" data_src='C:UsersAdministratorDesktopgrape.jpg'></div>
        <div><span></span><img src="C:UsersAdministratorDesktopwhite.jpg" alt="" data_src='C:UsersAdministratorDesktopanana.jpg'></div>
        <div><span></span><img src="C:UsersAdministratorDesktopwhite.jpg" alt="" data_src='C:UsersAdministratorDesktopapple.jpg'></div>
    </body>
    <script>
    
    // 区别于常见的懒加载的第地方是当img重置src后,向img添加了一个isReset属性,该属性实现两点作用:
    // 1如果img都有这个属性,那么不会再对这个img设置src,
    // 2如果所有img都有这个属性,那么window的滚动事件解除懒加载函数
    
    var imgs = document.getElementsByTagName('img'); // 因为后续使用了数组的every,所以先转换为真实数组
    var innerHeight = window.innerHeight || document.documentElement.clientHeight; //视口高度
    
    function throttle(handler,wait){
        var lastTime = 0;
        return function(e){
            nowTmie = new Date().getTime();
            if(nowTmie - lastTime > wait){
                lastTime = nowTmie;
                handler.apply(this,arguments);
            }
        }
    }
    
    function lazyLoad(imgs, h){
        var h = h || 0; //  h是一个数值,加给视口高度,
        var isAllLoad = imgs.every(img => {  
            return img.getAttribute('isReset') == 'true';
        })
        if(isAllLoad){
            window.removeEventListener("scroll", throttleLazyLoad, false)
            return 
        }
        for (var i = 0; i < imgs.length; i++){
            var top = imgs[i].getBoundingClientRect().top; // img距离视口的高度
            var isLoad = imgs[i].getAttribute("isReset") // img的重置状态
            if(top < innerHeight + h && !isLoad){
                imgs[i].src = imgs[i].getAttribute('data_src');
                imgs[i].setAttribute('isReset', 'true');
            }
        }
    }
    lazyLoad(imgs) 
    var throttleLazyLoad = throttle(lazyLoad, 100).bind(this, imgs, 500); // 节流的同时为了实现解除带参数的事件函数,选择了bind方法
    window.addEventListener("scroll", throttleLazyLoad, false);
    
    </script>   
    </html>
  • 相关阅读:
    盒子模型之边框border
    CSS优先级特性之权重叠加
    CSS三大特性:层叠性、继承性、优先级
    行高
    单行文本垂直居中
    !important
    【DP专题】——[USACO13OPEN]照片Photo
    1:n Oberserver模式
    025_递归算法详解
    字符串移动问题
  • 原文地址:https://www.cnblogs.com/wangjie-nf/p/11489535.html
Copyright © 2020-2023  润新知