• 原生js实现图片懒加载


    目的:

    • 大量图片的网站,一次性加载所有图片会存在速度变慢,卡顿等问题。
    • 我们可以使用图片懒加载技术,只加载视口内的图片,其余图片用默认小图片 (由于所有图片都使用这一张小图片,只会发送一次请求,不会增加性能负担。) 或者骨架屏代替。
    • 等图片滚动到可视区后,再给图片url赋值。
    • 这样优化了前端加载速度,提高了性能

    核心思路:

    scrollTop 判断图片滚动的距离, innerHeight求当前视口高度,offsetTop得到图片相对于父元素的位置,然后scrollTop + clientH - elementTop - 图片自身的高度 得到元素当前的位置。
    如果 >=0 说明该元素在视口内,给元素的url赋值
    在这里插入图片描述

    代码实现:

    DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Documenttitle>
      <style>
        *{
            margin: 0;
            padding: 0;
        }
        ul{
            list-style: none;
        }
        li{
            width: 100%;    
            height: 200px;
            text-align: center;
            line-height: 200px
        }
        img{
            display: block;
            height: 200px;
        }
        style>
    head>
    <body>
      
      
      <img src="./images/1pxImg.png" data-url="./images/01.jpg">
      <img src="./images/1pxImg.png" data-url="./images/01.jpg">
      <img src="./images/1pxImg.png" data-url="./images/02.jpg">
      <img src="./images/1pxImg.png" data-url="./images/02.jpg">
      <img src="./images/1pxImg.png" data-url="./images/03.jpg">
      <img src="./images/1pxImg.png" data-url="./images/03.jpg">
      <img src="./images/1pxImg.png" data-url="./images/04.jpg">
      <img src="./images/1pxImg.png" data-url="./images/04.jpg">
    
      
      <script>
        let imgs = document.querySelectorAll('img')
        console.log(imgs);
        scrollFn()
        // 监听滚动事件
        window.onscroll = scrollFn
        function scrollFn() {
          let clientH = window.innerHeight // 可视区高度
          let scrollTop = document.documentElement.scrollTop // 滚动的高度
          console.log(clientH, scrollTop)
          Array.from(imgs).forEach(item => {
            let elementTop = item.offsetTop // 元素相对于父元素的位置
            // console.log('eleTop', elementTop)
            let count = scrollTop + clientH - elementTop - item.height // 元素的位置
            console.log('count',count)
            if(count >= 0) {
              // 如果大于等于0,说明在可视区内,给图片赋值
              item.setAttribute('src', item.getAttribute('data-url'))
            }
          })
        }
      script>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
  • 相关阅读:
    3d模型怎么一缩放模型都散了?---模大狮模型网
    GB28181学习(三)——心跳保活
    RDKit | 建立溶解度预测的LightGBM回归模型
    自动控制原理2.2---控制系统的复数域数学模型
    悬浮窗开发设计实践
    centos安装nexus3.x版本
    vscode setting.json 全局设置 工作区设置 位置 优先级
    使用React和ResizeObserver实现自适应ECharts图表
    Linux如何安装JDK?Linux如何安装JDK1.8?FinalShell如何上传文件到Linux?
    阅读论文Parallel Instance Query Network for Named Entity Recognition
  • 原文地址:https://blog.csdn.net/qq_41675812/article/details/126686912