You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在滚动位置查找类元素?判断滚动窗口中可见/不可见div

解决方案:定位滚动位置元素与判断可见性

完全可以实现你的需求,以下是原生JavaScript和jQuery的具体实现方案:

一、获取指定滚动位置处的元素

不管是原生JS还是jQuery,都可以借助浏览器原生API来实现类似"atScrollPosition"的定位效果:

原生JavaScript实现

使用document.elementFromPoint(x, y)可以直接获取页面指定坐标点最顶层的元素,结合滚动偏移计算目标位置:

// 示例:获取垂直滚动位置X处的元素(水平取视口中间)
const targetScrollY = X; // 替换为你的目标滚动Y值
const viewportMidX = window.scrollX + window.innerWidth / 2;
const targetElement = document.elementFromPoint(viewportMidX, targetScrollY);

// 若需筛选特定类的div,可进一步判断
const targetClassDiv = targetElement?.matches('div.class') 
  ? targetElement 
  : targetElement?.closest('div.class');

如果要获取该位置所有堆叠的元素,改用document.elementsFromPoint(x, y)再筛选即可。

jQuery实现

jQuery没有原生的位置选择器,但可以封装原生方法实现:

function getDivAtScrollY(targetY) {
  const midX = $(window).scrollLeft() + $(window).width() / 2;
  const nativeEl = document.elementFromPoint(midX, targetY);
  return $(nativeEl).is('div.class') ? $(nativeEl) : $(nativeEl).closest('div.class');
}

// 使用示例
const $targetDiv = getDivAtScrollY(X); // X为目标滚动Y值

二、找出滚动窗口中不可见的div和第一个可见的div

原生JavaScript基础方案

遍历目标div集合,通过getBoundingClientRect()判断元素与视口的位置关系:

const allClassDivs = document.querySelectorAll('div.class');
const invisibleDivs = [];
const visibleDivs = [];

allClassDivs.forEach(div => {
  const rect = div.getBoundingClientRect();
  // 判断完全不可见:元素底部在视口上方 或 顶部在视口下方
  const isTotallyInvisible = rect.bottom < 0 || rect.top > window.innerHeight;
  // 判断至少部分可见
  const isVisible = rect.top < window.innerHeight && rect.bottom > 0;

  if (isTotallyInvisible) invisibleDivs.push(div);
  if (isVisible) visibleDivs.push(div);
});

const firstVisibleDiv = visibleDivs[0];
console.log('不可见的div:', invisibleDivs);
console.log('第一个可见的div:', firstVisibleDiv);

jQuery基础方案

用jQuery遍历结合原生位置判断:

const $allDivs = $('div.class');
const $invisibleDivs = $();
const $visibleDivs = $();

$allDivs.each(function() {
  const $div = $(this);
  const rect = $div[0].getBoundingClientRect();
  const isTotallyInvisible = rect.bottom < 0 || rect.top > $(window).height();
  const isVisible = rect.top < $(window).height() && rect.bottom > 0;

  if (isTotallyInvisible) $invisibleDivs.add($div);
  if (isVisible) $visibleDivs.add($div);
});

const $firstVisible = $visibleDivs.first();
console.log('不可见的div:', $invisibleDivs);
console.log('第一个可见的div:', $firstVisible);

高性能优化方案:Intersection Observer API

如果需要实时监听滚动时的可见性变化,推荐使用Intersection Observer,它比遍历判断性能更优,适合大量元素的场景:

// 初始化观察者
const visibilityObserver = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      // 元素变为可见,记录第一个可见元素
      if (!window.firstVisibleDiv) {
        window.firstVisibleDiv = entry.target;
      }
      console.log('变为可见:', entry.target);
    } else {
      console.log('变为不可见:', entry.target);
    }
  });
}, { root: window });

// 监听所有目标div
document.querySelectorAll('div.class').forEach(div => {
  visibilityObserver.observe(div);
});

内容的提问来源于stack exchange,提问作者Antony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 06:33:16