zoukankan      html  css  js  c++  java
  • 编写代码实现图片的懒加载

    编写代码实现图片的懒加载
        1 前端性能优化的重要方案,通过图片或者数据的延迟加载,我们可以加快页面的渲染的速度,让我们第一次打开页面的速度变快
        2 只有滑动到某个区域,我们才加载真实的图片,这样也可以节省加载的流量
    如何实现图片懒加载
        把所有需要延迟加载的图片用一个盒子包起来,设置宽高和默认的占位图,
        开始让所有的img的src为空,把真实图片的地址放到img的自定义属性上,让img隐藏
        等待所有其他资源都加载完之后,我们再开始加载图片
        等于很多图片,需要当页面滚动的时候,当前图片区域完全显示出来后在加载真实图片
     

    单张图片的延迟加载, 当图片进入显示区在加载

    html代码 

    <!DOCTYPE html>
    <html lang="en">
    <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .imgBox{
            margin: 1000px auto;
            width: 300px;
            height: 100px;
            overflow: hidden;
            background-color: #bbb;
        }
        .imgBox img{
            display: none; /* 图片一开始是隐藏的*/
            width: 100%;
        }
    </style>
    </head>
    <body>
    <div class="imgBox">
    
            <img src="" alt=""
                data-img="https://aecpm.alicdn.com/simba/img/TB1JNHwKFXXXXafXVXXSutbFXXX.jpg"
            >
            
    </div>
    
    
    <script src="/jquery-3.2.1.js"></script>
    <script src="/01.js"></script>
    </body>
    </html>

    js文件

    let $imgBox = $('.imgBox'),
        $img = $imgBox.children('img'); 
    // jq中的事件绑定支持多事件绑定:window.onload  &  window.onscroll  两个事件触发的时候执行相同的事情
    // load当页面中所有资源都加载完成之后触发,scroll浏览器滚动触发
    // $imgBox.outerHeight() 表示 获取$imgBox元素的高度 (当前元素的高度)
    // $imgBox.offset()  表示  获取$imgBox元素顶部距离body页面顶部/左边的距离
    // $(window).outerHeight()表示浏览器的高度
    // $A 图片底边到页面顶部的距离 = 图片的高度 + 图片顶边到页面顶边的距离
    // $B 浏览器底边到页面顶边的距离 = 浏览器的可视区一屏幕的高度 + 滚动条卷去的高度
    $(window).on('load scroll',function(){
          if($img.attr('isLoad')==='true'){
                return; // 如果加载过就不会再加载
          }
    
                //    图片的高度 + 图片顶边到页面顶边的距离
          let $A = $imgBox.outerHeight() + $imgBox.offset().top
                //    浏览器的高度(一屏幕高) +  滚动条卷去的高度
          let $B = $(window).outerHeight() +   $(window).scrollTop();
    
          if( $A <= $B){ //  如果 图片底边到页面顶部的距离 <=  浏览器底边到页面顶边的距离就加载真实图片
                // 加载真实图片
                $img.attr('src',$img.attr('data-img'));//获取自定义属性的值,赋值给src
                $img.on('load',function(){
                      //当图片加载成功后,再在页面上显示图片
                      // $img.css('display','block')
                      $img.stop().fadeIn(); // 使图片渐变出来
                });
                $img.attr('isLoad',true)  // attr储存自定义属性值都是字符串格式'true'
          }
    })

    如何实现 多张图片的延迟加载

     html文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <meta http-equiv="X-UA-Compatible" content="ie=edge">
          <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .imgBox{
            margin-bottom: 20px;
            height: 160px;
            overflow: hidden;
            background-color: #bbb;
        }
        .imgBox img{
            display: none; /* 图片一开始是隐藏的*/
            width: 100%;
        }
        .container{
            width: 800px;
            margin: 0 auto;
        }
    </style>
    </head>
    <body>
    <div class="container">
            <!-- <div class="imgBox">
                    <img src="" alt="" data-img="https://aecpm.alicdn.com/simba/img/TB1JNHwKFXXXXafXVXXSutbFXXX.jpg" >   
            </div> -->
    </div>
    
    
    
    
    <script src="/jquery-3.2.1.js"></script>
    <script src="/01.js"></script>
    </body>
    </html>

    js文件

    let $container = $('.container')
        $imgBoxs = null;
    
    // 制造假数据
    let str = ``;
    // 创造一个长度为20的数组,每一项都用null填充
    new Array(20).fill(null).forEach((item,index)=>{//其实就是个for循环
         str += `
                <div class="imgBox">
                       <img src="" alt="" data-img="https://aecpm.alicdn.com/simba/img/TB1JNHwKFXXXXafXVXXSutbFXXX.jpg" >   
                </div>      
         `
    })
    $container.html(str)
    $imgBoxs = $container.children('.imgBox');
    
    // 多张图片延迟加载
    $(window).on('load scroll',function(){
          //获取浏览器底边框到body页顶边的距离
          let $B = $(window).outerHeight() +   $(window).scrollTop(); // 浏览器的可视区一屏幕的高度 + 滚动条卷去的高度
          //循环每一张图片区域,根据当前图片到body页顶边的距离,计算出里面的图片是否加载
          $imgBoxs.each((index,item)=>{
                let $item = $(item);
                $itemA = $item.outerHeight() + $item.offset().top  // 图片的高度 + 图片顶边到页面顶边的距离
                isLoad = $item.attr('isLoad')
    
                if( $B >= $itemA && isLoad !== 'true'){//如果 浏览器底边到页面顶端的距离 >=  图片底边到页面顶端的距离
                      $item.attr('isLoad',true)
                      //加载当前区域中的图片
                      let $img = $item.children('img') //获得每张图片
                      $img.attr('src',$img.attr('data-img'));//获取自定义属性的值,赋值给src
    
                      $img.on('load',()=>{
                            //当图片加载成功后,再在页面上显示图片
                            // $img.css('display','block')
                            $img.stop().fadeIn(); // 使图片渐变出来
                      });
                }
          })
    })
     
     
  • 相关阅读:
    2.GO-可变参数函数、匿名函数和函数变量
    1.Go-copy函数、sort排序、双向链表、list操作和双向循环链表
    第四章、Go-面向“对象”
    第三章、Go-内建容器
    第二章、Go-基础语法
    第一章、Go安装与Goland破解
    arthas使用分享
    redis如何后台启动
    java.io.IOException: Could not locate executable nullinwinutils.exe in the Hadoop binaries
    安装redis出现cc adlist.o /bin/sh:1:cc:not found的解决方法
  • 原文地址:https://www.cnblogs.com/javascript9527/p/11688830.html
Copyright © 2011-2022 走看看