大家都知道position
设置为absolute
以及float
定位会使元素脱离正常流,如果父元素没有设置高度的话,他们不会把父元素的高度撑开。对于float元素可以把父元素设置overflow:hidden
或者其他可以为父元素创建BFC的方法来解决这个问题,但是为什么对于绝对定位的元素这些办法行不通呢?求指教
大家都知道position
设置为absolute
以及float
定位会使元素脱离正常流,如果父元素没有设置高度的话,他们不会把父元素的高度撑开。对于float元素可以把父元素设置overflow:hidden
或者其他可以为父元素创建BFC的方法来解决这个问题,但是为什么对于绝对定位的元素这些办法行不通呢?求指教
position
为absolute
的元素是相对于离他最近的position
不为static
的父级元素定位的,它不会占据父元素的空间,所以也不会撑起父级元素,这点和设置float
的元素不一样,唯一的办法是给父级元素设置高度。
position
没有float
的设定吧?只有说把元素float
设定为left
还是right
。
我的理解是,float
虽然脱离正常流,但还在父元素之内,但是绝对定位的话,是完全脱离正常流且脱离父元素了,你把left
设为0
,top
设为0
,就知道,已经跑到页面的左上角去了。
10 回答11.1k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
5 回答1.9k 阅读
W3C标准的算法里,
float
可能参与父级高度计算,但position:absolute;
始终不参与父级计算。就是这样设计的,没辙:W3C CSS2.1 10.6.3规定了未创建BFC的非替换块级元素的高度计算规则:
如上述分点,分项1定义了line-box撑高容器,分项2和3定义了常规流块级元素撑高容器(margin折叠与否的两种情况),否则为0。
W3C CSS2.1 10.6.7规定了创建了BFC的元素(block formatting context roots)的高度计算规则:
这里规则大致跟上方一样,不同点在于margin不再折叠和float高度参与计算。
总之呢,在“撑高父容器圈”里面没有绝对定位元素的地位。