【问题标题】:CSS position:fixed without top gives unexpected layout?CSS position:fixed without top 给出了意想不到的布局?
【发布时间】:2015-12-04 07:27:06
【问题描述】:

给定:

   <body>
     <div id="fixed">
       Fixed div
     </div>
     <div id="nonfixed">
       <p>Non-fixed div</p>
       <p>Non-fixed div</p>
       <p>Non-fixed div</p>
     </div>
 </body>

还有:

* { box-sizing: border-box; }

body {
    margin: 0;
    padding: 0;
 }

#fixed {
    position: static;
    width: 100%;
    border: 3px solid #f00;
}
#nonfixed {
    margin-top: 50px;
    border: 3px solid #00f;
}     

注意position:static,这给出了预期的结果(fiddle):

但是,将position:static 更改为fixed,你就会得到这个(fiddle)

即使#fixed div 不在#nonfixed 内,它也占据了#nonfixed 的上边距。这在 Chrome 和 Firefox 中都会发生。奇怪的是,两个浏览器中的开发工具都没有显示有任何边距的#fixed div,所以很明显它的定位就像它被固定在#nonfixed div 中一样

如果我将 top:0 添加到 #fixed 规则集,则 div 将返回到窗口的顶部,但它不应该出现在顶部(即正常流动的位置,但不影响其他元素)在没有top 规范的情况下?

为了完整性:position:relative 产生与static 相同的结果,absolute 看起来与fixed 相同。

我在规范中找不到任何直接说明为什么绝对定位的元素应该相对于后续兄弟定位的任何内容。事实上,阅读我找到的规范(强调我的):

10.6.4 Absolutely positioned, non-replaced elements

...

如果 'top'、'height' 和 'bottom' 三个都是自动的,将 'top' 设置为静态位置并应用下面的第三条规则.

...

  1. 'height' 和 'bottom' 是 'auto' 而 'top' 不是 'auto',则高度基于 10.6.7 的内容,为 'margin-top' 和 '设置 'auto' 值margin-bottom' 为 0,并求解 'bottom'

这似乎表明#fixed 框确实应该在视口的顶部。

由于 FF 和 Chrome 都做同样的事情,我猜它应该以这种方式工作,但我想知道为什么。谁能根据规范解释这种行为?

【问题讨论】:

标签: html css css-position


【解决方案1】:

你会注意到“固定”的 div 实际上在 body 的顶部,其位置和大小与“非固定”的 div 相匹配。

这肯定是由于bodydiv#nonfixed 折叠的顶部边距。见http://www.w3.org/TR/CSS21/box.html#collapsing-margins

8.3.1 折叠边距

在 CSS 中,两个或多个框的相邻边距(可能或 可能不是兄弟姐妹)可以组合形成一个边距。边距 据说以这种方式组合会崩溃,并且由此产生的组合 边距称为折叠边距。

(...)

两个边距相邻当且仅当:

  • 两者都属于参与相同的流内块级框 块格式上下文
  • 没有线框、没有间隙、没有填充和 没有边框将它们分开(请注意,某些零高度行框(请参阅 9.4.2) 为此目的而被忽略。)
  • 两者都属于垂直相邻的框边,即形成以下对之一:
    • 框的上边距和第一个流入的上边距
    • (...)

top相对于包含块,显然不是body而是html(根元素)。

【讨论】:

  • 所以如果我理解正确的话: 1) fixed div 被取出来了; 2) nonfixed 的上边距然后与其包含框的边距一起折叠(htmlbody);并且,至关重要的是,3) 折叠边距 (max(0,50)) 被定义为 包含块 的属性,而不是 nonfixed。这会导致 fixed 根据新的上边距布局。这真的是违反直觉的。但我也认为 CSS 布局模型存在不可挽回的缺陷,因为它无法在没有 Javascript 帮助的情况下表达许多常见的布局场景。
  • 这是一个合理的答案,有助于理解问题...downvoter 愿意发表评论吗?
  • 来自规范的“折叠边距”部分:“如果元素的边距与其父级的上边距一起折叠,则框的上边框边缘被定义为与父母的。” 我不能解释为父母的边距得到折叠的值。
  • 好吧,如果顶部边缘相同,但仍有余量,则它需要在某个地方。边距仍然属于子元素,但会影响父元素的布局。
  • 这很奇怪,完全违反直觉。我有排版背景(从 80 年代开始)并且知道页面布局是一个难题,但 CSS 似乎特别古怪并且充满了“意想不到的后果”。
猜你喜欢
  • 2022-01-07
  • 2018-10-28
  • 2019-05-19
  • 2017-01-05
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多