可移动滚动和移动设备上的潜在问题

时间:2018-04-06 06:40:58

标签: javascript html css

我有水平滚动面板(通过overflow-x:scroll),用户应该能够通过拖动滚动它(不仅仅是滚动条​​,还有内容本身)。

使用一些可拖动的轮播库(例如owlcarousel)不是一个选项,因为所有这些都使用转换而不是本机滚动。

所以我的计划是:

  • 绑定mousedown活动
  • 更改mousemove
  • 上的水平滚动偏移
  • 停止mouseup
  • 处的所有操作

桌面上的一切都很好。但问题是移动,因为移动浏览器会触发假mousedownmousemove事件 - 滚动已损坏。如果我在preventDefault中调用touchstart/move - 虚假鼠标事件会停止触发,但窗格也不会滚动。

有没有办法在不调用mousedown/move/up的情况下阻止移动设备上出现假e.preventDefault()个事件?

感谢您的任何意见!

1 个答案:

答案 0 :(得分:1)

引用W3C

  

为了避免两次处理相同的交互以进行触摸(一次用于触摸事件,一次用于兼容性鼠标事件),开发人员应确保取消触摸事件,禁止生成任何进一步的鼠标或单击事件。或者,请参阅InputDeviceCapabilities API以获取检测因触摸事件而生成的鼠标事件的方法。

不幸的是,这似乎在任何浏览器中都没有(但是?)。

更可行的可能性是{@ 3}}元素,让鼠标处理代码处理滚动:

.my-panel {
  touch-action: none;
}

如果这使得在移动设备上滚动过于笨拙,那么一个hacky但可能有效的解决方案可能是忽略mousemove事件后不久(例如,在100 ms内)之后发生的任何touchmove事件。