我不知道这里发生了什么。
请引用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/