javascript iOS:禁用弹跳滚动,但允许正常滚动

q3qa4bjr  于 2023-01-16  发布在  Java
关注(0)|答案(8)|浏览(277)

我不想让我的网站内容在用户点击页面边缘时四处晃动,我只想让它停下来。
我看到的无处不在的javascript解决方案是:

$(document).bind(
   'touchmove',
   function(e) {
     e.preventDefault();
   }
);

但是这完全阻止了滚动。有没有办法只去除弹跳。最好是用CSS或 meta标记,而不是JS,但是任何有效的方法都可以。

okxuctiv

okxuctiv1#

我必须补充另一个答案。我的第一个方法应该工作,但是,有一个iOS的错误,它仍然bumbs整个页面,即使eidostoppropagation.
mikeyUX找到了一个解决方法:https://stackoverflow.com/a/16898264/2978727我想知道为什么他只是得到几个点击这个伟大的想法...
下面是我在案例中使用他的方法的方式:

var content = document.getElementById('scrollDiv');
content.addEventListener('touchstart', function(event) {
    this.allowUp = (this.scrollTop > 0);
    this.allowDown = (this.scrollTop < this.scrollHeight - this.clientHeight);
    this.slideBeginY = event.pageY;
});

content.addEventListener('touchmove', function(event) {
    var up = (event.pageY > this.slideBeginY);
    var down = (event.pageY < this.slideBeginY);
    this.slideBeginY = event.pageY;
    if ((up && this.allowUp) || (down && this.allowDown)) {
        event.stopPropagation();
    }
    else {
        event.preventDefault();
    }
});
xa9qqrwz

xa9qqrwz2#

通过防止文档的默认行为来禁用退回:

document.addEventListener("touchmove", function(event){
    event.preventDefault();
});

通过防止触摸达到文档级别(您将阻止滚动)来允许滚动:

var scrollingDiv = document.getElementById('scrollDiv');
scrollingDiv.addEventListener('touchmove', function(event){
    event.stopPropagation();
});

注意这两者之间的区别:

event.stopPropagation()
event.preventDefault()

StopPropagation应该是你在这里的选择!这里有一个非常好的解释:http://davidwalsh.name/javascript-events
编辑:同样的问题,同样的解决方案:在iOS 5上移动和滚动
Edit 2:修复了在方法后添加括号的变量名称中的排印错误

kupeojn6

kupeojn63#

如果应用于桌面浏览器,不需要任何JavaScript代码,只需几行CSS代码:

html {
    height  : 100%;
    overflow: hidden;
}
body {
    height  : 100%;
    overflow: auto;
}
6ioyuze2

6ioyuze24#

我尝试了很多不同的方法,我发现在这里stackoverflow,但iNoBounce是真正为我工作的东西:https://github.com/lazd/iNoBounce
我只是把它包含在我的索引中。html:

<script src="inobounce.js"></script>
cgvd09ve

cgvd09ve5#

This library是我的场景的解决方案。简单的使用方法只是包括库和初始化在你想要的像这些;

noBounce.init({   
    animate: true
});

如果你只想防止在一个元素而不是整个页面上反弹,你可以这样做:

noBounce.init({
    animate: true,
    element: document.getElementById("content")
  });
hgb9j2n6

hgb9j2n66#

找到了一个对我有效的代码,我相信它也会对你有效。
解决方案如下所示:http://apdevblog.com/optimizing-webkit-overflow-scrolling/
基本上,你需要有这样的js代码:

document.addEventListener("DOMContentLoaded", ready, false);
    document.addEventListener("touchmove", function (evt)
    {
        evt.preventDefault();
    }, false);

    function ready()
    {
        var container = document.getElementsByClassName("scrollable")[0];
        var subcontainer = container.children[0];
        var subsubcontainer = container.children[0].children[0];

        container.addEventListener("touchmove", function (evt)
        {
            if (subsubcontainer.getBoundingClientRect().height > subcontainer.getBoundingClientRect().height)
            {
                evt.stopPropagation();
            }
        }, false);
    }

然后,使用class=“scrollable”创建可滚动的div。

3df52oht

3df52oht7#

在尝试了这些建议并阅读了几篇文章之后,我的解决方法是使用CSS属性〈overflow-x:隐藏;〉在有问题的元素/容器上。

kq0g1dla

kq0g1dla8#

iOS16开始支持css的过卷行为。如果你的目标是〉iOS16的设备(包括它的WKWebview),防止过卷反弹,解决方案很简单
添加以下CSS

html {
  overscroll-behavior: none;
}

在iOS 16及更高版本中测试。

相关问题