有没有一种有效的方法来判断DOM元素(在HTML文档中)当前是否可见(出现在viewport中)?

(问题涉及Firefox.)

推荐答案

Update: Time marches on and so have our browsers. This technique is no longer recommended and you should use Dan's solution if you do not need to support version of Internet Explorer before 7.

Original solution (now outdated):

这将判断元素在当前视口中是否完全可见:

function elementInViewport(el) {
  var top = el.offsetTop;
  var left = el.offsetLeft;
  var width = el.offsetWidth;
  var height = el.offsetHeight;

  while(el.offsetParent) {
    el = el.offsetParent;
    top += el.offsetTop;
    left += el.offsetLeft;
  }

  return (
    top >= window.pageYOffset &&
    left >= window.pageXOffset &&
    (top + height) <= (window.pageYOffset + window.innerHeight) &&
    (left + width) <= (window.pageXOffset + window.innerWidth)
  );
}

您可以简单地对此进行修改,以确定该元素的任何部分在视口中是否可见:

function elementInViewport2(el) {
  var top = el.offsetTop;
  var left = el.offsetLeft;
  var width = el.offsetWidth;
  var height = el.offsetHeight;

  while(el.offsetParent) {
    el = el.offsetParent;
    top += el.offsetTop;
    left += el.offsetLeft;
  }

  return (
    top < (window.pageYOffset + window.innerHeight) &&
    left < (window.pageXOffset + window.innerWidth) &&
    (top + height) > window.pageYOffset &&
    (left + width) > window.pageXOffset
  );
}

Javascript相关问答推荐

通过JavaScript将CSS与音频大声噪音同步

Flutter:显示PDF和视频,但阻止下载

为什么在react js中没有调用加载器函数?

我不明白这个react 组件有什么问题

reaction如何在不使用符号的情况下允许多行返回?

当在select中 Select 选项时,我必须禁用不匹配的 Select

提交表格后保留Web表格中的收件箱值?

在vercel throws上部署带有gunjs的sveltekit应用无法找到模块./' lib/文本编码'

嵌套异步JavaScript(微任务和macrotask队列)

为什么当我解析一个promise时,输出处于挂起状态?

使用GraphQL查询Uniswap的ETH价格

JQuery Click事件不适用于动态创建的按钮

如何在箭头函数中引入or子句?

使用auth.js保护API路由的Next.JS,FETCH()不起作用

使用NextJS+MongoDB+Prisma ORM获取无效请求正文,无法发布错误

如何在JAVASCRIPT中临时删除eventListener?

在VS代码上一次设置多个变量格式

为什么延迟在我的laravel项目中不起作用?

更改agGRID/Reaction中的单元格格式

使用CEPRESS截取时,cy.Wait()在等待5000ms的第一个路由请求时超时