position:fixed导致元素比浏览器更宽。

11

有人能告诉我为什么 position:fixed 会导致元素比浏览器或页面上的其他内容更宽,从而导致水平滚动吗?

以下是代码 HTML

<header>
     this is a header
</header>

<div class="container">
     this is a container
</div>

CSS

 header {
      width: 90%;
      height: 100px;
      background: blue;
      position: fixed;
      z-index: 100;
 }

.container {
     width: 90%;
     height: 500px;
     background: red;
     position: relative;
     z-index: -2;
}

这里是指向 CodePen 的链接http://codepen.io/colbydodson/pen/wcgua


1
这篇博客文章(http://bradfrost.com/blog/mobile/fixed-position/)虽然有些陈旧,而且并没有直接解决你的问题,但对于其他在移动设备上遇到固定定位问题的人来说,可能值得一看。 - Luke
6个回答

14

宽度relativefixed元素、祖先的margin以及与其position属性相关的可继承样式属性中应用不同。

body标签将具有默认的用户代理样式表8像素边距http://www.w3.org/TR/CSS2/sample.html

的宽度为90%,是固定的,没有任何top、left、right或bottom值,将被定位到最近可用的位置,但会继承原始文档/视口的大小,实际上宽度为90%,但定位在10像素的“body”边距偏移处。 要进行测试,请为固定的
添加top:0; left:0;http://jsbin.com/ETAqADu/1/edit

.container 是一个设置为 relative 定位的块级 DIV 元素,它将占用可用父元素宽度的 90%,即 body 的 innerWidth(不包括 X 轴上的 10 + 10 像素边距)。

不希望的结果
逻辑上,header 将比 .container 宽出 20 像素,因为固定定位会将你的元素移出 body 流。

修复方法
通过将父元素(body)的默认边距设置为 0 来控制。

body { margin: 0; }

或者一个小而重的CSS重置,像这样:

/* QuickReset */
*, *::before, *::after { margin: 0; box-sizing: border-box; }

阅读还有CSS Box Model - Margin collapsing

3
优秀的解释。 - davidpauljunior
1
谢谢您先生。非常好的答案和解释! - Colbyd

11

我遇到了类似的问题,只是在移动设备上出现。尽管所有父元素都没有设置边距、边框和填充,但我的固定元素仍然比视口宽,而我又不能使用 width: auto

如果你不想支持IE8及以下版本,可以使用

width: 100vw

我能使用视口单位:vw、vh、vmin、vmax 吗?


1
请注意,此解决方案不适用于移动设备和桌面设备,因为vw包括任何滚动条的大小。因此,如果桌面上有滚动条,则标题仍会比页面上的主体元素宽。但是,它确实适用于移动设备。 - Nicholas Wetmore
1
我找到的解决方案是使用:width: 100%; max-width: 100vw; - Nicholas Wetmore

2
最初的回答是可以的,但在我的情况下,我发现移动设备上的固定标题比页面其他部分宽。这可能是由页脚中某个元素导致的,该元素具有像素宽度(在我的情况下是“width: 750px”),超过了浏览器视口。
如果你想知道页面上的某个元素是否会给你带来问题?只需打开浏览器控制台并删除一些更深层次的元素。在某些时候,你可能会注意到标题再次变为正确的宽度。很可能刚刚删除的元素或其中的某个元素具有比浏览器视口更宽的像素width
在这种情况下的解决方法是要么将该元素设置为较小的宽度,要么使其具有灵活性

1

默认情况下,body 标签有一个边距。
尝试在您的样式表中添加以下内容:

body{
  margin: 0;
}

0

因为position:fixed的行为就像元素从文档中分离出来,放置在文档的最近的左上角,并添加默认的body边距。这就是为什么如果您重置了body的边距,它将占用与第二个div相同的空间。


对于这种情况,您指的是 position: fixed; 而不是 static - Roko C. Buljan

0
如Salaw所提到的,使用body { margin: 0; }将解决问题,因为<body>具有默认的margin/padding(取决于浏览器)。position: fixed;会完全从文档流中移除一个元素,并使其仅相对于视口定位,而position: relative;则不会。
鉴于这一事实,以及width: 90%的意思是“使此元素占用父元素可用空间的90%”,并且fixed元素的父级是视口,而此relative元素的父级是带有margin的,因此您会发现大小上的差异。
请参见http://codepen.io/anon/pen/exzpC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接