Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
解决移动端scrollTop获取异常:基于触摸事件的滚动检测方案_创想鸟

解决移动端scrollTop获取异常:基于触摸事件的滚动检测方案

解决移动端scrollTop获取异常:基于触摸事件的滚动检测方案

本教程旨在解决移动设备上标准scrollTop、pageYOffset等方法无法准确获取页面滚动位置的问题,这些方法在移动端常返回零或极低值。文章将提供一个基于touchstart和touchmove事件的JavaScript工作方案,用于检测用户在触屏设备上是否进行了滚动操作,以弥补标准滚动事件检测的不足,并触发自定义的恢复逻辑。

移动端滚动位置获取的挑战

在web开发中,获取页面滚动位置是常见的需求,例如实现滚动加载、导航栏吸顶或动画效果。通常,我们会使用$(window).scrolltop()、window.pageyoffset、document.documentelement.scrolltop等javascript或jquery方法来获取当前滚动距离。这些方法在桌面浏览器环境中表现良好,但在某些移动设备(特别是android上的chrome、samsung浏览器、firefox等)上,开发者可能会遇到一个令人困惑的问题:即使页面已经明显滚动,这些方法却始终返回零或一个极低的值,与实际滚动距离严重不符。

这种现象的根本原因可能与移动浏览器对页面滚动容器的渲染方式、body/html元素的样式(如height: 100%)或特定的CSS属性(如overflow: hidden)有关。尽管有时移除height: 100%可以解决问题,但并非总是有效,这使得在移动端准确获取滚动位置成为一个棘手的挑战。

标准滚动检测方法的局限性

为了说明这个问题,考虑以下尝试获取各种滚动位置的代码片段:

$(document).ready(function() {    $(window).on('scroll touchstart', function() {        console.log(            "$('body').scrollTop=" + $('body').scrollTop() +            ", $('html').scrollTop=" + $('html').scrollTop() +            ", window.scrollTop= " + $(window).scrollTop() +            ", document.documentElement.scrollTop= " + document.documentElement.scrollTop +            ", window.pageYOffset= " + window.pageYOffset +            ", window.scrollY= " + window.scrollY +            ", document.body.scrollTop= " + document.body.scrollTop +            ", document.scrollingElement.scrollTop=" + document.scrollingElement.scrollTop        );    });});

这段代码在桌面浏览器上运行时,会随着页面滚动输出准确的数值。然而,在受影响的移动浏览器上,无论用户向下滚动多远,控制台输出的这些值可能一直保持为零,或者在滚动到页面底部时才返回一个远低于实际滚动距离的微小值。这表明标准的滚动事件监听和属性查询机制在这些特定环境下未能正常工作。

基于触摸事件的滚动检测工作方案

鉴于标准滚动检测的不可靠性,我们可以采用一种替代方案:通过监听触摸事件来间接判断用户是否进行了滚动操作。虽然这种方法无法精确获取滚动位置,但可以有效检测到“用户尝试滚动但scrollTop未更新”的情况,从而触发相应的恢复或修正逻辑。

核心思路:当用户在触屏设备上滑动手指时,我们可以记录touchstart事件的初始Y坐标,然后在touchmove事件中计算当前Y坐标与初始Y坐标的垂直位移。如果垂直位移超过某个阈值(表示用户进行了明显的滑动操作),并且此时$(window).scrollTop()仍然为零(表示标准滚动检测失败),那么我们可以认为发生了“未被捕获的滚动”,并执行预定义的恢复操作。

实现步骤:

记录初始触摸位置: 在touchstart事件中,保存第一次触摸的屏幕Y坐标。计算触摸位移: 在touchmove事件中,计算当前触摸点的屏幕Y坐标与初始Y坐标的差值,得到垂直位移。判断滚动发生与检测失败: 如果垂直位移超过预设阈值(例如30像素),并且$(window).scrollTop()仍为零,则触发自定义的恢复函数。

示例代码:

$(document).ready(function() {    var initialY = null; // 用于存储touchstart时的Y坐标    // 监听touchstart事件,记录初始触摸位置    $(window).on('touchstart', function(event) {        // 确保event.touches存在且有第一个触摸点        if (event.touches && event.touches.length > 0) {            initialY = event.touches[0].screenY;        }    });    // 监听touchmove事件,计算位移并判断滚动    $(window).on('touchmove', function(event) {        // 如果没有初始Y坐标,则不进行处理        if (initialY === null) return;        // 确保event.touches存在且有第一个触摸点        if (event.touches && event.touches.length > 0) {            var currentY = event.touches[0].screenY;            var distanceY = initialY - currentY; // 计算垂直位移,正值表示向上滑动(页面向下滚动)            // 判断是否发生了明显的向下滚动(distanceY > 30)            // 并且此时$(window).scrollTop()仍然为零,表明标准滚动检测失败            if (distanceY > 30 && !$(window).scrollTop()) {                recoverFromFailedScrollDetection(); // 调用恢复函数                initialY = null; // 重置initialY,避免重复触发            }            // 如果是向上滑动,或滑动距离不足,或scrollTop已非零,则不触发        }    });    // 示例恢复函数,根据实际需求实现    function recoverFromFailedScrollDetection() {        console.log("检测到移动端滚动,但scrollTop未更新!执行恢复逻辑...");        // 例如:        // 隐藏/显示某个元素        // 重新初始化某些依赖滚动位置的组件        // 触发一个自定义事件    }});

注意事项与应用场景

这是一种检测而非精确获取方案: 上述方案只能判断用户“是否进行了滚动操作”以及“标准滚动检测是否失败”,它无法提供精确的滚动距离。因此,它适用于那些只需要知道“页面是否被滚动过”的场景,而不是需要具体滚动位置数值的场景。recoverFromFailedScrollDetection()的实现: 这个函数的具体内容取决于您的应用需求。例如,如果您的导航栏在滚动后需要改变样式或位置,但scrollTop为零导致其不触发,那么recoverFromFailedScrollDetection()可以手动触发这些样式的更改。阈值调整: 代码中的distanceY > 30是一个经验值,表示用户进行了超过30像素的垂直滑动。您可以根据用户体验和设备灵敏度调整这个阈值。性能考虑: touchmove事件触发频繁,确保recoverFromFailedScrollDetection()中的逻辑轻量高效,避免在短时间内执行大量复杂计算。局限性: 这种方法无法区分用户是缓慢滑动还是快速轻拂,也无法追踪滚动停止后的惯性滚动。它仅在用户主动触摸滑动时有效。

总结

在移动端Web开发中,面对scrollTop等滚动位置获取方法在特定浏览器上失效的问题,基于touchstart和touchmove事件的触摸检测方案提供了一个有效的补充。虽然它不能提供精确的滚动距离,但能够可靠地检测用户是否进行了滚动操作,并在标准滚动检测失败时触发自定义的恢复逻辑。通过结合这种工作方案,开发者可以更好地处理移动端滚动行为,提升用户体验,确保页面功能在各种设备上都能正常运行。在实际开发中,建议优先排查CSS和DOM结构问题,若问题依然存在,再考虑采用此类触摸事件监听的替代方案。

以上就是解决移动端scrollTop获取异常:基于触摸事件的滚动检测方案的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1519925.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
React应用中图片加载与路径管理:公共目录的最佳实践
上一篇 2025年12月20日 12:51:26
JavaScript数组长度获取:告别’array not defined’错误
下一篇 2025年12月20日 12:51:39

相关推荐

  • 谷歌浏览器打开网页提示内存不足怎么办

    谷歌浏览器打开网页提示内存不足怎么办谷歌浏览器打开网页提示内存不足怎么办谷歌浏览器打开网页提示内存不足怎么办谷歌浏览器打开网页提示内存不足怎么办

    当您在使用谷歌浏览器打开资源密集型网页或开启过多标签页时,如果遇到“内存不足”的错误提示,这通常意味着浏览器可用的内存资源(RAM)已被耗尽。本文将为您提供一套系统的解决方案,通过管理标签页与扩展、开启内置的性能优化功能以及调整相关设置,来有效解决此问题,让您能够顺畅地浏览网页。 管理标签页与扩展程…

    2026年9月25日 • 用户投稿
    100
  • Win10电脑加快缩略图加载速度的操作方法?

    Win10电脑加快缩略图加载速度的操作方法?Win10电脑加快缩略图加载速度的操作方法?Win10电脑加快缩略图加载速度的操作方法?Win10电脑加快缩略图加载速度的操作方法?

    若您的电脑配置较低,并且已经使用了较长时间,可能会发现打开资源管理器时速度较慢,绿色进度条前进得十分迟缓。此时,您可以尝试这一方法,在组策略中对其进行设置,关闭缩略图缓存功能。 Win10系统优化缩略图加载: 使用组策略 第一步:通过在“开始”菜单输入编辑组策略或者gpedit.msc来打开组策略。…

    2026年9月25日 • 用户投稿
    000
  • Java布尔方法条件逻辑解析与预期行为校正

    Java布尔方法条件逻辑解析与预期行为校正Java布尔方法条件逻辑解析与预期行为校正Java布尔方法条件逻辑解析与预期行为校正Java布尔方法条件逻辑解析与预期行为校正

    本文旨在探讨Java中布尔方法条件表达式的常见误解,通过一个具体的kindaLiked()方法案例,详细分析代码逻辑与预期行为不符的原因。我们将演示如何精确定义条件,确保方法返回结果与业务逻辑一致,并提供示例代码、调试技巧及最佳实践,以帮助开发者编写更准确、可维护的布尔判断逻辑。 理解布尔方法与条件…

    2026年9月25日 • 用户投稿
    100
  • sublime怎么快速查看函数或类列表_sublime结构导航与符号浏览技巧

    sublime怎么快速查看函数或类列表_sublime结构导航与符号浏览技巧sublime怎么快速查看函数或类列表_sublime结构导航与符号浏览技巧sublime怎么快速查看函数或类列表_sublime结构导航与符号浏览技巧sublime怎么快速查看函数或类列表_sublime结构导航与符号浏览技巧

    使用Ctrl+R或Cmd+R打开“前往符号”面板,可快速定位函数和类;通过安装SideBarEnhancements等插件,在侧边栏查看文件符号树;配合LSP插件支持,使用F12实现“转到定义”跨文件跳转;自定义快捷键如Ctrl+Shift+R优化操作效率。 在使用 Sublime Text 编辑代…

    2026年9月25日 • 用户投稿
    300
  • windows怎么查看wifi信号强度_windows系统查看wifi信号强度的方法

    首先检查Wi-Fi信号强度以判断网络问题,可通过任务栏图标查看图形化信号格数及百分比;其次使用命令提示符输入netsh wlan show interfaces获取信号强度百分比和SSID等详细信息;最后可借助Acrylic Wi-Fi Home等第三方工具扫描周边网络的RSSI值与信道占用情况,分…

    2026年9月25日
    000
  • 关闭Win10这三大新功能:系统重回Win7风

    关闭Win10这三大新功能:系统重回Win7风关闭Win10这三大新功能:系统重回Win7风关闭Win10这三大新功能:系统重回Win7风关闭Win10这三大新功能:系统重回Win7风

    发布超过3年,win10依然未能全面取代win7,反而因各类问题频繁遭到批评。 Softpedia发表文章,指出Win10目前的三项核心功能——Cortana(小娜)、Aciton Centre(操作中心)以及Timeline(时间线),其关闭方式过于繁琐且隐蔽,建议微软提供更加便捷的一键屏蔽选项。…

    2026年9月25日 • 用户投稿
    000
  • 电脑机箱风道设计对散热效率的影响有多大?

    电脑机箱风道设计对散热效率的影响有多大?电脑机箱风道设计对散热效率的影响有多大?电脑机箱风道设计对散热效率的影响有多大?电脑机箱风道设计对散热效率的影响有多大?

    合理的机箱风道设计能有效降低温度,提升硬件稳定性。判断风道是否合理可通过监控软件查看CPU、GPU温度(如满载超80℃或85℃),观察灰尘堆积情况及手触感知风量分布。理想风道为前进风、后排风的水平气流,塔式散热器应朝向后排风扇,高端显卡可加底面进风。理线也关键,杂乱线材会阻碍气流,需用扎带等整理。风…

    2026年9月25日 • 用户投稿
    000
  • 利用OSHI库监测与计算磁盘活动时间及传输速率

    利用OSHI库监测与计算磁盘活动时间及传输速率利用OSHI库监测与计算磁盘活动时间及传输速率利用OSHI库监测与计算磁盘活动时间及传输速率利用OSHI库监测与计算磁盘活动时间及传输速率

    本文详细介绍了如何利用Java OSHI库获取磁盘的活动时间与传输速率。通过HWDiskStore类的getReads()、getWrites()和getTransferTime()方法,结合时间间隔内的增量数据,可以精确计算出磁盘的活跃百分比和每秒传输次数。教程提供了示例代码,并逐步解析了数据采集…

    2026年9月25日 • 用户投稿
    000
  • 如何用豆包AI自动生成单元测试 提升代码质量的AI秘诀

    如何用豆包AI自动生成单元测试 提升代码质量的AI秘诀如何用豆包AI自动生成单元测试 提升代码质量的AI秘诀如何用豆包AI自动生成单元测试 提升代码质量的AI秘诀如何用豆包AI自动生成单元测试 提升代码质量的AI秘诀

    使用豆包ai可以高效生成全面的单元测试代码,首先确保函数或类逻辑清晰稳定,如定义了clean_input函数用于清理用户输入字符串;接着提示ai生成测试用例时描述功能背景,ai将自动覆盖正常值、空值、边界值及异常输入等场景;生成的测试样例包括空字符串、none、前后空格、大写字母、数字符号等情况;随…

    2026年9月25日 • 用户投稿
    100
  • 为什么高配置电脑仍会出现软件卡顿现象?

    为什么高配置电脑仍会出现软件卡顿现象?为什么高配置电脑仍会出现软件卡顿现象?为什么高配置电脑仍会出现软件卡顿现象?为什么高配置电脑仍会出现软件卡顿现象?

    高配置电脑卡顿多由软件、驱动、系统配置及使用习惯导致。需通过任务管理器、资源监视器等工具排查CPU、内存、磁盘占用,检查温度与驱动状态;优化电源模式、关闭无用后台程序、更新或回滚显卡驱动,并合理设置虚拟内存,才能全面提升系统流畅度。 高配置电脑出现软件卡顿现象,这其实是个挺常见,也常常让人感到困惑的…

    2026年9月25日 • 用户投稿
    100
  • 夸克怎么更新到最新版本_夸克App版本检查与升级方法

    夸克怎么更新到最新版本_夸克App版本检查与升级方法夸克怎么更新到最新版本_夸克App版本检查与升级方法夸克怎么更新到最新版本_夸克App版本检查与升级方法夸克怎么更新到最新版本_夸克App版本检查与升级方法

    首先检查应用商店是否有更新,其次在夸克App内“我的-设置-关于夸克”中查看版本并更新,最后可通过官网下载最新安装包手动升级。 如果您尝试在设备上使用夸克App,但发现某些功能无法正常使用或界面显示异常,可能是由于当前版本过旧导致与服务器不兼容。以下是检查并升级夸克App至最新版本的操作步骤: 本文…

    2026年9月25日 • 用户投稿
    200
  • sublime怎么恢复上次打开的文件_sublime自动恢复文件会话设置方法

    sublime怎么恢复上次打开的文件_sublime自动恢复文件会话设置方法sublime怎么恢复上次打开的文件_sublime自动恢复文件会话设置方法sublime怎么恢复上次打开的文件_sublime自动恢复文件会话设置方法sublime怎么恢复上次打开的文件_sublime自动恢复文件会话设置方法

    Sublime Text 能自动恢复文件和布局,需确保设置中”remember_open_files”: true且”hot_exit”: false,正常关闭程序以保存会话,会话文件位于系统指定路径,若丢失可手动重命名备份文件恢复。 Sublime …

    2026年9月25日 • 用户投稿
    200
  • 使用OSHI库精确测量磁盘活动时间和传输速率

    使用OSHI库精确测量磁盘活动时间和传输速率使用OSHI库精确测量磁盘活动时间和传输速率使用OSHI库精确测量磁盘活动时间和传输速率使用OSHI库精确测量磁盘活动时间和传输速率

    本文详细介绍了如何利用OSHI库的HWDiskStore类来精确测量磁盘活动时间百分比和数据传输速率。通过获取磁盘读写操作、总传输时间等累积性统计数据的快照,并计算两次快照之间的差值,可以准确分析特定时间段内的磁盘活跃度及每秒传输次数,从而有效监控系统磁盘性能。 OSHI库与磁盘性能监控 oshi(…

    2026年9月25日 • 用户投稿
    100
  • Chrome浏览器怎么查看某个插件的资源占用_插件资源占用情况监控技巧

    Chrome浏览器怎么查看某个插件的资源占用_插件资源占用情况监控技巧Chrome浏览器怎么查看某个插件的资源占用_插件资源占用情况监控技巧Chrome浏览器怎么查看某个插件的资源占用_插件资源占用情况监控技巧Chrome浏览器怎么查看某个插件的资源占用_插件资源占用情况监控技巧

    首先使用Shift+Esc打开Chrome任务管理器,查看各扩展程序的CPU和内存占用情况,识别高耗能插件;接着通过chrome://extensions页面禁用或删除异常扩展;最后可启用chrome://flags中的悬停显示内存功能,便于实时监控标签页资源消耗。 如果您发现Chrome浏览器运行…

    2026年9月25日 • 用户投稿
    200
  • VBA使用API_04:创建按钮

    VBA使用API_04:创建按钮VBA使用API_04:创建按钮VBA使用API_04:创建按钮VBA使用API_04:创建按钮

    在创建了窗体的基础上,接下来我们将进一步添加一个按钮来增强程序的交互性。按钮是windows系统中预定义的控件,因此无需额外注册,直接使用createwindowex函数即可。在创建窗体之后、显示窗体之前,我们可以插入代码来创建这个按钮。 按钮的父窗口句柄(hWndParent)应当设置为之前创建的…

    2026年9月24日 • 用户投稿
    200
  • DeepSeek R1T2— TNG推出的改进型AI语言模型,基于DeepSeek

    DeepSeek R1T2— TNG推出的改进型AI语言模型,基于DeepSeekDeepSeek R1T2— TNG推出的改进型AI语言模型,基于DeepSeekDeepSeek R1T2— TNG推出的改进型AI语言模型,基于DeepSeekDeepSeek R1T2— TNG推出的改进型AI语言模型,基于DeepSeek

    deepseek r1t2 是 tng 在 deepseek 原始模型基础上开发的增强型语言模型。该模型采用 tri-mind 架构,融合了 deepseek r1-0528、r1 和 v3-0324 三个基础模型的优势,通过 assembly of experts(aoe)技术整合推理能力、结构化…

    2026年9月24日 • 用户投稿
    1000
  • 微软终止Cortana支持:Windows 10迎来重大调整

    微软终止Cortana支持:Windows 10迎来重大调整微软终止Cortana支持:Windows 10迎来重大调整微软终止Cortana支持:Windows 10迎来重大调整微软终止Cortana支持:Windows 10迎来重大调整

    N软网消息,微软近日宣布,将在Windows 10系统中停止对Cortana的支持。这是继Windows 11中取消Cortana支持之后的进一步动作,微软正将重心转移到Windows Copilot、Microsoft 365 Copilot以及Bing Chat等新技术上。 曾有人预计,微软会在…

    2026年9月24日 • 用户投稿
    100
  • 如何在Java中使用Collections.shuffle打乱列表

    使用Collections.shuffle()可随机打乱列表元素,但列表必须为可变类型。Arrays.asList()返回固定列表,直接使用会抛出UnsupportedOperationException;正确做法是将其复制到ArrayList等可修改列表中再调用shuffle。基本用法示例如Lis…

    2026年9月24日
    300
  • 2025年比较好用的生成图片AI工具前十推荐

    2025年比较好用的生成图片AI工具前十推荐2025年比较好用的生成图片AI工具前十推荐2025年比较好用的生成图片AI工具前十推荐2025年比较好用的生成图片AI工具前十推荐

    2025年AI图片生成工具将更加智能、精准且深度融入创作流程,具备超写实生成、多模态输入、实时交互和3D建模能力,代表工具包括Midjourney、Stable Diffusion、DALL-E 4、Adobe Firefly Max等,未来将朝个性化、多模态融合与实时协作发展,同时面临版权、伦理、…

    2026年9月24日 • 用户投稿
    100
  • LINUX如何修改文件所有者_Linux更改文件属主与属组命令说明

    修改文件属主和属组可通过chown与chgrp命令实现,chown用于更改所有者及所属组,如chown user1:group1 file.txt,支持-R递归操作;chgrp仅修改属组,如chgrp developers file.txt。实际应用中常用于Web服务器权限配置,如chown -R …

    2026年9月24日
    100

发表回复

登录后才能评论
关注微信