zoukankan      html  css  js  c++  java
  • JavaScript:图片懒加载原理

    这里面提出两个方案:基础版和高级版

    基础版

    getBoundingClientRect

    关于这个方法是什么可以看MDN给出的解释:https://developer.mozilla.org/zh-CN/docs/Web/API/Element/getBoundingClientRect

    首先给图片一个占位资源:

    <img src="default.jpg" data-src="http://www.xxx.com/target.jpg" />
    

    接着,通过监听 scroll 事件来判断图片是否到达视口:

    let img = document.getElementsByTagName("img");
    let num = img.length;
    let count = 0;//计数器,从第一张图片开始计
    
    lazyload();//首次加载别忘了显示图片
    
    window.addEventListener('scroll', lazyload);
    
    function lazyload() {
      for(let i = count; i <num; i++) {
        // 元素现在已经出现在视口中
        if(img[i].getBoundingClientRect().top < document.documentElement.clientHeight) {
          if(img[i].getAttribute("src") !== "default.jpg") continue;
          img[i].src = img[i].getAttribute("data-src");
          count ++;
        }
      }
    }
    

    高级版

    IntersectionObserver

    这是浏览器内置的一个API,实现了监听window的scroll事件、判断是否在视口中以及节流三大功能。

    我们来具体试一把:

    let img = document.getElementsByTagName("img");
    
    const observer = new IntersectionObserver(changes => {
      //changes 是被观察的元素集合
      for(let i = 0, len = changes.length; i < len; i++) {
        let change = changes[i];
        // 通过这个属性判断是否在视口中
        if(change.isIntersecting) {
          const imgElement = change.target;
          imgElement.src = imgElement.getAttribute("data-src");
          observer.unobserve(imgElement);
        }
      }
    })
    Array.from(img).forEach(item => observer.observe(item));
    

    这样就很方便地实现了图片懒加载,当然这个IntersectionObserver也可以用作其他资源的预加载,功能非常强大。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    greenplum导数据
    greenplum 集群部署
    jmx远程访问权限设置
    分布式实时日志处理平台ELK
    hbase0.95.2部署
    hadoop2.2.0部署
    highcharts
    FreeMarker
    使用solr的完整流程
    solr搜索流程
  • 原文地址:https://www.cnblogs.com/XF-eng/p/15079910.html
Copyright © 2011-2022 走看看