js如何对元素可视区域进行判定

目录
  • 前言
  • 方案介绍
    • 使用 getBoundingClientRect
    • 使用 scrollTop 与 offsetTop
    • 使用 IntersectionObserver
  • 注意事项

前言

在前端开发中,有时候我们需要判断一个元素是否在可视区域内,比如实现懒加载、曝光统计、动画效果等功能。那么,如何对进行元素可视区域的判定呢?本文将介绍几种常用的方法,并分析它们的优缺点。

方案介绍

使用 getBoundingClientRect

getBoundingClientRect 是一个 DOM API,它返回一个对象,包含了元素的左、右、上、下、宽、高等属性,这些属性都是相对于视口的。根据该对象返回值可以通过以下条件判断元素是否在可视范围内:

  • 当 DOMRect.top 小于视口高度 且 DOmRect.bottom 大于0
  • 当 DOMRect.left 小于视口宽度 且 DOmRect.right 大于0

这种方法的优点是简单易用,不需要考虑滚动条的影响,也不需要获取元素的尺寸和位置。缺点是兼容性不太好,IE8 及以下不支持该 API。

function isInViewport(element) {
  const rect = element.getBoundingClientRect();
  return (
    rect.top < window.innerHeight &&
    rect.bottom > 0 &&
    rect.left < window.innerWidth &&
    rect.right > 0
  );
}

使用 scrollTop 与 offsetTop

scrollTop 是一个属性,表示元素滚动条向下滚动的距离。offsetTop 是一个属性,表示元素相对于其最近的定位父元素的顶部偏移量。通过这两个属性,我们可以计算出元素相对于文档的顶部偏移量,然后再与视口高度和滚动条位置进行比较,判断元素是否在可视区域内:

  • 当 元素距文档顶部距离 - 滚动条位置 < 视口高度 且 元素距文档顶部距离 - 滚动条位置 + 元素高度 > 0
  • 当 元素距文档左侧距离 - 滚动条位置 < 视口宽度 且 元素距文档左侧距离 - 滚动条位置 + 元素宽度 > 0

这种方法的优点是兼容性好,可以支持 IE8 及以上浏览器。缺点是需要考虑滚动条的影响,也需要获取元素的尺寸和位置,比较繁琐。

function isInViewport(element) {
  const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
  const offsetTop = element.offsetTop;
  const windowHeight = window.innerHeight;
  const elementHeight = element.offsetHeight;

  return (
    offsetTop - scrollTop < windowHeight &&
    offsetTop - scrollTop + elementHeight > 0
  );
}

使用 IntersectionObserver

IntersectionObserver 是一个新的 API,它可以用来监听元素与其祖先元素或视口的交叉情况。它接受一个回调函数和一个配置对象作为参数,回调函数会在每次元素交叉状态发生变化时被调用,配置对象可以指定观察的根元素、根边界和阈值。通过这个 API,我们可以轻松地判断元素是否在可视区域内 :

  • 创建一个 IntersectionObserver 实例,并传入一个回调函数和一个配置对象
  • 在回调函数中,根据 entries 参数获取每个被观察元素的交叉信息
  • 判断每个被观察元素的 isIntersecting 属性是否为 true,如果是,则表示元素在可视区域内
function isInViewport(element) {
  const observer = new IntersectionObserver(
    ([entry]) => {
      return entry.isIntersecting;
    },
    {
      root: null,
      rootMargin: '0px',
      threshold: 0,
    }
  );

  observer.observe(element);
}

注意事项

  • 元素可视区域的判定需要在滚动事件触发时进行,否则无法及时更新元素的状态。
  • 不同的判定方法可能会受到一些特殊情况的影响,例如元素的定位方式、元素与祖先元素的滚动条、元素的显示状态等。因此需要在实际使用时进行测试和验证。
  • 当需要同时监听多个元素的可视状态时,可以考虑使用 IntersectionObserver 来提高性能。
  • 当需要进行复杂的可视区域判定时,可以考虑使用第三方库或框架来简化操作,例如 react-intersection-observerscrollama 等。
  • 在进行元素的可视区域判定时,需要避免频繁地操作 DOM 和触发回流和重绘,否则会影响页面性能。可以通过防抖或节流等方式进行优化。

到此这篇关于js如何对元素可视区域进行判定的文章就介绍到这了,更多相关js 元素可视区域判定内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JS判断元素是否在可视区域技巧详解

    目录 前言 实现方式 offsetTop.scrollTop 注意 getBoundingClientRect 前言 在日常开发中,我们经常需要判断目标元素是否在视窗之内或者和视窗的距离小于一个值(例如 100 px),从而实现一些常用的功能,例如: 图片的懒加载 列表的无限滚动 计算广告元素的曝光情况 可点击链接的预加载 实现方式 判断一个元素是否在可视区域,我们常用的有offsetTop.scrollTop和getBoundingClientRect offsetTop.scrollTop

  • js获取浏览器的可视区域尺寸的实现代码

    测试例子: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/

  • 快速实现JS图片懒加载(可视区域加载)示例代码

    js懒加载图片 如何提高网页加载速度?在网页中有许多img标签,这些标签就是图片,其属性src则是指向服务器地址,当浏览器从上往下读取到src标签中的地址时,浏览器就会开启线程,加载这张图片.而并不是等到整张页面都解析完成才加载图片.我们要做的就是加载用户可视范围内的图片. js懒加载图片的目的 1.网页优化,提高网页加载速度 2.页面优化友好,提高SEO收录与排名 3.提高用户体验,减少服务器压力 实例代码如下: <!DOCTYPE html> <html lang="en&

  • js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码

    获取浏览器窗口的可视区域高度和宽度,滚动条高度有需要的朋友可参考一下.IE中,浏览器显示窗口大小只能以下获取: 代码如下复制代码 复制代码 代码如下: document.body.offsetWidth document.body.offsetHeight 在声明了DOCTYPE的浏览器中,可以用以下来获取浏览器显示窗口大小: 代码如下复制代码 复制代码 代码如下: document.documentElement.clientWidth document.documentElement.cli

  • ztree获取选中节点时不能进入可视区域出现BUG如何解决

    zTree 是一个依靠 jQuery 实现的多功能 "树插件".优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点. zTree 的特点编辑 ● zTree v3.0 将核心代码按照功能进行了分割,不需要的代码可以不用加载 ● 采用了延迟加载技术,上万节点轻松加载,即使在 IE6 下也能基本做到秒杀 ● 兼容 IE.FireFox.Chrome.Opera.Safari 等浏览器 ● 支持 JSON 数据 ● 支持静态和 Ajax 异步加载节点数据 ● 支持任意更换皮肤 /

  • 使用jQuery判断Div是否在可视区域的方法 判断div是否可见

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>js</title> <script src="http://code.jquery.com/jquery-

  • jQuery 拖动层(在可视区域范围内)

    复制代码 代码如下: (function($){ $.fn.extend({ mydrag:function(){ var boxX = 0; //元素在页面中的横坐标 var boxY = 0; //元素在页面中的纵坐标 var dMouseX = 0; //按下鼠标时的鼠标所在位置的横坐标 var dMouseY = 0; //按下鼠标时的鼠标所在位置的纵坐标 var mMouseX = 0; //移动鼠标时的鼠标所在位置的横坐标 var mMouseY = 0; //移动鼠标时的鼠标所在位

  • Js操作DOM元素及获取浏览器高宽的简单方法

    在JavaScript中,经常会来获取Document文档元素,是 HTML 文档对象模型的英文缩写,Document Object Model for HTML,是基于浏览器编程,HTML DOM 定义了用于 HTML 的一系列标准的对象,以及访问和处理 HTML 文档的标准方法. 通过 DOM,可以访问所有的 HTML 元素,连同它们所包含的文本和属性.可以对其中的内容进行修改和删除,同时也可以创建新的元素.HTML DOM 独立于平台和编程语言.它可被任何编程语言诸如 Java.JavaS

  • JS利用 clip-path 实现动态区域裁剪功能

    背景 今天逛 CodePen,看到了这样一个非常有意思的效果: CodePen Demo -- Material Design Menu By Bennett Feely 这个效果还是有一些值得探讨学习的点,下面我们一起来看看. 如何实现这样一个类似的效果? 首先,想一想,如果让你去实现上面的效果,你会怎么做呢? 这里我简单罗列一些可能的办法: 阴影 box-shadow 渐变 radial-gradient 缩放 transform: scale() 快速的一个一个过一下. 使用 box-sh

  • 使用js获取伪元素的content实例

    在测试过程中有时候会遇到反爬虫机制,一些元素会使用伪元素,这样在定位元素的时候会定位不到,这时候就要使用js来帮助定位,获取到想要的元素 下面是部分代码 //使用js获取伪元素的content String script = "return window.getComputedStyle(document.querySelector('.myTips'),':after').getPropertyValue('content')"; JavascriptExecutor js = (J

  • js操作table元素实现表格行列新增、删除技巧总结

    本文实例讲述了js操作table元素实现表格行列新增.删除的方法.分享给大家供大家参考,具体如下: /************ TableTool.js ****************************************************************************************************************** **********************************************************

随机推荐