Overflow-x:hidden不会阻止内容在移动浏览器中溢出

Ind*_*ity 124 css overflow viewport mobile-browser

这里有一个网站.

在桌面浏览器中查看,黑色菜单栏正确地仅延伸到窗口的边缘,因为它body具有overflow-x:hidden.

在任何移动浏览器中,无论是Android还是iOS,黑色菜单栏都会显示其全宽,这会在页面右侧显示空白区域.据我所知,这个空格甚至不是htmlbody标签的一部分.

即使我将视口设置为以下特定宽度<head>:

<meta name="viewport" content="width=1100, initial-scale=1">
Run Code Online (Sandbox Code Playgroud)

该网站扩展到1100px,但仍然有超过1100的空白.

我错过了什么?如何将视口保持为1100并切断溢出?

Ind*_*ity 236

在内部创建一个站点包装器div <body>并将其overflow-x:hidden应用于包装器INSTEAD <body><html>修复该问题.

看起来解析<meta name="viewport">标记的浏览器只是忽略和标记overflow上的属性.htmlbody

  • 我发现除了将`overflow`设置为`hidden`之外,我还必须将`position`设置为`fixed` ... (43认同)
  • 添加固定位置阻止我滚动! (15认同)
  • 我尝试过,我把所有代码都放在div中并给它溢出-x:隐藏但是不起作用,我添加<meta name ="viewport"content ="width = device-width,initial-scale = 1">也没有改变:/任何想法? (5认同)
  • @leepowers`swiss-x:hidden`即使在我添加这个元标记后仍然无法正常工作.您能否分享一下您网站的链接? (4认同)
  • 嘿帮派,当我发现`position:relative`也是如此. (3认同)
  • 嘿,很好的答案,虽然这解决了最初的问题,但对于任何一个有粘性导航的人来说,这使它不再粘了!我通过将粘性导航放在包装纸外面解决了这个问题! (3认同)
  • 添加一个包含overflow:hidden的包装div在iOS7中为我做了诀窍! (2认同)
  • 在我确保视口元标记如下所示之前,我无法在 MobileSafari (iOS9) 上工作: `&lt;meta name="viewport" content="width=device-width, initial-scale=1, Maximum-scale=1 , user-scalable=no"&gt;` - 这里有问题:更改主要内容容器可能会导致文档高度发生巨大变化,进而导致奇怪的缩放行为。 (2认同)

sub*_*nid 72

尝试

html, body {
  overflow-x:hidden 
} 
Run Code Online (Sandbox Code Playgroud)

而不仅仅是

body {
  overflow-x:hidden 
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但在任何组合中对`html`和/或`body`的`overflow`应用都没有解决问题. (6认同)
  • 为我工作.http://eduardd.eu/projects/ezo(480到992px页脚之间有一个问题,那个女人和毛巾的图像溢出) (2认同)
  • 有谁知道为什么会这样,当分别指定 body{} 和 html{} 时不起作用? (2认同)
  • 还需要添加“height:100%;”,否则垂直滚动将无法在加载图像的页面上正常工作(这会使页面高度增加)。 (2认同)

Bra*_*rad 67

VictorS接受的答案的评论应该是它自己的答案,因为它是一个非常优雅的解决方案,确实有效.而且我会添加一点它的用处.

Victor注意到添加position:fixed作品.

body.modal-open {
    overflow: hidden;
    position: fixed;
}
Run Code Online (Sandbox Code Playgroud)

确实如此.然而,它也有一个轻微的副作用,基本上滚动到顶部.position:absolute解决了这个问题,但重新介绍了在移动设备上滚动的功能.

如果你知道你的视口(我的插件用于添加视口<body>),你可以添加一个css切换position.

body.modal-open {
    // block scroll for mobile;
    // causes underlying page to jump to top;
    // prevents scrolling on all screens
    overflow: hidden;
    position: fixed;
}
body.viewport-lg {
    // block scroll for desktop;
    // will not jump to top;
    // will not prevent scroll on mobile
    position: absolute; 
}
Run Code Online (Sandbox Code Playgroud)

我还添加了这个以防止底层页面在显示/隐藏模态时向左/向右跳跃.

body {
    // STOP MOVING AROUND!
    overflow-x: hidden;
    overflow-y: scroll !important;
}
Run Code Online (Sandbox Code Playgroud)

  • 反正有没有让移动部件没有跳到顶部? (2认同)
  • 此解决方案仅适用于您的模态内容适合屏幕的情况,即您不需要滚动模态本身。 (2认同)

Wal*_*erk 26

这是解决Safari中水平滚动的最简单的解决方案.

html, body {
  position:relative;
  overflow-x:hidden;
}
Run Code Online (Sandbox Code Playgroud)

  • 在“body”上设置“overflow-x:hidden”的一个问题是“position:sticky”停止工作。 (3认同)
  • 似乎有效。但你有解释为什么会这样吗? (2认同)
  • 我不敢相信这在2019年仍然是一个问题。但是上述解决方案完全有效。谢谢。 (2认同)

小智 19

正如@Indigenuity所述,这似乎是由浏览器解析<meta name="viewport">标签引起的.

要在源头解决此问题,请尝试以下操作:

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

在我的测试中,这可以防止用户缩小以查看溢出的内容,因此也可以防止平移/滚动到它.

  • 对我来说,是固定的`minimum-scale = 1` (4认同)

小智 16

body{
height: 100%;
overflow: hidden !important;
width: 100%;
position: fixed;
Run Code Online (Sandbox Code Playgroud)

适用于iOS9

  • 它的工作,但只是位置:固定你的身体确实让你滚动到顶部 (3认同)

小智 6

保持视口不变: <meta name="viewport" content="width=device-width, initial-scale=1.0">

假设您想在右侧实现连续黑条的效果:#menubar不应超过100%,请调整边框半径,使右侧成为方形并调整填充,使其向右延伸一点. 将以下内容修改为您的#menubar

border-radius: 30px 0px 0px 30px;
width: 100%; /*setting to 100% would leave a little space to the right */
padding: 0px 0px 0px 10px; /*fills the little gap*/
Run Code Online (Sandbox Code Playgroud)

调整padding到课程叶子10px的左边菜单栏的边缘,你可以把剩下的40像素到每个li20像素每边左,右:

.menuitem {
display: block;
padding: 0px 20px;
}
Run Code Online (Sandbox Code Playgroud)

当您将浏览器调整为较小时,您会发现仍然是白色背景:将背景纹理从 div 改为body. 或者,使用媒体查询将导航菜单宽度从 100% 调整为较低的值。需要对您的代码进行很多调整以创建适当的布局,我不确定您打算做什么,但上面的代码会以某种方式修复您的溢出栏。


spa*_*ode 5

没有以前的单一解决方案对我有用,我不得不将它们混合在一起并在旧设备(iphone 3)上修复问题.

首先,我必须将html内容包装到外部div中:

<html>
  <body>
    <div id="wrapper">... old html goes here ...</div>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

然后我不得不将溢出应用于包装器,因为overflow-x不起作用:

  #wrapper {
    overflow: hidden;
  }
Run Code Online (Sandbox Code Playgroud)

这解决了这个问题.

  • @ian Kemp溢出:隐藏!= overflow-x:隐藏 (3认同)

Isa*_*c F 5

在主体内部创建站点包装div并将overflow-> x:hidden应用于主体或html的封装INSTEAD可以解决此问题。

在添加position: relative到包装器之后,这对我有用。