这边第三个div的position是不起作用的,但是但第二个div加上高度就可以,这是为什么?
盒子two
没有提供宽高。
* {
margin:0;
padding:0;
}
.one {
width: 500px;
height: 500px;
margin: 0 auto;
position: relative;
border:2px solid red;
}
.two {
height:100px;
width:100px;
position: absolute;
top: 50%;
border:2px solid green;
}
.three {
position: relative;
top:-50%;
border:2px solid blue;
}
2 回答883 阅读✓ 已解决
4 回答998 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
2 回答2.6k 阅读
1 回答1k 阅读✓ 已解决
2 回答908 阅读✓ 已解决
LZ应该能注意到,如果第三个DIV的
top
值是其他单位的值,它的偏移是有效的吧?所以不是position
不起作用,而是top
不起作用。第一,
top
、bottom
、height
属性的百分比值是相对于包含块的高度计算的。第二,包含块判定方式,见W3help知识库:包含块或W3C。
因此
.three
的包含块是.two
的内容区域content-edge。第三,
position:absolute
的元素有这样的特性:position:absolute
元素的高宽,它的默认值width:auto;height:auto
将导致它自己适应于自己的内容区域。好的,我们可以画出依赖关系了:
.two
的高度——依赖于——>.three
的高度(第3点,默认包裹).three
的偏移量——依赖于——>.two
的高度(第1、2点,包含块计算)这样看似可以得到一个
.three
的偏移量——依赖于——>.three
的高度的结论。实现方式还是跟浏览器有关的,需要看浏览器允不允许这种递归式的计算,
height:auto
参与计算的具体实现方式是怎样的。根据我的测试,IE7能算出来期望的top值,而IE8/9,chrome、safari、firefox则都算出来为0。考虑到IE7以后CSS2.1才正式提出,可能相应标准中已经有阐述了(只是我没有找到)。如果W3C标准中有相应内容的阐述,请不吝指出。
最后,这个是满足不了垂直居中的需求的。你可能需要的是在
.two
上面加上transform:translateY(-50%)
等属性,让它偏移自身高度的一半(或者手动算出这个值,用负margin来做)。