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


142

在这里有一个网站。

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

在任何移动浏览器中,无论是Android还是iOS,黑色菜单栏都会显示其完整宽度,从而在页面右侧显示空格。据我所知,该空格甚至不是htmlor body标记的一部分。

即使我在中将视口设置为特定的宽度<head>

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

该站点扩展到1100像素,但仍然有1100以外的空白。

我想念什么?如何将视口保持在1100并切断溢出?


1
这在iOS9中尤其是个问题
Chuck Le Butt

Answers:


269

创建内部的一个网站包装DIV <body>并应用overflow-x:hidden包装,而不是<body><html>固定的问题。

看来,解析<meta name="viewport">标记的浏览器只是忽略overflowhtmlbody标记上的属性。

注意:您可能还需要添加position: relative到包装div中。


44
我发现除了将设置overflow为之外hidden,我还必须将设置positionfixed...
Victor S

16
将位置添加到固定位置使我无法滚动!
理论是

5
我尝试过,将所有代码放在div中,然后给它溢出-x:隐藏,但不起作用,我添加了<meta name =“ viewport” content =“ width = device-width,initial-scale = 1”>也是,但是什么都没有改变:/任何想法?

4
overflow-x: hidden即使添加了此meta标签,@ leepowers 仍然对我不起作用。您能否分享一个指向您正在运行的网站的链接?
jupiteror 2015年

3
嗨,帮派,当我发现它也可行时position:relative
托马斯·瓦拉德兹'18

80

尝试

html, body {
  overflow-x:hidden 
} 

而不只是

body {
  overflow-x:hidden 
}

7
谢谢,但是将overflow任何东西应用到html和/或body以任何组合的方式都不能解决问题。
土著,2013年

抱歉,它对您没有帮助。在回答之前,我使用您的网站进行了快速测试,并将我的建议应用于您的CSS。它至少解决了我的Android手机上的标准和海豚浏览器问题。
subarachnid

3
为我工作。eduardd.eu/projects/ezo(页脚介于480和992px之间的女人和毛巾的图像有问题)
Eduard

2
有没有人知道为什么这样工作,而分别指定body {}和html {}却没有呢?
hamncheez

1
也需要添加height:100%;,否则垂直滚动在加载图像的页面上将无法正常工作(这会使页面高度增加)。
阿诺·范·奥尔特

69

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

维克多(Victor)注意到正在添加position:fixed作品。

body.modal-open {
    overflow: hidden;
    position: fixed;
}

确实如此。但是,它也具有基本滚动到顶部的轻微副作用。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; 
}

我还添加了此选项,以防止显示/隐藏模式时基础页面向左/向右跳转。

body {
    // STOP MOVING AROUND!
    overflow-x: hidden;
    overflow-y: scroll !important;
}

2
无论如何,有没有让移动部分跳到顶部?
WraithKenny 2015年

1
对我有用的是将原本应该由溢出隐藏的元素从位置:绝对更改为位置:固定。谢天谢地。
Chuck Le Butt

1
@WraithKenny-如果您希望页面阻止在移动设备上跳转到顶部,则可以使用以下“骇客” /“丑陋”方法。在模态函数内部,执行任何操作之前,请确保已获得当前滚动偏移量,然后将模态样式一起应用,并且将主体的上边距设置为等于当前偏移量的负值。确保在删除模态时,将边距设置为0,然后将页面滚动回原始偏移量。
埃米尔·博尔科尼

2
该解决方案仅在模态的内容适合屏幕的情况下才有效,即您不需要滚动模态本身。
Tobias'8

我的页面上还有其他固定和绝对定位的元素。使身体也position:fixed or absolute干扰他们的位置。不适合我/在我的情况下工作:(
sohaiby

31

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

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

1
它似乎有效。但是,您对此有何解释?
LarS

不,它最终没有用。我结束了数学运算,并确保div的宽度不超过允许的范围,css calc()在这里为我提供了很多帮助,因为它允许相对宽度(vw或%)和绝对宽度(px)的混合。
LarS

当然,这是一种解决方法。某处仍然有一些东西溢出,现在才被切断。尝试添加CSS规则:* {轮廓:1像素纯红色;如果仍然找不到溢出的元素,则可能是由于某处的边距引起的。尝试添加* {margin:0!IMPORTANT; },看看溢出是否消失了。
Waltur Buerk '18

为我工作。有趣的是,隐藏元素会改变身体的宽度。但是,对我来说,所有Safari浏览器都是这种情况,不仅是移动浏览器。只需修复Bootstrap 4 table-responsive错误。这就是解决方案。
CunningFatalist

2
我不敢相信这在2019年仍然是一个问题。但是上述解决方案完全有效。谢谢。
staxim

28

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

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

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

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


添加initial-scale=1到现有的视口元标记确实可以解决该问题。谢谢!
JamesWilson

6
对我来说是minimum-scale=1固定的问题
jpenna

在尝试了所有其他方法之后,这实际上对我有用。非常感谢 !
严厉的玛雅

16
body{
height: 100%;
overflow: hidden !important;
width: 100%;
position: fixed;

适用于iOS9


3
它确实有效,但是将position:fixed固定在您的身体上确实会使您滚动到顶部
ThaoD5

1
很奇怪,但是它对我也没有固定的位置。这里所有解决方案中只有一个!
Garavani

使用chrom和boostrap + angularJS的只有一个对我有用的东西
kiwicomb123

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

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

.menuitem {
display: block;
padding: 0px 20px;
}

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


如果使用box-sizing: border-box;,则可以将填充添加到100%宽度的div中。
查尔斯·约翰·汤普森三世

6

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

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


这对我有用。副作用是我有两个滚动条,而不是一个。解决的办法是overflow: hidden代替它overflow-x: hidden。适用于移动Safari,Chrome,OSX和Win上的IE11。
流行

4

<div>确实可以在整个内容周围添加包装器。在语义上是“ icky”的时候,我在body标签内部添加了一个带有overflowWrap类的div,然后像这样设置我的CSS:

html, body, .overflowWrap {
overflow-x: hidden;
}

现在可能会被过度杀伤,但是却像魅力一样起作用!


4

我在Android设备上遇到了相同的问题,但在iOS设备上没有遇到同样的问题。通过在绝对定位的元素的外部div中指定position:relative来进行解析(对于外部div而言,其溢出:隐藏)


4

没有以前的单一解决方案对我有用,我不得不将它们混合使用,并在较旧的设备(iPhone 3)上也解决了该问题。

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

<html>
  <body>
    <div id="wrapper">... old html goes here ...</div>
  </body>
</html>

然后我不得不将隐藏的溢出应用到包装器,因为overflow-x无法正常工作:

  #wrapper {
    overflow: hidden;
  }

这解决了这个问题。


这与@Indigenuity的答案有何不同?
伊恩·坎普

3
@ian Kemp溢出:隐藏!=溢出-x:隐藏
spaghetticode

3

我通过使用overflow-x:hidden;解决了这个问题。如下

@media screen and (max-width: 441px){

#end_screen { (NOte:-the end_screen is the wrapper div for all other div's inside it.)
  overflow-x: hidden;
   }
 }

结构如下

1st div end_screen >> inside it >> end_screen_2(div) >> inside it >> end_screen_2.

'end_screen is the wrapper of end_screen_1 and end_screen_2 div's


3

正如subarachnid所说的,对于主体和html都隐藏了溢出-x,这是工作示例

**HTML**
<div class="contener">
  <div class="menu">
  das
  </div>
  <div class="hover">
    <div class="img1">
    First Strip
    </div>
     <div class="img2">
    Second Strip
    </div>
</div>
</div>
<div class="baner">
dsa
</div>

**CSS**
body, html{
  overflow-x:hidden;
}
body{
  margin:0;
}
.contener{
  width:100vw;
}
.baner{
   background-image: url("http://p3cdn4static.sharpschool.com/UserFiles/Servers/Server_3500628/Image/abstract-art-mother-earth-1.jpg");
   width:100vw;
   height:400px;
   margin-left:0;
   left:0;
}
.contener{
  height:100px;
}
.menu{
  display:flex;
  background-color:teal;
  height:100%;
  justify-content:flex-end;
  align:content:bottom;
}
.img1{
  width:150px;
  height:25px;
  transform:rotate(45deg);
  background-color:red;
  position:absolute;
  top:40px;
  right:-50px;
  line-height:25px;
  padding:0 20px;
  cursor:pointer;
  color:white;
  text-align:center;
  transition:all 0.4s;
}
.img2{
  width:190px;
  text-align:center;
  transform:rotate(45deg);
  background-color:#333;
  position:absolute;
  height:25px;
  line-height:25px;
  top:55px;
  right:-50px;
  padding:0 20px;
  cursor:pointer;
  color:white;
  transition:all 0.4s;
}
.hover{
  overflow:hidden;
}
.hover:hover .img1{
  background-color:#333;
  transition:all 0.4s;
}
.hover:hover .img2{
  background-color:blue;
  transition:all 0.4s;
}

链接


1

我刚刚从事了几个小时的尝试,尝试了本页面和其他页面中的各种组合。最后,对我有用的是按照接受的答案中的建议创建一个站点包装div,但是将两个溢出都设置为隐藏而不是x溢出。如果我在滚动时保持溢出-y,则最终得到的页面只会垂直滚动几个像素然后停止。

#all-wrapper {
  overflow: hidden;
}

仅此而已,无需在body或html元素上设置任何内容。


1

我从该主题的回复中尝试了多种方法,大多数都可以,但是有一些副作用,例如,如果我在body,html其上使用overflow-x,当用户在移动设备上向下滚动时,可能会减慢/冻结页面。

position: fixed在身体内部的wrapper / div上使用也很好,但是当我有一个菜单并使用Javascript时,请单击动画滚动到某个部分,这是行不通的。

因此,我决定touch-action: pan-y pinch-zoom在体内的wrapper / div 上使用。问题解决了。


0

为我的引导程序模式(包含表单)解决此问题的唯一方法是将以下代码添加到我的CSS中:

.modal {
    -webkit-overflow-scrolling: auto!important;
}
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.