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

如何获取可滚动div的当前滚动位置?图片懒加载适配div场景求助

适配嵌套div的图片懒加载方案

没问题,我帮你把原本基于浏览器窗口的懒加载逻辑,调整为适配嵌套滚动div的版本!核心就是把监听对象从window换成你的画廊容器div,同时重新计算元素是否处于容器的可视区域内。

步骤1:标记你的画廊容器

首先给嵌套的滚动div加一个唯一的选择器(比如类名gallery-container),方便获取元素:

<div class="gallery-container">
  <!-- 你的图片列表 -->
  <img class="progressive replace" data-src="xxx.jpg" src="placeholder.jpg">
  ...
</div>

步骤2:修改滚动监听与可视区域判断逻辑

把你现有的代码调整成下面这样,我会标注关键改动点:

// 获取画廊容器
const galleryContainer = document.querySelector('.gallery-container');
// 获取所有需要懒加载的图片
const pItems = document.getElementsByClassName('progressive replace');

// 懒加载判断函数
function checkLazyLoad() {
  // 获取容器的视口边界信息
  const containerRect = galleryContainer.getBoundingClientRect();
  const containerViewTop = containerRect.top;
  const containerViewBottom = containerRect.bottom;
  // 可选:提前加载的偏移量(比如提前100px加载)
  const preloadOffset = 100;

  for (let i = 0; i < pItems.length; i++) {
    const item = pItems[i];
    const itemRect = item.getBoundingClientRect();
    
    // 判断图片是否进入容器的可视区域(含提前加载偏移)
    const isInView = (
      itemRect.top - preloadOffset < containerViewBottom &&
      itemRect.bottom + preloadOffset > containerViewTop &&
      !item.classList.contains('loaded') // 避免重复加载
    );

    if (isInView) {
      // 替换真实图片地址
      item.src = item.dataset.src;
      item.classList.add('loaded');
    }
  }
}

// 监听容器的滚动事件
galleryContainer.addEventListener('scroll', checkLazyLoad);
// 页面加载时先执行一次,加载初始可见的图片
window.addEventListener('load', checkLazyLoad);
// 可选:监听容器大小变化,避免窗口 resize 后可视区域判断出错
window.addEventListener('resize', checkLazyLoad);

关键改动说明

  • 监听对象替换:从监听window的scroll事件,改成监听目标容器的scroll事件,这样只有容器滚动时才触发判断。
  • 可视区域计算:不再用window.innerHeight和window.scrollY,而是通过getBoundingClientRect()获取容器和图片相对于浏览器视口的位置,进而判断图片是否处于容器的可见范围内。
  • 避免重复加载:给已加载的图片添加loaded类,跳过后续判断,提升性能。

额外优化建议

如果图片数量很多,可以用IntersectionObserver API来实现懒加载,代码更简洁且性能更好,同样支持嵌套容器的场景:

const galleryContainer = document.querySelector('.gallery-container');
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      img.classList.add('loaded');
      observer.unobserve(img);
    }
  });
}, {
  root: galleryContainer, // 指定监听的根容器
  rootMargin: '100px' // 提前加载的偏移量
});

// 给所有图片添加监听
document.querySelectorAll('.progressive.replace').forEach(img => {
  observer.observe(img);
});

这个API是浏览器原生支持的,不需要手动处理滚动事件和位置计算,推荐使用!

内容的提问来源于stack exchange,提问作者J.Swinkels

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:34:22