加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱制作网_沈阳站长网 (https://www.024zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

用JS怎样监测元素位 置在不在视口内?

发布时间:2022-11-14 11:15:18 所属栏目:语言 来源:
导读:  本文我们主要了解怎样用JS来监测元素位置在不在视口内,这里会给大家分享两个方法,实现代码如下,有这方面学习需要的朋友可以参考,那么接下来就跟随小编来学习一下吧。
  
  1. 位置计算
  使用 Elem
  本文我们主要了解怎样用JS来监测元素位置在不在视口内,这里会给大家分享两个方法,实现代码如下,有这方面学习需要的朋友可以参考,那么接下来就跟随小编来学习一下吧。
  
  1. 位置计算
  使用 Element.getBoundingClientRect() 方法返回元素相对于视口的位置
  
  const isElementVisible = (el) => {
   const rect = el.getBoundingClientRect();
  };
  获取浏览器窗口的宽高
  
  const isElementVisible = (el) => {
   const rect = el.getBoundingClientRect();
    const vWidth = window.innerWidth || document.documentElement.clientWidth;
    const vHeight = window.innerHeight || document.documentElement.clientHeight;
  };
  判断元素是否在视口内,如图所示
  
  
  
  const isElementVisible = (el) => {
    const rect = el.getBoundingClientRect()
    const vWidth = window.innerWidth || document.documentElement.clientWidth
    const vHeight = window.innerHeight || document.documentElement.clientHeight
  
    
    if (
      rect.right < 0 ||
      rect.bottom < 0 ||
      rect.left > vWidth ||
      rect.top > vHeight
    ) {
      return false
    }
  
    return true
  }
  
  getBoundingClientRect 方法会使浏览器发生回流和重绘,性能消耗稍大,但兼容性比 Intersection Observer 要好。
  
  2. Intersection Observer
  The Intersection Observer API provides a way to asynchronously observe changes in the intersection of a target element with an ancestor element or with a top-level document's viewport.
  
  Intersection Observer API提供了一种异步检测目标元素与祖先元素或 viewport 相交情况变化的方法。在目标元素与视口或者其他指定元素发生交集时和触发配置的回调函数。
  
  // 获取要监测的元素
  const boxes = document.querySelectorAll('.box')
  
  // 创建观察者,配置回调函数
  // 通过 isIntersecting 属性判断元素与视口是否相交
  const observer = new IntersectionObserver((entries, observer) => {
   entries.forEach((entry) => {
      console.log(
        entry.target,
        entry.isIntersecting ? "visible" : "invisible"
      );
    });
  })
  
  boxes.forEach((box) => {
    observer.observe(box);
  });
 

(编辑:我爱制作网_沈阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!