之前都是监听页面滚动,使用

window.addEventListener("scroll", () => {})

然后判断图片是否进入可视区域,在进行加载图片(data-src自定义属性,赋值给src属性)

这里介绍一个高性能的图片懒加载方式,浏览器原生自带的Intersection Observer API(兼容性也挺好),用于异步检测目标元素与父级或顶级元素是否产生交叉。直接上代码

  
   let observer = new IntersectionObserver(
      (entries) => {
        console.log("交叉了");
        console.log(entries);
        for (const entrie of entries) {
          if (entrie.isIntersecting) {
              const img = entrie.target;
              img.src = img.dataset.url;
              // 取消监听
              observer.unobserve(img);
          }
        }
      },
      {
        root: null,// 表示要观察的目标元素(我们这里是img),与哪个父元素产生交叉,不传或者传null,就表示根元素,即浏览器的视口。
        rootMargin: "0px 0px 0px 0px",// root的偏移量
        threshold: 0.5 //是一个0~1之间的值,表示一个触发的阈值,如果是0,只要目标元素一碰到root元素,就会触发,如果是1,表示目标元素完全进入root元素范围,才会触发。
      }
    );
  // 获取所有的图片元素
    const imgs = document.querySelectorAll("img");
    // 遍历这些元素
    imgs.forEach((img) => {
      // 用observe方法观察这些元素
      observer.observe(img);
    });

 

posted on 2024-08-08 11:02  lily_w  阅读(8)  评论(0编辑  收藏  举报