98

我有一个页面,其中有一个部分用于绘制绘图。但是当在移动浏览器上使用它时,touchmove 事件,至少是垂直事件,也在滚动页面(这会降低绘图体验)。有没有办法a)禁用和重新启用页面的滚动(这样我可以在每行开始时将其关闭,但在每行完成后将其重新打开),或b)禁用默认处理touchmove 事件(可能是滚动)会转到绘制草图的画布(我不能完全禁用它们,因为草图使用它们)?

我已经为草图使用了 jquery-mobile vmouse 处理程序,如果这有所作为的话。

更新:在 iPhone 上,如果我选择要在其中绘制草图的画布,或者只是在绘制之前按住手指一会儿,页面不会滚动,而不是因为我在页面中编码的任何内容。

4

8 回答 8

165

touch-action CSS 属性设置为none,即使是被动事件侦听器也可以:

touch-action: none;

当事件源自元素时,将此属性应用于元素不会触发默认(滚动)行为。

于 2017-04-07T10:16:19.080 回答
46

注意:正如@nevf 在评论中指出的那样,由于性能变化,此解决方案可能不再有效(至少在 Chrome 中)。建议使用touch-action@JohnWeisz 的回答也建议使用。

与@Llepwryd 给出的答案类似,我使用ontouchstart和的组合ontouchmove来防止在某个元素上滚动。

照原样取自我的一个项目:

window.blockMenuHeaderScroll = false;
$(window).on('touchstart', function(e)
{
    if ($(e.target).closest('#mobileMenuHeader').length == 1)
    {
        blockMenuHeaderScroll = true;
    }
});
$(window).on('touchend', function()
{
    blockMenuHeaderScroll = false;
});
$(window).on('touchmove', function(e)
{
    if (blockMenuHeaderScroll)
    {
        e.preventDefault();
    }
});

本质上,我正在做的是监听触摸开始,看看它是否从一个元素开始,该元素是另一个使用 jQuery 的子元素,.closest并允许打开/关闭滚动的触摸运动。指的e.target是触摸开始的元素。

您想阻止触摸移动事件的默认设置,但是您还需要在触摸事件结束时为此清除标志,否则触摸滚动事件将不起作用。

这可以在没有 jQuery 的情况下完成,但是对于我的使用,我已经有了 jQuery,并且不需要编写代码来查找元素是否具有特定的父级。

截至 2013 年 6 月 18 日,在 Android 和 iPod Touch 上的 Chrome 中进行了测试

于 2013-06-18T02:48:02.777 回答
27

CSS 上有一个小“hack”,它还允许您禁用滚动:

.lock-screen {
    height: 100%;
    overflow: hidden;
    width: 100%;
    position: fixed;
}

将该类添加到正文将防止滚动。

于 2016-11-14T21:38:43.307 回答
20
document.addEventListener('touchstart', function(e) {e.preventDefault()}, false);
document.addEventListener('touchmove', function(e) {e.preventDefault()}, false);

这应该防止滚动,但它也会破坏其他触摸事件,除非您定义自定义方式来处理它们。

于 2013-05-02T22:04:03.473 回答
4

最终的解决方案是这样overflow: hidden;设置document.documentElement

/* element is an HTML element You want catch the touch */
element.addEventListener('touchstart', function(e) {
    document.documentElement.style.overflow = 'hidden';
});

document.addEventListener('touchend', function(e) {
    document.documentElement.style.overflow = 'auto';
});

通过设置overflow: hidden触摸开始,它可以隐藏超出窗口的所有内容,从而消除滚动任何内容的可用性(没有滚动内容)。

锁定后touchend可以通过设置overflowauto(默认值)来释放。

最好将它附加到,<html>因为<body>它可以用来做一些样式,而且它可以让孩子们表现出意外。

编辑:关于-根据 MDNtouch-action: none;,Safari 不支持它。

于 2017-07-20T18:23:52.970 回答
1

令我惊讶的是,“preventDefault()”方法在 iOS 13.7 上的最新 Google Chrome(版本 85)上为我工作。它也适用于同一设备上的 Safari,也适用于我的 Android 8.0 平板电脑。我目前在我的网站上为 2D 视图实现了它: https ://papercraft-maker.com

于 2020-09-27T23:13:44.343 回答
0

尝试在触摸事件发生时将溢出隐藏在您不想滚动的内容上。例如,在开始时设置溢出隐藏,并在结束时将其设置回自动。

你试过了吗?我很想知道这是否可行。

document.addEventListener('ontouchstart', function(e) {
    document.body.style.overflow = "hidden";
}, false);

document.addEventListener('ontouchmove', function(e) {
    document.body.style.overflow = "auto";
}, false);
于 2013-05-02T22:17:52.773 回答
0

我发现这ev.stopPropagation();对我有用。

于 2018-12-21T21:59:16.593 回答