【问题标题】:A div with relative position over a div float相对位置高于 div 浮点数的 div
【发布时间】:2015-12-28 01:31:21
【问题描述】:

我不明白为什么当最后一个被声明时,具有左右浮动的 div 不高于具有相对位置的 div 或用背景颜色定义的 div。

这里是html:

<html>
<body>
    <div class="container">
        Main container <br/><br/>

        <div class="header">This is the header</div>
        <div class="text-right">Right text</div>
        <div class="footer">This is the footer</div>
    </div>
</body>

这里是css:

.header {
    background-color:blue;
    border: solid;
    color: white;
    border-color:black;
    height: 100px;
}

.text-right{
    float: right;   
    border: solid;
    background-color: green;
}

.container{
    padding: 10px;  
    border: solid;
}

.footer{
    padding-top: 50px;
    border: solid;
    background-color: yellow;
    position: relative;
}

我知道我可以使用 .clear: both 规则来纠正这个问题,但我的主要观点是:为什么当我在 .footer 规则中设置背景颜色或位置或两者时,浮动 div 在页脚?

非常感谢!

【问题讨论】:

标签: css html position css-float


【解决方案1】:

在阅读这篇非常好的post时,作者在帖子的最后谈到了z-order内部工作,但也说如果你想了解更多,this next one will be a much more detailed article

关键是元素在z轴上的排列顺序。

作者是这样说的:

如果我们不指定任何 z-index 值,则默认堆叠顺序 从离用户最近到最远的顺序如下:

1. Positioned elements, in order of appearance in source code
2. Inline elements
3. Non-positioned floating elements, in order of appearance in source code
4. All non-positioned, non-floating, block elements in order of source code
5. Root element backgrounds and borders

我们可以看到,定位元素(1)总是在非定位元素(3-4)之上。如果我将 div 与 float 属性放在一起,则该元素将不会“定位”到表面上。

在这种情况下,第二个元素,我的页脚div,使用相对属性值定位将位于前一个元素的顶部,而不仅仅是我没有在@987654331 之后添加clear: both 属性@div属性还是因为最后一个加在浮动元素之后但是因为是定位的!

就像powerbuoy说的,你必须设置添加一个相对于浮动元素的位置,才能将浮动元素放到栈顶。但这还不够。因为这两个元素现在处于同一水平并且因为它们都相互交叉,所以您必须告诉引擎哪个将是第一个,这就是为什么您必须再次将 z-order 设置为 1 到浮动元素,就像说的那样动力浮标。

我不是一个很好的作家,因此,我强烈建议您阅读我之前提到的参考文章。我想你会对这个案子有一个非常深刻的解释。

【讨论】:

  • 很抱歉接受我自己的问题,但我认为这是正确的答案,没有人说相反的答案。
  • ((非常感谢您发布这个详细的答案!))
  • 考虑到jsfiddle.net/wxMhx。嗯,如果将position:relative; 添加到id=text-right,那么id=footer 仍会出现在text-right 上方。虽然浮动元素现在有position: relative,但浮动元素和id=footer 都已定位。那么规则1应该适用吗? -- 然而浮动元素出现在源中first,因此应该堆叠在上方id=footer(根据规则1)在你的例子中,对吧?那么为什么id=text-right 却被footer 隐藏起来,很奇怪。 (删除了 z-index 规则)(Google Chrome 19)
  • 也许在 1,2,3,4,5 列表中应该有另一个条目指定浮动 和 定位元素的位置。在我看来,规则 1 实际上并不适用于他们。
  • 我认为博文的作者 (timkadlec.com/2008/01/detailed-look-at-stacking-in-css) 可能犯了一个错误,或者至少他/她不清楚。如果您阅读 W3C 规范 w3.org/TR/CSS21/zindex.html,您会注意到与规则 1 相对应的内容实际上是:“所有具有 'z-index: auto' 或 'z-index: 0' 的定位后代,在树中order." 但这是东西应该被绘制的顺序,也就是说,源中后面出现的东西,应该被绘制在在的东西之上出现得更早——而且,在源代码中,text-right 在 footer 之前。
【解决方案2】:

由于页脚位于 text-right 之后,它将呈现在 text-right 的顶部。为了避免这种情况,你可以给 text-right 一个 z-index (和一个静态以外的位置):

http://jsfiddle.net/wxMhx/

编辑:嗯……不,这并不完全正确。如果您删除位置:相对;从页脚 text-right 将呈现在它上面。 TBH 我不确定为什么会发生这种情况。但是在这两种情况下的解决方案都是删除 position: relative;从页脚,或将其(以及 z-index)添加到 text-right。

【讨论】:

  • 感谢您的宝贵时间...我在网上阅读了很多并找到了这句话:“所以行为旨在首先浮动它,并影响该位置的其他元素,并且仅然后将其移动到新的移位位置,而不会再次影响其他元素的位置。”。根据您所说,我的理解是,当您放置一个 div 浮动后跟另一个具有相对位置的 div 时,如果设置了背景颜色,最后一个将隐藏前一个。这是一种常见的情况还是我搞砸了什么?
  • 即使没有背景图像 text-right 位于页脚后面,但它仍然可见,因为它顶部没有渲染任何内容。位置:相对我认为是触发分层的原因。恐怕我不知道为什么。但我很想知道。
【解决方案3】:

因为position: relative。如果删除此行,您将看到 div 和 text-right 类。您可以将z-index: -1; 设置为footer 类,这应该也可以。

【讨论】:

  • 谢谢,但就像我在问题中所说的那样,我想知道为什么会发生这种情况,而不是如何解决问题。
猜你喜欢
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多