ske*_*gse 9 javascript css scroll dom-events ios
因此,假设我们希望通过"添加到主屏幕"使webapp感觉像本机应用程序.其中一个步骤是禁用默认滚动.容易,对吗?
// window or document
window.addEventListener("touchmove", function(event) {
// no more scrolling
event.preventDefault();
}, false);
Run Code Online (Sandbox Code Playgroud)
这一切都很好,花花公子,直到你加入overflow-scrolling
混合.确切地说,在iOS上它将是-webkit-overflow-scrolling: touch
.
/* #scrollable happens to be a ul */
#scrollable {
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
Run Code Online (Sandbox Code Playgroud)
通过添加事件预防,容器中的硬件加速滚动不起作用,显然不是预期的效果.
显而易见的解决方案看起来像这样:
// you could do this for multiple elements, of course
var scrollable = document.querySelector("#scrollable");
scrollable.addEventListener("touchmove", function(event) {
// no more bubbling :)
event.stopPropagation();
}, false);
Run Code Online (Sandbox Code Playgroud)
此解决方案引入了一个问题,但是,如果您尝试向左或向右滚动#scrollable
,它将恢复为默认滚动侦听器.显然,您应该监控事件以查看touchmove
事件是向左还是向右追踪,对吧?不幸的是,在我不完全理解的情况下,不会在容器中垂直滚动时恢复默认滚动侦听器.
怎么办?更糟糕的是,我们理想情况下能够处理click
或点击个人事件li
(阅读:) touchstart
:
var items = scrollable.querySelectorAll("#scrollable li");
for (var item = 0; item < items.length; item++) {
items[item].addEventListener("touchstart", function() {
// handle the touch start
}, false);
}
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我们可以转向简单地使用click
事件,但是由于点击和响应之间的延迟,这默认了使webapp"感觉"原生的目标.为了解决这个问题,我们将添加一个事件侦听器touchstart
和touchend
:
var items = scrollable.querySelectorAll("#scrollable li");
var activeItem = null, startTouch = null;
for (var item = 0; item < items.length; item++) {
items[item].addEventListener("touchstart", function(event) {
startTouch = event.touches[0];
activeItem = this;
}, false);
items[item].addEventListener("touchend", function(event) {
var touch = event.changedTouches[0];
var deltaX = touch.pageX - startTouch.pageX
var deltaY = touch.pageY - startTouch.pageY;
// require the touchstart to be within 10 pixels of the touchend
if (deltaX * deltaX + deltaY * deltaY <= 100)
// handle "click" event
}, false);
}
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但我们仍然没有解决问题,默认页面滚动控制一些touchmove
事件.有任何想法吗?
尝试更换元素window
和scrollable
元素侦听器中的逻辑,如下所示:
// window or document
window.addEventListener("touchmove", function(event) {
if (!event.target.classList.contains('scrollable')) {
// no more scrolling
event.preventDefault();
}
}, false);
// No special listeners needed on .scrollable elements
Run Code Online (Sandbox Code Playgroud)
这样,您只能在尝试滚动不可滚动元素时阻止默认值.
你仍然会遇到一个问题,即在可滚动内容的顶部/底部开始拖动会导致整个应用程序"反弹".要解决此问题,请参阅Joe Lambert的ScrollFix.
归档时间: |
|
查看次数: |
14366 次 |
最近记录: |