参考文章:relative 和 absolute 元素的百分比定位、CSS进阶——绝对定位元素的宽高是如何定义的
一、设置top、right、bottom、left的值为百分比
如果没有设置top、right、bottom、left
,他们默认值是auto
,默认是在静态位置
- 相对定位
relative
相对定位是按照父盒子的content-box
进行计算,不论父盒子是否设置定位,子盒子都按照父盒子content-box
来计算 - 绝对定位
absolute
绝对定位是按照父盒子的padding-box
进行计算,绝对定位元素的包含块是由其最近的position
属性设置为relative
、absolute
或fixed
的祖先元素,如果绝对定位元素的所有祖先元素的position属性都没有设置relative
、absolute
或fixed
,则其包含块为初始包含块。
初始包含块不是html元素,也不是body元素,而是当前视口,这一点很容易弄错
二、绝对定位元素宽高计算
以宽度为例,高度同理
left
+margin-left
+border-left-width
+padding-left
+width
+padding-right
+border-right-width
+margin-right
+right
=width of containing block
left
、width
、right
默认值是auto
,margin-left
、margin-right
默认值是0
如果设置了计算出来的值大于了包含块的宽度,则right被忽略。具体规则参考如下:
1表示设置得有具体值
left | width | right | 布局 |
---|---|---|---|
1 | 1 | 1 | ① 如果margin-left和margin-right都为auto,此时二者相等,则按照上述方程计算出对应的margin值;如果此时计算出来的margin值为负值,则设置margin-left为0,然后根据方程再计算出margin-right的值。 ② 如果margin-left、margin-right中有一个为auto,则按照方程计算出这个值; ③ 如果margin-left、margin-right都设置了值,且导致方程左右不相等,则忽略right值。 |
auto | auto | auto | 把margin-left和margin-right为auto的设置为0;把left设置为静态位置的left值;宽度自适应:margin-right边缘最远到right为0的位置(如果margin-right为0,则取border-right边缘,如果border-right-width也为0,则取padding-right边缘,下同 |
1 | auto | auto | 把margin-left和margin-right为auto的设置为0;宽度自适应:margin-right边缘最远到right为0的位置 |
1 | auto | auto | 把margin-left和margin-right为auto的设置为0;宽度自适应:margin-right边缘最远到right为0的位置 |
auto | auto | 1 | 把margin-left和margin-right为auto的设置为0;宽度自适应:margin-left边缘最远到left为0的位置 |
auto | 1 | auto | 把margin-left和margin-right为auto的设置为0;把left设置为静态位置的left值; |
1 | 1 | auto | 把margin-left和margin-right为auto的设置为0;从左至右按照各属性值布局 |
auto | 1 | 1 | 把margin-left和margin-right为auto的设置为0;从右到左按照个属性值布局 |