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

如何实现滚动至#wrapper进入视口时才触发的图片序列滚动动画

解决方法

核心调整逻辑:

  • 新增#wrapper元素是否进入视口的判断规则
  • 序列帧索引计算基准从「全局页面滚动高度」改为「#wrapper进入视口后的滚动进度」
  • 增加边界判定,未进入视口时固定显示第一帧,完全离开视口后固定显示最后一帧

你可以直接替换原有JS代码为下方版本:

var images = [];
// 保留原有预加载逻辑
for (i = 1; i <= $('#load').attr('data-images'); i++) {
  images.push('https://twdp.de/sequence/' + i + '.jpg');
}
$(images).each(function() {
  $('<img class="sequenzbilder" />')[0].src = this;
});

var totalImages = images.length;
var $wrapper = $('#wrapper');
var $viewport = $(window);

// 计算#wrapper位置和动画触发的滚动区间
function calcWrapperPos() {
  var wrapperTop = $wrapper.offset().top;
  var wrapperHeight = $wrapper.outerHeight();
  var viewportHeight = $viewport.height();
  // 动画起始点:#wrapper顶部进入视口底部的滚动位置
  var animStart = wrapperTop - viewportHeight;
  // 动画结束点:#wrapper底部离开视口顶部的滚动位置
  var animEnd = wrapperTop + wrapperHeight;
  // 动画总滚动距离、每帧对应的滚动步长
  return {
    start: animStart,
    end: animEnd,
    step: (animEnd - animStart) / totalImages
  }
}

// 初始化位置参数,窗口尺寸变化时自动重新计算适配
var animParams = calcWrapperPos();
$viewport.on('resize', function() {
  animParams = calcWrapperPos();
})

// 滚动监听逻辑调整
$viewport.on('scroll', function() {
  var currentScroll = $(this).scrollTop();
  var currentImgIndex;
  if (currentScroll < animParams.start) {
    // 未进入动画区域,显示第一张图
    currentImgIndex = 0;
  } else if (currentScroll > animParams.end) {
    // 超出动画区域,显示最后一张图
    currentImgIndex = totalImages - 1;
  } else {
    // 在动画区域内按滚动进度计算当前帧
    currentImgIndex = Math.floor((currentScroll - animParams.start) / animParams.step);
  }
  $('.sequenzbilder').attr('src', images[currentImgIndex]);
});

调整说明:

  • 动画触发完全和#wrapper的位置绑定,和页面其他内容长度无关,不会出现元素还没进入视口动画就播放完毕的问题
  • 新增窗口resize适配,缩放窗口、旋转移动设备屏幕时动画逻辑依然生效
  • 边界处理避免索引越界报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:36:04