前言
本篇文章总结了经常遇到的CSS中的相对值,比如em
、rem
等相对单位以及width: 100%
这样的属性值。
属性速查总表
相对于父元素
CSS属性 | 值 | 相对于谁 | 备注 |
---|---|---|---|
font-size |
100% |
相对于父元素的字体大小 | |
font-size |
em |
相对于父元素的字段大小 | |
width |
100% |
相对于父元素的内容区域width |
|
height |
100% |
相对于父元素的内容区域的height |
|
margin |
100% |
相对于父元素的width |
|
padding |
100% |
相对于父元素的width |
|
top 、bottom |
100% |
相对于父元素的高度 | |
left 、right |
100% |
相对于父元素的宽度 | |
相对于自身
CSS属性 | 值 | 相对于谁 | 备注 |
---|---|---|---|
transform: translate() |
100% |
相对于自身 | 水平方向的值相对于自身的宽度,垂直方向相对于自身的高度 |
属性的详细说明
width
和height
无论父元素和子元素的盒模型为何种模型,子元素的
width
的百分比值都相对于父元素内容区域的width
;子元素的height
的百分比值都相对于父元素内容区域的height
。
一般情况下:width
和height
指的是content box
的尺寸。
DOM结构如下:
1 | <div class="father"> |
CSS
样式如下:
1 | .father { |
页面效果如下:
父元素的盒模型为:
子元素的盒模型为:
通过盒模型可以看到:
父元素的
width
为100px
时,子元素的width
为50px
父元素的
height
为100px
时,子元素的height
为50px
如果父元素的盒模型变成了border-box
呢?
当父元素的盒模型变成border-box
时,父元素的width
设置的就是实际宽度,父元素的内容区域宽度则为76px
,高度也为76px
此时子元素的盒模型还是content-box
,此时子元素的width
的值如下所示,为76px * 50% = 38px
,子元素的height
的值为76px * 50% = 38px
如果子元素的盒模型也变成border-box
呢?此时子元素设置的width
的值如下所示,为76px * 50% = 38px
,内容区域的宽度为38px - 2*10px - 2 *2px = 14px
,高度与宽度表现一致。
综上所述,无论父元素和子元素的盒模型为何种模型,子元素的width
的百分比值都相对于父元素内容区域的width
。
margin
和padding
无论父元素和子元素的盒模型为何种模型,子元素的
margin
和padding
的百分比值都相对于父元素内容区域的width
DOM结构如下:
1 | <div class="father"> |
CSS样式如下:
1 | .father { |
当父元素的盒模型为content-box
时,父元素的盒模型如下:
子元素的盒模型如下:
可以看到,当父元素的width
为120px
时,子元素的margin
和padding
均为12px
,可以得知,此时,子元素margin
和padding
是相对于父元素的内容区域宽度width
的。
如果指定父元素的盒模型为border-box
,父元素的盒模型如下:
子元素的盒模型如下:
可以看到,父元素的内容区域width
变成了100px
,子元素的margin
和padding
变成了10px
,可以得知,此时,子元素的margin
和padding
是相对于父元素的内容区域宽度width
的。
如果此时把子元素的盒模型也变为border-box
,子元素的盒模型如下:
可以看到,父元素的内容区域宽度width
还是100px
,子元素的maring
和padding
还是10px
,可以得知,此时,子元素的margin
和padding
是相对于父元素的内容区域宽度width
的
top
和bottom
和left
和right
无论父元素的盒模型为何种,子元素的四个定位值都是相对于父元素的内容区域的
width
和height
。水平方向相对于父元素的width
,垂直方向上相对于父元素的height
。
DOM结构如下:
1 | <div class="father"> |
CSS结构如下:
1 | .father { |
父元素的盒模型为content-box
时,盒模型尺寸如下:
子元素的盒模型为content-box
时,盒模型尺寸如下:
可以看到,子元素设置的定位值left
的百分比计算值为100px
,top
的百分比计算值为100px
。其实这里,就可以得知水平方向定位值的百分比是相对于父元素内容区域的width
,垂直方向定位值的百分比是相对于父元素内容区域的height
。但是因为left
和top
的值设置的都是100px
,此时看不出来left
和top
的值是相对于width
还是height
。
所以,修改一下父元素的尺寸:
1 | .father { |
当把父元素的盒模型更改为border-box
时,父元素的盒模型尺寸如下:
父元素的内容区域width
为96px
,内容区域的height
为106px
。
子元素的盒模型尺寸如下:
可以看到,子元素的left
的百分比计算值为106px
,right
的百分比计算值为96px
。可以得知,无论父元素的盒模型为何种盒模型,子元素的四个定位值都是相对于父元素内容区域的width
和height
。
transform: translate
取值为100%时,水平方向的值相对于自身的宽度,垂直方向的值相对于自身的高度
下面就是一个块级元素垂直居中的例子:
DOM结构如下:
1 | <div class="father"> |
CSS样式如下:
1 | .father { |
当没有设置transform: translate(-50%, -50%)
时,元素的位置如下:
left
和top
定位值取值为50%
时,使得子元素的左上角处于父元素的中心点。此时,只需要再让子元素自身向上移动自身距离的一半,向左移动自身距离的一半,就可以让子元素的中心点和父元素的中心点重合。
border-raduis
background-positon
font-size
取值为100%时,相对于父元素的字体的大小
line-height
本文作者: CoderLeiShuo
本文链接:https://coderleishuo.github.io/lele/42622.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!