美文网首页
原生js图片懒加载

原生js图片懒加载

作者: 靴唯白 | 来源:发表于2023-02-15 17:12 被阅读0次

前言

  1. 什么场景下用到懒加载?
    答:当一个页面上有很多图片,加载图片的时候占比时间长,造成页面渲染堵塞,用户体验差,这个时候就需要用到懒加载。
  2. 懒加载的原理是什么?
    答:懒加载的原理就是判断当前图片是否在视口内显示,显示的时候让图片真实地址替换加载图片。

最后实现的效果

首次加载
滚动条滚动监听加载

CSS部分

<style>
    img {
        height: 200px;
        margin-bottom: 10px;
        display: block;
    }
</style>

body 部分(自己找两张图片,一张预放的加载图片,另外一张我放的刘亦菲的图片)

<body>
    <img src="./load.gif" data-src="./lyf.webp" alt="">
    <img src="./load.gif" data-src="./lyf.webp" alt="">
    <img src="./load.gif" data-src="./lyf.webp" alt="">
    <img src="./load.gif" data-src="./lyf.webp" alt="">
    <img src="./load.gif" data-src="./lyf.webp" alt="">
    <img src="./load.gif" data-src="./lyf.webp" alt="">
    <img src="./load.gif" data-src="./lyf.webp" alt="">
    <img src="./load.gif" data-src="./lyf.webp" alt="">
    <img src="./load.gif" data-src="./lyf.webp" alt="">
    <img src="./load.gif" data-src="./lyf.webp" alt="">
    <img src="./load.gif" data-src="./lyf.webp" alt="">
    <img src="./load.gif" data-src="./lyf.webp" alt="">
</body>

script部分(懒加载的3种方法)

  1. 判断元素距离顶部的高度是否小于视口高度 + 滚动条高度
// 获取所有图片元素数组
let imgs = document.querySelectorAll("img");
// 声明一个变量用来存放上一次懒加载到哪一步了
let n = 0;
// 首次页面进来的时候需要渲染一遍
lazyLoad();
function lazyLoad() {
  let w = document.documentElement.clientHeight; // 视口高度 可见区域
  let s = document.documentElement.scrollTop || document.body.scrollTop; // 获取滚动条的滚动距离
  // 循环图片 
  for (let i = n; i < imgs.length; i++) {
    if (imgs[i].offsetTop < w + s) {
      // 用真实图片地址替换之前的加载图片
      imgs[i].src = imgs[i].dataset.src
      imgs[i].removeAttribute('data-src')
      // 为了防止重复加载
      n = i + 1;
    }
  }
}
window.addEventListener("scroll", lazyLoad);
  1. 判断元素距离窗口的高度是否小于窗口的高度 getBoundingClientRect().top 为元素相对于窗口的位置;window.innerHeight 为当前窗口的高度
// 获取所有图片元素数组
let imgs = document.querySelectorAll("img");
// 声明一个变量用来存放上一次懒加载到哪一步了
let n = 0;
// 首次页面进来的时候需要渲染一遍
lazyLoad();
function lazyLoad() {
  for (let i = n; i < imgs.length; i++) {
    if (imgs[i].getBoundingClientRect().top < window.innerHeight) {
      if (imgs[i].getAttribute("src").includes("load.gif")) {
        imgs[i].src =  imgs[i].dataset.src
        imgs[i].removeAttribute('data-src')
        n = i + 1;
      }
    }
  }
}
window.addEventListener("scroll", lazyLoad);
  1. 其实上面两种方式已经大致实现懒加载,但是,它们都有一个缺点,就是一当发生滚动事件时,就发生了大量的循环和判断操作判断图片是否可视区里。这自然是不太好的,那是否有解决方法。这里就引入了一个叫 Intersection Observer 观察器接口,它是是浏览器原生提供的构造函数,使用它能省到大量的循环和判断。当然它的兼容可能不太好,看情况使用。
// 替换方案 IntersectionObserver
function imgObserver() {
  let observer = new IntersectionObserver((entries) => {
    entries.forEach((entrie) => {
      if (entrie.isIntersecting) {
        let img = entrie.target;
        img.src = img.dataset.src
        img.removeAttribute('data-src')
        observer.unobserve(img);
      }
    });
  });
  imgs.forEach((img) => {
    observer.observe(img);
  });
}
imgObserver()
document.addEventListener("scroll", imgObserver);
</script>

相关文章

  • 图片懒加载

    前端实现图片懒加载(lazyload)的两种方式 原生JS实现最简单的图片懒加载 30行Javascript代码实...

  • 原生js 图片懒加载

  • 原生js 图片懒加载

    1、使用方法 1、引入下面js2、在img添加 class="lazyloadimg" 类名,src 里面是默认图...

  • JS 原生图片懒加载

  • JS

    JS 懒加载,预加载 概念:懒加载也叫延迟加载:JS图片延迟加载,延迟加载图片或符合某些条件时才加载某些图片。预加...

  • 原生JS实现图片懒加载

    (1) 图片距离文档顶部的高度: img.offsetTop(2) 返回窗口文档显示区的高度: window.in...

  • 原生JS实现图片懒加载

    最近接的项目终于接近尾声,这段时间一直没有造轮子,在实现设计图还原的途中,发现还是有一些技术需要掌握,难者不会,会...

  • 原生js图片懒加载-即用

    编码时要注意所有的img标签里的src属性都要写成_src。函数getPos是为了得到obj的定位父级的left和...

  • 原生 JS 实现图片懒加载

    1、什么是懒加载? 懒加载就是延迟加载的意思,比如我们加载一个页面,这个页面很长很长,长到我们的浏览器可视区域装不...

  • 原生js实现图片懒加载

    用多了懒加载插件,尝试一下自己撸一个,顺便了解其中原理和实现方法吧。 什么是懒加载 懒加载其实就是延迟加载,是一种...

网友评论

      本文标题:原生js图片懒加载

      本文链接:https://www.haomeiwen.com/subject/zphukdtx.html