禁用所有移动设备中的滚动


69

听起来应该在整个Internet上都有解决方案,但是我不确定为什么找不到它。我想在移动设备上禁用水平滚动。基本上试图做到这一点:

body{
   overflow-x:hidden  // disable horizontal scrolling.
}

这可能是相关的信息:我的头部标签中也有此信息,因为我也不希望用户能够缩放:

<meta content='width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;' name='viewport' />
<meta name="viewport" content="width=device-width" />

谢谢


Answers:


115
html, body {
  overflow-x: hidden;
}
body {
  position: relative;
}

相对职位很重要,我只是偶然发现了这一点。没有它就无法工作。


1
同意@daekano将此答案标记为已接受的答案。这也为我工作。
卡米洛·桑切斯

2
任何人都可以解释position:relative如何帮助这项工作吗?
user2840467

3
我不敢相信像职位这样小的事情:亲戚;正在阻止它工作。谢谢!
Mathew

它可以正常工作,但可以使触摸设备流畅地滚动……(我似乎无法向上推动并看到页面滚动,只要松开手指它就会停止滚动)
mateostabio

无论出于何种原因,这都可以在android设备上使用,但在我尝试的任何IOS设备上都无法使用
doublea '19

28

cgvector答案对我不起作用,但这确实有效:

document.body.addEventListener('touchstart', function(e){ e.preventDefault(); });

我不会那样做,需要一个更智能的逻辑来选择何时阻止滚动,但这是一个好的开始。

取自此处: 禁止在iPhone Web应用程序中滚动?


5
您了解的是,您甚至禁用了垂直页面滚动,对吗?
tibalt 2012年

5
是的,这就是为什么这样说a smarter logic is needed to select when to prevent the scrolling
樟宜2012年

1
我不能使用它,因为这也会阻止显示任何HTML 5 contextmenu(受Firefox 20 for Android支持)。
panzi

4
只是我还是这看起来很鲁ck?
Jordan Sitkin

Chango-完美的解决方案!当我在移动网络应用程序上使用自定义滚动脚本时,这段代码终于一次解决了我所有的问题!
Artanis

22

对于子孙后代:

为防止滚动但保留上下文菜单,请尝试

document.body.addEventListener('touchmove', function(e){ e.preventDefault(); });

它仍然可以阻止某些人想像的事情,但是对于大多数浏览器而言,唯一阻止的默认行为应该是滚动。

对于更复杂的解决方案,该解决方案允许在不可滚动的主体内使用可滚动的元素并防止橡皮筋,请在此处查看我的答案:

https://stackoverflow.com/a/20250111/1431156


刚刚进行了测试,并与iOS上的Safari以及Android上的Chrome和Firefox完美兼容。
pfac 2015年

3
当前的Chrome版本需要这样做:document.body.addEventListener('touchmove', function(e){ e.preventDefault(); }, { passive: false });。注意,对象变成了true事件捕获。
br4nnigan

15

我怀疑大多数人都真的想禁用缩放/滚动,以提供更类似于应用程序的体验;因为答案似乎包含缩放和滚动解决方案的要素,但没人真正确定其中的一个。

卷动

为了回答OP,您似乎唯一需要做的就是禁用滚动功能,即拦截窗口scrolltouchmove事件,preventDefaultstopPropagation在它们生成的事件上进行调用和调用。像这样

window.addEventListener("scroll", preventMotion, false);
window.addEventListener("touchmove", preventMotion, false);

function preventMotion(event)
{
    window.scrollTo(0, 0);
    event.preventDefault();
    event.stopPropagation();
}

并且在样式表中,确保您的bodyhtml标签包括以下内容:

html:
{
    overflow: hidden;
}

body
{
    overflow: hidden;
    position: relative;
    margin: 0;
    padding: 0;
}

缩放

但是,滚动是一回事,但您可能还想禁用缩放。在标记中对meta标签执行的操作:

<meta name="viewport" content="user-scalable=no" />

所有这些结合在一起,可为您提供类似于应用程序的体验,可能最适合画布。

(警惕一些建议添加属性像initial-scalewidth元标记,如果您使用的是画布,画布因规模及其内容,不象块元素,你会得一个丑陋的帆布,往往不是)。


经过数小时的搜索和尝试,只有这种方法对我有用。我无法说出我有多感谢你的队友,你救了我的命!
user3304007

设置overflowhtml显然是必要的。没有它,但是有了该线程的所有其他建议,仍然会发生滚动。在我的情况下,不需要阻止事件。
Ishamael

1
如@brannigan在另一条评论中所述,使用window.addEventListener("touchmove", preventMotion, { passive: false });
Mugen


4

用这个风格

body
{
overflow:hidden;
width:100%;
}

在head标签中使用

<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0" />
<meta name="apple-mobile-web-app-capable" content="yes" />

1
在主体和html中,overflow:hidden和width:100%都足够。!(在iPhone中!)
StinkyCat

3

在页面标题中,添加

<meta name="viewport" content="width=device-width, initial-scale=1, minimum-sacle=1, maximum-scale=1, user-scalable=no">

在页面样式表中,添加

html, body {
  overflow-x: hidden;
  overflow-y: hidden;
}

它既是html又是正文!


2

CSS属性touch-action可能会为您提供所需的东西,尽管它可能无法在所有目标浏览器中使用。

html, body {
    width: 100%; height: 100%;
    overflow: hidden;
    touch-action: none;
}

1

这对我有用:

window.addEventListener("touchstart", function(event){
             if(event.target.tagName=="HTML" || event.target.tagName=="BODY"){
                     event.preventDefault();
             }
} ,false);

它不能100%工作,我还添加了以下内容:

window.addEventListener("scroll",function(){
    window.scrollTo(0,0)
},false)

0

在尝试所有答案均未成功后,我设法通过简单添加以下内容来关闭移动滚动:

html,
body {
  overflow-x: hidden;
  height: 100%;
}

body {
  position: relative;
}

重要的是%不要vh为此使用。这height: 100%一直是我一直想念的东西,疯狂。


0

位置设置为相对位置对我不起作用。仅当我将body的位置设置为fixed时才有效:

document.body.style.position = "fixed";
document.body.style.overflowY = "hidden";
document.body.addEventListener('touchstart', function(e){ e.preventDefault()});

-2

这样可以防止在移动设备上滚动,但不能单击/单击。

document.body.addEventListener('touchstart', function(e){ e.preventDefault(); });

-2

以下对我有用,尽管我没有测试每台设备都要进行测试:-)

$('body, html').css('overflow-y', 'hidden');
$('html, body').animate({
    scrollTop:0
}, 0);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.