首页 > 其他分享 >简单 Lazy-Load 实现

简单 Lazy-Load 实现

时间:2022-12-15 12:00:14浏览次数:38  
标签:Load src Lazy img 可视 元素 num 简单

首先新建一个空项目,目录结构如下:

大家可以往 images 文件夹里塞入各种各样自己喜欢的图片。

我们在 index.html 中,为这些图片预置 img 标签:

<!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>Lazy-Load</title>
  <style>
    .img {
      width: 200px;
      height:200px;
      background-color: gray;
    }
    .pic {
      // 必要的img样式
    }
  </style>
</head>
<body>
  <div class="container">
    <div class="img">
      // 注意我们并没有为它引入真实的src
      <img class="pic" alt="加载中" data-src="./images/1.png">
    </div>
    <div class="img">
      <img class="pic" alt="加载中" data-src="./images/2.png">
    </div>
    <div class="img">
      <img class="pic" alt="加载中" data-src="./images/3.png">
    </div>
    <div class="img">
      <img class="pic" alt="加载中" data-src="./images/4.png">
    </div>
    <div class="img">
      <img class="pic" alt="加载中" data-src="./images/5.png">
    </div>
     <div class="img">
      <img class="pic" alt="加载中" data-src="./images/6.png">
    </div>
     <div class="img">
      <img class="pic" alt="加载中" data-src="./images/7.png">
    </div>
     <div class="img">
      <img class="pic" alt="加载中" data-src="./images/8.png">
    </div>
     <div class="img">
      <img class="pic" alt="加载中" data-src="./images/9.png">
    </div>
     <div class="img">
      <img class="pic" alt="加载中" data-src="./images/10.png">
    </div>
  </div>
</body>
</html>

在懒加载的实现中,有两个关键的数值:一个是当前可视区域的高度,另一个是元素距离可视区域顶部的高度。

当前可视区域的高度, 在和现代浏览器及 IE9 以上的浏览器中,可以用 window.innerHeight 属性获取。在低版本 IE 的标准模式中,可以用 document.documentElement.clientHeight 获取,这里我们兼容两种情况:

const viewHeight = window.innerHeight || document.documentElement.clientHeight 

而元素距离可视区域顶部的高度,我们这里选用 getBoundingClientRect() 方法来获取返回元素的大小及其相对于视口的位置。对此 MDN 给出了非常清晰的解释:

该方法的返回值是一个 DOMRect 对象,这个对象是由该元素的 getClientRects() 方法返回的一组矩形的集合, 即:是与该元素相关的 CSS 边框集合 。
DOMRect 对象包含了一组用于描述边框的只读属性——left、top、right 和 bottom,单位为像素。除了 width 和 height 外的属性都是相对于视口的左上角位置而言的。
其中需要引起我们注意的就是 left、top、right 和 bottom,它们对应到元素上是这样的:

可以看出,top 属性代表了元素距离可视区域顶部的高度,正好可以为我们所用!

Lazy-Load 方法开工啦!

<script>
    // 获取所有的图片标签
    const imgs = document.getElementsByTagName('img')
    // 获取可视区域的高度
    const viewHeight = window.innerHeight || document.documentElement.clientHeight
    // num用于统计当前显示到了哪一张图片,避免每次都从第一张图片开始检查是否露出
    let num = 0
    function lazyload(){
        for(let i=num; i<imgs.length; i++) {
            // 用可视区域高度减去元素顶部距离可视区域顶部的高度
            let distance = viewHeight - imgs[i].getBoundingClientRect().top
            // 如果可视区域高度大于等于元素顶部距离可视区域顶部的高度,说明元素露出
            if(distance >= 0 ){
                // 给元素写入真实的src,展示图片
                imgs[i].src = imgs[i].getAttribute('data-src')
                // 前i张图片已经加载完毕,下次从第i+1张开始检查是否露出
                num = i + 1
            }
        }
    }
    // 监听Scroll事件
    window.addEventListener('scroll', lazyload, false);
</script>

标签:Load,src,Lazy,img,可视,元素,num,简单
From: https://www.cnblogs.com/zaisanshuiyifang/p/16836217.html

相关文章

  • rt_raster_to_gdal: Could not load the output GDAL driver
    问题记录:postgis安装后不能执行以下语句,查询入库的tif文件SELECTST_AsGDALRaster(rast,'GTiff')AsrastjpgFROMradar_data_xxWHERErid=1;解决办法:1. 确认......
  • .net core 6.0 使用sqlhelper实现简单的增删改查页面
    一、创建数据表1.根据数据结构文档创建数据表2.数据表创建查询索引二、创建实体类三、创建业务类1.划分业务类结构2.创建默认业务方法四、创建列表......
  • 简单实例
    一个基础使用方式,方便自己查看。packagecom.sora.springboot01.netty;importio.netty.bootstrap.Bootstrap;importio.netty.channel.ChannelFuture;importio.nett......
  • 简单工厂模式(创建型)
    如何创建一个对象?publicinterfaceProductpublicclassAppleProductpublicclassGoogleProductpublicclassBananaProduct###########################################......
  • Upload-labs第一关(笔记版)
    第一关通过右键查看源代码或者提示,我们不难发现是一个前端验证,一般前端验证都是纸老虎,形同虚设。img所以第一关的通关方法有三种:第一就是将浏览器js代码禁用掉,右键---检......
  • 前端开发系列065-JQuery篇之框架简单介绍
    title:'前端开发系列065-JQuery篇之框架简单介绍'tags:categories:[]date:2018-05-1112:57:52一、jQuery简介jQuery是一款优秀的javaScript库(框架),该框架凭借简洁......
  • 前端开发系列062-网络篇之前端开发Ajax简单介绍
    title:前端开发系列062-网络篇之前端开发Ajax简单介绍tags:categories:[]date:2018-03-2617:05:13一、Ajax技术简单介绍Ajax是一门异步的用于发送网络请求的技术......
  • 一个简单的完整人脸识别系统
    一个简单的完整人脸识别系统from__future__importprint_function#便于测试新版本函数fromtimeimporttime#从time模块导入time,因为有些步骤需要计时importlog......
  • 牛客CSP-J入门组 --- 简单的烦恼
    链接:https://ac.nowcoder.com/acm/problem/25184来源:牛客网题目描述网易云音乐推出了定时关闭播放的功能,假设到了定时关闭播放的时间,当前这首歌......
  • oracle的leading(),use_nl(),index()简单介绍
    使用leading和use_nl可以设置表的查询顺序,来加快查询速度,比如有a,b,c,d四张表,a表的数据最少,如下设置select/*+leading(a)use_nl(a,b,c,d) index(a.id)*/ a.idfro......