如何使用 JavaScript 判断一个元素是否在可视范围内

前言

本篇文章是作者在准备春招时,JS的学习感悟。假如您也和我一样,在准备春招。欢迎加我微信shunwuyu ,这里有几十位一心去大厂的友友可以相互鼓励,分享信息,模拟面试,共读源码,齐刷算法,手撕面经。来吧,友友们!"

正文

在Web开发中,有时我们需要知道一个元素是否在用户的可视范围内,以便执行相应的操作,比如延迟加载图片、实现懒加载、或是触发动画效果。 本文将详细介绍使用 JavaScript 如何判断一个元素是否在可视范围内的几种方法。

1. 使用 getBoundingClientRect() 方法

JavaScript 中的 getBoundingClientRect() 方法返回一个元素的大小及其相对于视口的位置信息。这个信息包括元素的上下左右边界的坐标,以及它们相对于视口的距离。通过这些信息,我们可以判断元素是否在可视范围内。

下面是一个示例函数,用于检查元素是否在可视范围内:

js 复制代码
function isElementInViewport(el) {
  var rect = el.getBoundingClientRect();
  return (
    rect.top >= 0 &&
    rect.left >= 0 &&
    rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
    rect.right <= (window.innerWidth || document.documentElement.clientWidth)
  );
}

2. 使用 Intersection Observer API

Intersection Observer API 用于异步监测元素与其祖先元素或根元素(viewport)的交叉状态。使用这个 API,我们可以注册一个观察器,当目标元素进入或离开视口时,会触发相应的回调函数。

以下是一个简单的示例,演示如何使用 Intersection Observer API:

js 复制代码
var observer = new IntersectionObserver(function(entries) {
  entries.forEach(function(entry) {
    if (entry.isIntersecting) {
      // 元素进入视口
      console.log("Element is in viewport!");
    } else {
      // 元素离开视口
      console.log("Element is out of viewport!");
    }
  });
});

var target = document.querySelector('#targetElement');
observer.observe(target);

3. offsetTop、scrollTop

offsetTop,元素的上外边框至包含元素的上内边框之间的像素距离,其他offset属性如下图所示:

下面再来了解下clientWidth、clientHeight:

  • clientWidth:元素内容区宽度加上左右内边距宽度,即clientWidth = content + padding
  • clientHeight:元素内容区高度加上上下内边距高度,即clientHeight = content + padding

这里可以看到client元素都不包括外边距

最后,关于scroll系列的属性如下:

  • scrollWidth 和 scrollHeight 主要用于确定元素内容的实际大小
  • scrollLeft 和 scrollTop 属性既可以确定元素当前滚动的状态,也可以设置元素的滚动位置
    • 垂直滚动 scrollTop > 0
    • 水平滚动 scrollLeft > 0
  • 将元素的 scrollLeft 和 scrollTop 设置为 0,可以重置元素的滚动位置

代码实现:

js 复制代码
function isInViewPortOfOne (el) {
    // viewPortHeight 兼容所有浏览器写法
    const viewPortHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight 
    const offsetTop = el.offsetTop
    const scrollTop = document.documentElement.scrollTop
    const top = offsetTop - scrollTop
    return top <= viewPortHeight
}
相关推荐
橙光成长2 小时前
PDF离线工具箱深度解析:4MB纯前端单文件,40+功能全本地运行,文件绝不上传
前端·pdf·1024程序员节
小poop8 小时前
CSS 基础与实战:从入门到精通网页美化
前端
考研保研资料分享9 小时前
中国人民大学英语笔译保研面经:五校考核、视译口译与择校复盘
面试
Csvn10 小时前
运行时性能
前端
Never_every9910 小时前
位图转矢量工具哪个好?实测抠抠图AI位图转矢量工具
大数据·前端
paopaokaka_luck11 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
古希腊掌管代码的神THU11 小时前
为什么DPO中chosen/rejected概率同时下降?
人工智能·深度学习·机器学习·自然语言处理·面试
空中湖11 小时前
用 React 写数据大屏:为什么我不建议用图表库
前端·react.js·前端框架
欣欣之王来了13 小时前
原始HTML插值:v-html指令的使用与安全风险
前端·学习·架构·项目·vue3教程
IT_陈寒13 小时前
Redis的LRU淘汰策略坑了我一整天
前端·人工智能·后端