在CSS方面我很精通,但今天我偶然发现了一个让我头疼的片段(
here和
here).
我从来没有想过可以通过margin来定位一个绝对定位的元素:0 auto,但是给定的元素有一个设置的宽度,左边是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)
我一直以为左:0和右:0将决定元素的宽度(它的第一个相对定位的父元素的100%),但是它似乎宽度优先于此,因此使margin = 0自动工作.
解决方法
这在CSS2.1规范的
section 10.3.7中占了一席之地:
The constraint that determines the used values for these elements is:
‘left’ + ‘margin-left’ + ‘border-left-width’ + ‘padding-left’ + ‘width’ + ‘padding-right’ + ‘border-right-width’ + ‘margin-right’ + ‘right’ = width of containing block
如果三者都不是“自动”:如果“margin-left”和“margin-right”均为“auto”,则在额外的约束下解决方程,即两个边距获得相等的值[…]正如你所看到的那样,两边的自动边距对于绝对定位的元素,对于未定位的块级元素,行为相同,前提是左和右偏移量以及宽度不是自动的.
有趣的是,仅针对绝对定位的元素this applies to
top
,height
andbottom
as well,这基本上意味着可以使用自动边距垂直居中一个绝对定位的元素.再次提到,上述三个属性不是自动的,并且相应的边距是自动的. (在你的情况下,这意味着margin:auto而不是margin:0 auto,因为后面的值为零).