题目描述
为什么absolute定位会使margin:0 auto失效?
题目来源及自己的思路
一个小的块套在一个大的块之中
百度说是因为绝对定位的元素脱离了文档流,因此会失效。
但是
我并不能从这句话中读出很强的逻辑性,因此如果想要弄清楚这个问题的原理,我需要进一步分析其中的过程
首先
margin:0 auto,在正常情况下是如何实现居中的?
这基于它的填充规则:
(1)如果一侧定值,一侧auto,则auto为剩余空间大小
(2) 如果两侧均是auto,则平分剩余空间
我们可以看到,它是通过平分剩余空间来实现元素水平居中的
然后
对于absolute元素,它脱离了文档流之后相对于谁定位?如何定位?
我们常常可以看到这样的定义:absolute元素是相对于离他最近的已定位的祖先元素进行定位的,这里的“已定位”指该祖先position的值必须是:relative、absolute、fixed。
可以看到在代码中,out块已经设置了relative,那么in块确实是相对于它定位的。
通过偏移量定位
于是我们给子元素的right和left为0,此时就会发现--margin:0 auto 有效了!
进一步分析
对于一个absolute定位的元素,其左右偏移量设置与否,为什么会影响auto值的计算结果呢?
margin:0 auto
就相当于top和bottom设置为0,left和right设置为autoposition: absolute
会使这个块脱离正常的文档流top: 0; left: 0; bottom: 0; right: 0;
会给这个块提供一个新的边界盒(bounding box)。这种情况下,这个块会填满它的偏移父元素的全部可用空间(偏移父元素:offset parent,指position: relative
的父元素或者是body)width
或者height
会阻止它占据全部可用空间,转而由浏览器根据这个新的边界盒自动计算marginmargin-top
与margin-bottom
值,从而使它垂直居中。