这是 iOS 上的正常行为(仅限 iOS)。overflow: hidden
您可以通过同时声明html
和body
元素来解决它。此外,您应该将 body 设置为position: relative
.
溢出行为
这里有几件事在起作用。要了解修复工作的原因,我们首先需要看看视口溢出是如何设置的。
- 视口的溢出由
html
元素的溢出设置决定。
- 但只要您将
html
元素的溢出保留为默认值 ( visible
),主体的溢出设置也会应用于视口。即,您可以在目标视口时设置html
或body
设置。overflow: hidden
到目前为止,body 元素本身的溢出行为不受影响。
- 现在,如果您将
html
元素的溢出设置为 以外的任何值,则不再发生visible
从到视口的转移。body
在您的特定情况下,如果您将两个溢出都hidden
设置为 ,则html
元素的设置将应用于视口,并且body
元素也会隐藏其溢出。
实际上,在每个相当现代的浏览器中都是如此,而不是特定于 iOS。
iOS 怪癖
现在,iOS 忽略overflow: hidden
了视口。无论您在 CSS 中声明什么,浏览器都保留将内容作为一个整体显示的权利。这是故意的,而不是错误,并且在 iOS 7 和 8 中仍然如此。对此也没有任何人可以做的事情 - 它无法关闭。
但是您可以通过使主体元素本身而不是视口隐藏其溢出来解决它。要做到这一点,您必须首先将html
元素的溢出设置为除 之外的任何值visible
,例如设置为auto
或hidden
(在 iOS 中,两者没有区别)。这样,body 溢出设置不会转移到视口,并且当您将其设置为时实际上会粘在 body 元素上overflow: hidden
。
有了它,大多数内容都被隐藏了。但是仍然有一个例外:绝对定位的元素。它们的最终偏移父对象是视口,而不是主体。如果它们位于屏幕外、右侧或底部的某个位置,您仍然可以滚动到它们。为了防止这种情况,您可以简单地将 body 元素设置为position: relative
,这使其成为定位内容的偏移父级,并防止这些元素脱离 body 框。
用代码回答
最后要注意一个问题:主体本身不能大于视口。
所以body需要设置为视口宽度和高度的100%。(实现它的纯 CSS 方法的功劳归于这个 SO answer。)html
和body
元素的边距必须为 0,并且 也html
不能有填充或边框。
最后,为了处理 body padding,并且如果你想在 body 上设置一个边框,让数学与box-sizing: border-box
body 一起工作。
所以这里。
html {
overflow: hidden;
height: 100%;
margin: 0;
padding: 0;
border: none;
}
body {
overflow: hidden;
position: relative;
box-sizing: border-box;
margin: 0;
height: 100%;
}
NB 你可以随意设置body padding 和border。