当前位置: 首页 > news >正文

JavaScript中判断元素是否在可视区域内

JavaScript中判断元素是否在可视区域内

  • 1.有什么应用
  • 2.方法1-----使用offsetTop、scrollTop
  • 3.方法2-----getBoundingClientRect
  • 4.方法3-----Intersection Observer

1.有什么应用

  • 懒加载
  • 列表的无限滚动
  • 计算广告元素的曝光情况

2.方法1-----使用offsetTop、scrollTop

offsetTop、scrollTop属于三大家族的内容,详情见https://blog.csdn.net/fageaaa/article/details/145728760。

思路:元素的offsetTop-页面的scrollTop<=页面的高度

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Title</title>
    <style>
      .area1,
      .area3 {
        width: 100%;
        height: 1200px;
        background-color: aqua;
      }
      .box {
        width: 100%;
        height: 100px;
        background-color: red;
      }
    </style>
  </head>
  <body>
    <div class="area1"></div>
    <div class="area2 box"></div>
    <div class="area3"></div>
    <script>
      function isInViewPortOfOne(el) {
        // 下面是浏览器视口的高度的兼容性写法
        const viewPortHeight =
          window.innerHeight ||
          document.documentElement.clientHeight ||
          document.body.clientHeight;
        const offsetTop = el.offsetTop;
        const scrollTop = document.documentElement.scrollTop;
        const top = offsetTop - scrollTop;
        //注意这里只是个简略方式,没考虑el的边框
        return top <= viewPortHeight && top + el.clientHeight >= 0;
      }

      let box= document.querySelector(".box");
      window.addEventListener("scroll", function () {
        if (isInViewPortOfOne(box)) {
          console.log("box元素在可视区域内");
        } else {
          console.log("box元素不在可视区域内");
        }
      });
    </script>
  </body>
</html>

3.方法2-----getBoundingClientRect

getBoundingClientRect函数返回值是一个 DOMRect对象,拥有left, top, right, bottom, x, y, width, 和 height属性。详情见https://blog.csdn.net/fageaaa/article/details/145728760。
思路:top大于等于0;left大于等于0;right小于等于viewWidthbottom小于等于viewHeight

function isInViewPort(element) {
    const viewWidth = window.innerWidth || document.documentElement.clientWidth;
    const viewHeight = window.innerHeight || document.documentElement.clientHeight;
    const {
        top,
        right,
        bottom,
        left,
    } = element.getBoundingClientRect();
    return (
        top >= 0 &&
        left >= 0 &&
        right <= viewWidth &&
        bottom <= viewHeight
    );
}

4.方法3-----Intersection Observer

前面两种方式需要一直监听,就算用了防抖节流也要一直监听(只不过性能会好一点)。所以Intersection Observer这个方法性能上会更好!!!

浏览器提供了一种异步观察目标元素与祖先元素(或顶级文档的视口)交叉状态变化的方法。IntersectionObserver详细用法见https://blog.csdn.net/fageaaa/article/details/145741778

<head>
    <meta charset="UTF-8" />
    <title>Title</title>
    <style>
      .area1,
      .area3 {
        width: 100%;
        height: 1200px;
        background-color: aqua;
      }
      .box {
        width: 100%;
        height: 100px;
        background-color: red;
      }
    </style>
  </head>
  <body>
    <div class="area1"></div>
    <div class="area2 box"></div>
    <div class="area3"></div>
    <script>
      let box = document.querySelector(".box");
      //它提供了一种异步观察目标元素与祖先元素(或顶级文档的视口)交叉状态变化的方法。
      // 这个API的出现主要是为了高效解决在网页开发中需要频繁判断元素是否进入“视口”(viewport)的问题。
      // 相比于传统的依赖scroll事件和getBoundingClientRect方法,Intersection Observer API在性能上有显著的优势
      let intersectionObserver = new IntersectionObserver(function (el) {
        if (el[0].intersectionRatio <= 0) {
          console.log("元素彻底离开可视区");
        } else {
          console.log("元素进入可视区");
          //进入可视区之后,资源已经下载好,就不需要再进行监视了
          intersectionObserver.unobserve(box);
        }
      });
      intersectionObserver.observe(box);
    </script>
  </body>

相关文章:

  • linux有名管道的文件描述符3和4
  • 个人简历html网页模板,科技感炫酷html简历模板
  • DeepSeek API调用 Python
  • Hive中的分区和桶的概念及其作用
  • 网络工程师 (47)QOS
  • 小怿学习日记(七) | Unreal引擎灯光架构
  • 【wrk】wrk 压测工具入门
  • DeepSeek与ChatGPT的对比分析
  • K8s 之端口暴露(The Port of K8s is Exposed)
  • Jmeter连接数据库、逻辑控制器、定时器
  • SOME/IP--协议英文原文讲解8
  • 《魔女的夜宴》无广版手游安卓苹果免费下载直装版
  • 红蓝对抗之常见网络安全事件研判、了解网络安全设备、Webshell入侵检测
  • Mac端homebrew安装配置
  • P1115 最大子段和
  • fps僵尸:8.丧尸死亡
  • 解决 Mac 只显示文件大小,不显示目录大小
  • 图的最小生成树算法: Prim算法和Kruskal算法(C++)
  • EasyRTC:开启智能硬件与全平台互动新时代
  • 01数据准备 抓取图片 通过爬虫方式获取bing的关键词搜索图片
  • 三亚通报救护车省外拉警报器开道旅游:违规违法,责令公司停业整顿
  • 习近平在中拉论坛第四届部长级会议开幕式的主旨讲话(全文)
  • 老人将房产遗赠给外孙,三个女儿却认为遗嘱应无效,法院判了
  • 央行等印发《关于金融支持广州南沙深化面向世界的粤港澳全面合作的意见》
  • 秦洪看盘|预期改善,或迎来新的增量资金
  • 让胖东来“自闭”的玉石生意,究竟水有多深?