我有水平滚动面板(通过overflow-x:scroll
),用户应该能够通过拖动滚动它(不仅仅是滚动条,还有内容本身)。
使用一些可拖动的轮播库(例如owlcarousel)不是一个选项,因为所有这些都使用转换而不是本机滚动。
所以我的计划是:
mousedown
活动mousemove
mouseup
桌面上的一切都很好。但问题是移动,因为移动浏览器会触发假mousedown
和mousemove
事件 - 滚动已损坏。如果我在preventDefault
中调用touchstart/move
- 虚假鼠标事件会停止触发,但窗格也不会滚动。
有没有办法在不调用mousedown/move/up
的情况下阻止移动设备上出现假e.preventDefault()
个事件?
感谢您的任何意见!
答案 0 :(得分:1)
引用W3C:
为了避免两次处理相同的交互以进行触摸(一次用于触摸事件,一次用于兼容性鼠标事件),开发人员应确保取消触摸事件,禁止生成任何进一步的鼠标或单击事件。或者,请参阅InputDeviceCapabilities API以获取检测因触摸事件而生成的鼠标事件的方法。
不幸的是,这似乎在任何浏览器中都没有(但是?)。
更可行的可能性是{@ 3}}元素,让鼠标处理代码处理滚动:
.my-panel {
touch-action: none;
}
如果这使得在移动设备上滚动过于笨拙,那么一个hacky但可能有效的解决方案可能是忽略mousemove
事件后不久(例如,在100 ms内)之后发生的任何touchmove
事件。