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

时间:2012-05-14 23:39:13

标签: android iphone css mobile scroll

这听起来应该是互联网上的解决方案,但我不知道为什么我找不到它。我想在移动设备上禁用水平滚动。基本上试图实现这个目标:

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" />

由于

16 个答案:

答案 0 :(得分:97)

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

位置相对很重要,我只是偶然发现它。没有它就无法工作。

答案 1 :(得分:23)

cgvector回答对我不起作用,但这样做了:

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

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

从这里采取: Disable scrolling in an iPhone web application?

答案 2 :(得分:19)

为后代:

要阻止滚动但保留上下文菜单,请尝试

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

它仍然可以防止比某些人更喜欢的方式,但是对于大多数浏览器来说,唯一的默认行为应该是滚动。

对于更复杂的解决方案,允许不可滚动的主体内的可滚动元素并防止橡皮带,请看看我的答案:

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

答案 3 :(得分:12)

尝试添加

html {
  overflow-x: hidden;
}

以及

body {
  overflow-x: hidden;
}

答案 4 :(得分:9)

我怀疑大多数人都想要禁用缩放/滚动,以便组合更像应用程序的体验;因为答案似乎包含了缩放和滚动解决方案的元素,但是没有人真的把它们钉在一起。

滚动

要回答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 name="viewport" content="user-scalable=no" />

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

(如果你正在使用画布,请注意一些人将initial-scalewidth等属性添加到元标记的建议,因为画布缩放他们的内容,与块元素不同,你会得到一个丑陋的画布,通常不会。)

答案 5 :(得分:4)

在风格中使用

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

在头标记中使用

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

答案 6 :(得分:2)

在页眉中,添加

.work-slider ul {
    width: 800%;
}
.work-slider ul li {
    width: 12.5%;
}

在页面样式表中,添加

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

这是html和body!

答案 7 :(得分: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)

答案 8 :(得分:0)

CSS属性 touch-action 可能会为您提供所需的东西,尽管它在所有目标浏览器中都是may not work

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

答案 9 :(得分:0)

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

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

body {
  position: relative;
}

为此请使用%而不是vhheight: 100%是我一直想念的东西,疯了。

答案 10 :(得分:0)

设置相对亲戚的位置对我不起作用。仅当我将主体的位置设置为固定时才起作用:

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

答案 11 :(得分:0)

最简单的方式,仅使用 CSS 代码:

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

答案 12 :(得分:0)

对于 Apple 设备 stopTask(sameAgent) 不起作用。以下代码适用于所有设备:

position: relative

答案 13 :(得分:0)

我迟到了,但我添加了这个答案,因为我尝试过的其他任何事情都没有在我的特定情况下起作用。捕获 touchmove、scroll 等事件的组合没有任何效果,而 position: relative 使一切都消失了。

我发现我必须在 HTML 和 BODY 元素上添加 height: 100%。可能并非所有以下规则都是必需的,但我花了足够长的时间偶然发现了这个神奇的组合,它似乎有效。

html {
    height: 100%;
    overflow: hidden;
}
body{
    margin: 0;
    overflow: hidden;
    height: 100%;
    position: relative;
}

除此之外,我在 HTML 头中还有以下内容:

<meta name="viewport" content="width=device-width, initial-scale=1">

我的应用大量使用绝对位置元素,其中一些元素在不同时间滑出视图时部分离开屏幕。因此,body 元素中没有任何内容可以为 body 提供任何面积/大小。

我发现移动设备上发生的“滚动”是由于浏览器不知道页面大小的范围以进行其视口(缩放到设备宽度)计算的结果。看起来高度为 0px 的 body 无法向浏览器传达页面的高度或宽度,因此将 body 的高度设置为 100% 是解决方案的关键。

编辑:找到我的解决方案后再次查看答案,我意识到“Toms Codery”的另一个答案与我的解决方案基本相同,尽管他只是在 x 方向上。

答案 14 :(得分:-2)

以下对我有用,虽然我没有测试每个设备都要测试: - )

$('body, html').css('overflow-y', 'hidden');
$('html, body').animate({
    scrollTop:0
}, 0);

答案 15 :(得分:-2)

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

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