美文网首页
IntersectionObserver

IntersectionObserver

作者: 冷暖自知_zjz | 来源:发表于2020-09-22 11:07 被阅读0次

    IntersectionObserver

    参考:

    IntersectionObserver 监听元素是否进入了可视区域。

    在没有这个api的时候为了实现监听元素是否进入了可视区域需要监听scroll事件,得到它对应于视口的坐标,再判断是否在视口之内。

    用法:

    var io = new IntersectionObserver(callback, option);
    

    IntersectionObserver是浏览器原生提供的构造函数,接受两个参数:callback是可见性变化时的回调函数,option是配置对象(该参数可选)。

    构造函数的返回值是一个观察器实例。实例的observe方法可以指定观察哪个 DOM 节点。

    // 开始观察
    io.observe(document.getElementById('example'));
    // 停止观察
    io.unobserve(element);
    // 关闭观察器
    io.disconnect();
    

    话不多说先看下面的例子(滚动加载)

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
        html,body{
          height: 100%;
          width: 600px;
          margin: 0 auto;
        }
        #top{
          height: 101%;
          background-color: aqua;
        }
        #observe{
          height: 5px;
          width: 100%;
        }
        .add{
          height: 300px;
          width: 100%;
          background-color: pink;
          border:1px solid aqua;
        }
      </style>
    </head>
      <body>
        <div id="top"></div>
        <div id="observe"></div>
        <script>
            var top = document.getElementById('top');
            var observe = document.getElementById('observe')
            function addElement(){
               var c = document.createElement('div');
                c.classList.add("add")
                document.querySelector('body').appendChild(c)
                observe.parentNode.insertBefore(c, observe)
            }
            const intersectionObserver = new IntersectionObserver((entries) => {
                for (entry of entries) {
                    // 当observe元素可见时执行加载
                    if (entry.target.id == 'observe' && entry.isIntersecting) {
                      addElement()
                    }
                }
            });
            // 观测observe
            intersectionObserver.observe(observe);
      </script>
      </body>
    </html>
    

    当元素在容器里面滚动怎么办?

    var option = { 
      // 设置根元素  
      root: document.querySelector('.container'),
      // 定义根元素的margin
      rootMargin: "500px 0px" 
    };
    var observer = new IntersectionObserver(
      callback,
      option
    )
    

    例子2 图片懒加载

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    <body>
      <div>
        <img src="eg.jpg" alt="" data-img="./1.jpg"><br>
        <img src="eg.jpg" alt="" data-img="./2.jpg"><br>
        <img src="eg.jpg" alt="" data-img="./3.jpg"><br>
        <img src="eg.jpg" alt="" data-img="./4.jpg"><br>
        <img src="eg.jpg" alt="" data-img="./5.jpg"><br>
      </div>
      <script>
        const imgs = document.querySelectorAll('[data-img]');
        const intersectionObserver = new IntersectionObserver((entries) => {
            for (entry of entries) {
                if (entry.isIntersecting) {
                  console.log(entry.target.dataset.img);
                  //当图片可见时把data-img的值赋值给src实现懒加载
                  entry.target.src = entry.target.dataset.img;
                  intersectionObserver.unobserve(entry.target);
                }
            }
        },{threshold: [0.5]});
        imgs.forEach((item) => {
            intersectionObserver.observe(item)
        });
    </script>
    </body>
    </html>
    

    IntersectionObserverEntry 对象(‘entries’是一个数组,每个成员都是一个)

    IntersectionObserverEntry对象提供目标元素的信息,一共有六个属性。

    {
        time: 6789.92,
        rootBounds: ClientRect {},
        boundingClientRect: ClientRect {},
        intersectionRect: ClientRect {},
        intersectionRatio: 0.5,
        target: element,
        isIntersecting: true
    }
    

    每个属性的含义如下。

    • time:可见性发生变化的时间,是一个高精度时间戳,单位为毫秒
    • target:被观察的目标元素,是一个 DOM 节点对象
    • rootBounds:根元素的矩形区域的信息,getBoundingClientRect()方法的返回值,如果没有根元素(即直接相对于视口滚动),则返回null
    • boundingClientRect:目标元素的矩形区域的信息
    • intersectionRect:目标元素与视口(或根元素)的交叉区域的信息
    • intersectionRatio:目标元素的可见比例,即intersectionRectboundingClientRect的比例,完全可见时为1,完全不可见时小于等于0
    • isIntersecting:只读isIntersecting属性是一个布尔值,它是true如果与相交观察者的根目标元素相交。如果是true,则IntersectionObserverEntry描述转换为相交状态;否则为。如果是false,则您知道过渡是从相交到不相交。

    相关文章

      网友评论

          本文标题:IntersectionObserver

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