javascript - Firefox、触摸事件和 "smooth"滚动行为——导致不滚动

标签 javascript css firefox scroll touch-event

我不知道这里发生了什么。

请引用CodePen:https://codepen.io/ilmiont/pen/jJjgPw?editors=1111

使用“平滑”滚动行为,使用触摸屏滑动应该可以平滑地上下切换屏幕。

这确实与 Chrome 的预期完全一致。

Firefox...只是不滚动。然而触摸事件正在被触发,并且“Next”/“Previous”被记录到控制台。但是 scrollIntoView(...) 调用在使用 {behavior: "smooth"} 调用时什么都不做。

如果您单击该按钮,滚动行为将更改为自动(无平滑滚动)...这在 Firefox 中没有任何问题。

我错过了什么?为什么在使用 smooth 滚动行为时 Firefox 根本不滚动,即使似乎正确检测到了滑动?

更奇怪的是:该演示在 CodePen 中的 Chrome 中也不起作用。将 HTML/CSS/JS 复制到一个新文档中(右键单击 CodePen 查看器,“查看框架源”)并直接在浏览器中运行,它完全按预期工作,页面内滚动流畅。

我想我一定错过了什么,Chrome 中的 CodePen 问题很有趣,但我现在看不到什么。

Chrome... 正常工作... 除了在 CodePen 中。

Firefox...一切看起来都应该有效,但从未发生滚动。

最佳答案

我花了太长时间才弄清楚,但这是最终有效的解决方案:

使用被动事件监听器!

在原来的笔中,我正在执行 {passive: false} 然后在 touchstart 上调用 preventDefault(...) 并且touchmove 事件。

事实证明,这并不是达到预期效果所必需的。

使用被动监听器会导致 Firefox 中的一切都按预期工作。

我仍然认为原始行为很奇怪;进一步调查显示 Firefox 似乎存在时间问题。在 swipe(...) 方法中,向 dispatchEvent(...) 调用添加 250 毫秒的超时会导致一切都按预期工作——看起来好像触摸处理程序可以继续阻止/限制滚动事件过去应该被删除的时间。

将继续调查,但我现在有一个解决方案。

(编辑——忘了说,当使用被动监听器时,还要在目标上设置touch-action: none。)

关于javascript - Firefox、触摸事件和 "smooth"滚动行为——导致不滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55403034/

相关文章:

javascript - 在 html 页面上嵌入 Web-GL 沙箱的效果

javascript - 如何改变每隔一个字母的字体颜色?

Javascript:不修改 slider 函数中的全局变量

html - NVDA 在 Firefox 上从父级聚焦时不会读取第一个 HTML 子级

javascript - Cypress :只运行一项测试

javascript - jQuery 选择所有 id 以开头的表

css - 如何将段落放在 HTML 列中?

javascript - Jquery 和 Bootstrap.js - DIV 会显示但不会隐藏

ssl - 为什么 Firefox 不信任我的自签名证书?

firefox - 主干导航在 Firefox 中触发两次