【问题标题】:Why is a div with "position: absolute" not by default relative to the document?为什么默认情况下具有“位置:绝对”的 div 不相对于文档?
【发布时间】:2013-02-27 11:58:44
【问题描述】:

我认为一个通用规则是,每当一个 div fooposition: relative,那么如果父级和祖先都没有任何非静态 position(所以需要有一个 relative, absolute, or fixed),然后,div foo 现在将相对于整个文档的位置。

但在以下页面中:

http://jsfiddle.net/4RcEn/6/

<div id="box1"></div>
<div id="box2">
    <div id="box3">some text inside some text</div>
</div>

<style>
  #box1 { width: 300px; height: 100px; background: #ffd; margin-left: 60px }
  #box2 { width: 300px; height: 100px; background: #fa0; margin-left: 60px }
  #box3 { width: 100px; height: 80px; background: #af0; position: 
          absolute; left: 20px;  }
</style>

box3 实际上的行为是这样的:left20px 并且相对于文档,但 topauto(默认情况下),实际上是相对于 容器div。只有当top 设置为00px 或其他值时,它才相对于文档。这是什么规则?

P.S. 使用规范中的规则,我没有看到这样的规则:如果未指定 topleft,则行为是这样那样的。所以这是一个事实上的标准,如果不指定,那么如果没有“包含块(定义为非静态定位块),那么它就不会相对于“初始块”?

【问题讨论】:

  • 这是什么规则? Newton's First Law
  • 关于您的编辑,我编辑了自己的答案以引用此:w3.org/TR/CSS21/visuren.html#comp-abspos。在这里,规范松散地提到了如果附近没有定位元素,则该元素应相对于其容器进行定位。我想这仅适用于值为auto 时,但我不相信它提到它应该只适用于那时。如果指定了一个值,正如您所提到的,它似乎将自己定位到文档中。

标签: css


【解决方案1】:

相对于文档定位(这就是 top: 0 将其一直移动到顶部的原因),但如果您不将 top 设置为任何值(即您将其保留为auto),则该框没有理由从其静态位置(如果您没有设置position: absolute,它通常会坐在那里)移动任何地方。

另请参阅规范的 this answer 和部分 9.310。尤其是第 10 节,它包含管理静态定位的所有规则,如果不是过于技术性的话,也是相当全面的阅读。

在这种情况下,元素应保持在静态位置的确切规则在 10.6.4 部分。在您的场景中,您没有设置topbottom,但您确实设置了height,因此列出的六个规则中的第二个适用:

2。 'top' 和 'bottom' 是 'auto' 而 'height' 不是 'auto',然后将 'top' 设置为静态位置,将 'margin-top' 和 'margin-bottom' 的 'auto' 值设置为 0 ,并求解“底部”

因此,如果top 没有被赋予除auto 以外的其他值,那么绝对定位的元素需要保持在其正常的静态垂直位置——它不应该任意移动自己。

此外,绝对定位元素的包含块总是要么是它最近的定位祖先(如果有的话),要么是初始包含块。

【讨论】:

  • 盒子有“没有理由移动”?听起来有点滑稽的解释……正式的规则是什么?
【解决方案2】:

div3 是从 body 计算的,而不是从 div2 计算的。因为你没有指定 div 的“顶部”位置而不是 div3 从 div2 获得“顶部”并使你的顶部与 div2 的顶部相同。当您添加属性“顶部:0px;”到 dov3 然后你会看到 div3 在哪里以及从哪个元素影响了 div3 的位置。

【讨论】:

    【解决方案3】:

    来自top attribute in the CSS 2.1 specification上的注释:

    此属性指定绝对定位框的上边距边缘在框的包含块的上边缘下方偏移多远。对于相对定位的盒子,偏移量是相对于盒子本身的顶部边缘(即,盒子在正常流程中被赋予一个位置,然后根据这些属性从该位置偏移)。

    对我来说,这意味着如果没有指定top,那么该框将定位到其“自然”容器(其父级)的顶部。当top 指定它然后偏移到最近的祖先与relativeabsolute 定位(我假设htmlbody 默认具有)。

    then goes on to say:

    ...这会导致外框的顶部相对于其包含块进行定位。定位框的包含块由最近的定位祖先建立(或者,如果不存在,则为初始包含块,如我们的示例所示)。

    【讨论】:

    • 定位方案要复杂得多,但它基本上归结为“包含块”的定义与它似乎暗示的不同 - w3.org/TR/CSS21/visuren.html#containing-block
    • 我已经编辑了我的帖子。它确实继续提到它是如何定位到最近的定位祖先的,或者如果不存在,最初的包含块。我想这里的 auto 值通过定位到它的容器来遵守这个规则,但是当一个值被指定时,它会相对于主体本身定位自己 - 我想这在不同的浏览器中会有所不同。
    • 初始包含块通常是视口所在的位置,并且可以与视口进行比较,但通常它是根元素 html 的容器(而 htmlbody 每个生成自己的盒子)。此外,这不应因浏览器而异,因为该规范有一整节专门用于浏览器应遵循的框计算(第 10 节)。我也编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    相关资源
    最近更新 更多