【问题标题】:Why does "position: absolute; left: 0; right: 0; width: XYpx; margin: 0 auto" actually center?为什么“位置:绝对;左:0;右:0;宽度:XYpx;边距:0 auto”实际上居中?
【发布时间】:2015-05-29 11:22:22
【问题描述】:

我非常精通 CSS,但今天我偶然发现了一个让我头疼的 sn-p(here 和 here)。

我从没想过可以通过margin: 0 auto 将绝对定位的元素居中,但考虑到有问题的元素有固定的宽度并且有left: 0 和right: 0,它实际上似乎工作:

#parent
{
    background: #999;
    height: 300px;
    position: relative;
    width: 300px;
}

#child
{
    background: #333;
    height: 50px;
    left: 0;
    margin: 0 auto;
    position: absolute;
    right: 0;
    width: 50px;
}
<div id="parent">
    <div id="child"></div>
</div>

(JSFiddle)

我一直认为 left: 0 和 right: 0 将决定元素的宽度(它是第一个相对定位的父元素的 100%),但似乎 width 在这里优先,因此使 margin: 0 auto 起作用。

这是定义的行为吗?我可以在任何规范中找到有关它的信息吗?我用谷歌搜索了一下,但没有找到任何有用的东西。

【问题讨论】:

标签: html css


【解决方案1】:

这在 CSS2.1 规范的 section 10.3.7 中得到了说明:

确定这些元素使用值的约束是:

'left' + 'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' + 'right' = 包含块的宽度

如果三个都不是'auto':如果'margin-left'和'margin-right'都是'auto',在两个边距相等的额外约束下求解方程[。 ..]

如您所见,如果left 和right 以及@987654325 偏移,绝对定位元素两侧的自动边距与非定位块级元素的行为相同@,不是自动的。

有趣的是,仅适用于绝对定位元素this applies to top, height and bottom as well,这实质上意味着可以使用自动边距将绝对定位元素垂直居中。同样,前提是上面的三个属性不是自动的,并且各自的边距是自动的。 (在您的情况下,这意味着 margin: auto 而不是 margin: 0 auto,因为后者会将垂直边距归零。)

【讨论】:

  • 这是标准答案!
  • 感谢您指出规范。浏览了一遍,但不知道要寻找什么。
【解决方案2】:

left 和 right(以及 top 和 bottom)属性不定义宽度本身,而是定义相对边距相对于父级各自一侧的偏移量。

在定义宽度不存在且偏移量声明为零的情况下,宽度是根据偏移量计算的。

为块指定宽度或高度可防止块占用所有可用空间并强制浏览器计算边距:基于新边界框的自动

MDN - 在“顶部”...这同样适用于其他属性。

对于绝对定位的元素(位置:绝对或位置:固定),它指定元素的上边距边缘与其包含块的上边缘之间的距离。

Smashing Magazine Article with more detail

感谢 j08691 提供链接

【讨论】:

  • (链接首先来自j08691留下的评论)
  • 已相应更新,因为另一个现已被删除。
  • “在没有定义宽度的情况下”在这种情况下,偏移量被声明为零,因此宽度是根据偏移量计算的,而不是相反。因此“自动”宽度。
  • 很好的答案,很难选择在哪里设置刻度。
  • @maryisdead 我会把它交给 BoltClock(我看到你有)。他帮助改进了我的答案。
猜你喜欢
  • 2015-06-13
  • 2012-08-27
  • 2011-02-09
  • 2015-03-20
  • 2015-10-27
  • 2019-05-10
  • 2023-03-28
  • 2018-09-29
  • 2015-10-16
相关资源
最近更新 更多