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

移动端不依赖touch事件、可覆盖惯性滚动阶段的文档滚动检测方法咨询

解决方案

你原方案的问题在于仅监听触摸相关事件,惯性滚动阶段触摸事件已经停止触发,自然无法统计这部分滚动距离。直接监听全局scroll事件即可覆盖所有滚动场景,包括手动拖动、惯性滚动、点击锚点跳转等触发的滚动行为。

优化实现要点

  • 不需要依赖touch事件计算滚动方向和距离,scroll事件触发时直接读取当前scrollTop值计算滚动比例即可,逻辑更简洁也更稳定
  • 建议添加节流处理,避免滚动事件高频触发导致的性能问题
  • 推荐使用transform代替修改left属性,性能更好,不会触发页面重排

优化后代码示例

var wave = $('.front-page__mobile-wave');
// 缓存DOM高度和元素宽度,若页面有动态内容更新,需要在内容变化后重新赋值
var docHeight = $(document).height();
var waveWidth = wave.width();
var unitOffset = waveWidth / 100;
// 节流标识,避免高频触发
var ticking = false;

function updateWavePosition() {
  var scrollTop = $(window).scrollTop();
  // 计算滚动比例,限制在0-100范围内避免偏移超出预期
  var scrollPercent = Math.min(100, Math.max(0, scrollTop / docHeight * 100));
  var offsetX = - unitOffset * scrollPercent;
  // 用transform实现位移,开启GPU加速提升性能
  wave.css('transform', 'translateX(' + offsetX + 'px)');
  ticking = false;
}

$(window).on('scroll', function() {
  if (!ticking) {
    window.requestAnimationFrame(updateWavePosition);
    ticking = true;
  }
});

// 监听页面尺寸变化,重新计算宽高适配不同场景
$(window).on('resize', function() {
  docHeight = $(document).height();
  waveWidth = wave.width();
  unitOffset = waveWidth / 100;
  updateWavePosition();
});

补充说明

如果业务逻辑确实需要保留触摸滑动方向的判断,可以同时监听touch事件记录方向,滚动事件里仍然读取实时scrollTop计算偏移,两者配合即可覆盖所有滚动场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:45:07