javascript - Firefox、触摸事件和“平滑”滚动行为——导致不滚动
问题描述
我不知道这里发生了什么。
请参考 CodePen:https ://codepen.io/ilmiont/pen/jJjgPw?editors=1111
使用“平滑”滚动行为,使用触摸屏滑动应该平滑地上下切换屏幕。
这确实与 Chrome 的预期完全一样。
Firefox ...只是不滚动。然而,触摸事件被触发,并且“下一个”/“上一个”被记录到控制台。但是scrollIntoView(...)
当使用 调用时,调用什么也不做{behavior: "smooth"}
。
如果您单击该按钮,滚动行为将更改为auto
(无平滑滚动)......这在 Firefox 中没有任何问题。
我错过了什么?为什么在使用滚动行为时 Firefox 根本不滚动smooth
,即使似乎正确检测到滑动?
更奇怪的是:该演示在 CodePen 中的 Chrome 中也不起作用。将 HTML/CSS/JS 复制到一个新文档中(右键单击 CodePen 查看器,“查看框架源”)并直接在浏览器中运行,它完全按照预期工作,在页面内平滑滚动。
我想我一定错过了什么,Chrome 中的 CodePen 问题很有趣,但我现在看不到什么。
Chrome ......正常工作......除了在 CodePen 中。
Firefox ......一切看起来应该可以工作,但滚动永远不会发生。
解决方案
我花了很长时间才弄清楚,但这是最终可行的解决方案:
使用被动事件监听器!
在原来的笔中,我正在做然后{passive: false}
调用preventDefault(...)
和事件。touchstart
touchmove
事实证明,这不是达到预期效果所必需的。
使用被动侦听器会导致一切在 Firefox 中按预期工作。
我仍然认为最初的行为很奇怪;进一步调查显示 Firefox 似乎存在时间问题。在该swipe(...)
方法中,向调用添加 250 毫秒超时会dispatchEvent(...)
导致一切都按预期工作 - 似乎触摸处理程序可以继续阻止/限制滚动事件超过应该被删除的时间。
将继续调查,但我现在有一个解决方案。
(编辑——忘了提,当使用被动监听器时,也设置touch-action: none
在目标上。)
推荐阅读
- javascript - 如何在 testcafe 中执行 X 次按键?
- r - 我无法使用 ggplot2 重现小提琴情节
- angular - Angular Component调用调用服务的Service:两者都需要对结果做一些事情
- android - 如何在 chaquopy python 中使用路径名?
- java - 如何覆盖环境条目?
- kotlin - 如何使用 Kotlin 在 for 循环中创建变量
- html - 单击 Font Awesome 图标时播放声音
- angular - 打字稿:这个函数的主体在哪里定义,泛型真的被使用了吗?
- c++ - 尽管使用了 -I 标志,但没有这样的文件或目录
- python - 如何在 seaborn 联合图中显示边缘直方图的垂直比例?