1 水平居中
1.1 内联元素水平居中
利用text-align: center
就可以实现在块级元素的内联元素水平居中。此方法对内联元素(inline
),内联块(inline-block
)、内联表(inline-table
),inline-flex
元素水平居中都有效。
核心代码:
1 | .center-text { |
页面效果:
1.2 块级元素水平居中
通过把固定宽度块级元素的margin-left
和margin-right
设为auto
,就可以使块级元素水平居中。
核心代码:
1 | .center-block { |
如下图所示:子元素的宽度为100px
,并没有完全占据父元素的宽度,父元素的宽度减去子元素的宽度就是剩余宽度,将会由左右外边距平分,因此实现了水平方向居中。
页面效果:
1.3 多块级元素水平居中
1.3.1 利用inline-block
如果一行中有两个或两个以上的块级元素,通过设置块级元素的显示类型为inline-block
和父容器的text-align
属性从而使多个块级元素水平居中。
核心代码:
1 | .container { |
页面效果:
细心的你可能会发现当前的效果有一些小瑕疵:三个子元素之间有空隙,且底部没有和父元素的底部对齐。
三个子元素之间的空隙是由于存在换行:
底部没有和父元素的底部对齐,这是因为垂直方向上受到了一个属性默认值的影响,它就是vertical-align
。vertical-aligin
的默认值是baseline
,即内联元素垂直方向上是以基线对齐。所谓基线,就是指小写字母x
的底部。
我们添加一个小写字母x,就能清楚了
1.3.2 利用display: flex
利用弹性布局(flex
),实现水平居中,其中justify-content
用于设置弹性盒子在主轴方向上的对齐方式。
核心代码:
1 | .flex-center { |
页面效果:
使用flex布局不会存在换行导致的空隙
未知宽度的块级元素
2 垂直居中
2.1 单行内联(inline-)元素垂直居中
通过设置内联元素的高度(height
)和行高(line-height
)相等,从而使元素垂直居中。
核心代码:
1 | #v-box { |
页面效果:
如下图所示:选中文字内容,可以看到些行文字的行高刚好占据父元素的高度,从而实现了垂直居中对齐。
其实上面的表述存在问题,父元素真正是由文字的行高撑起来的,因此不用设置父元素高度,直接设置line-height
的值,就可以做到撑开父元素,同时使得单行文字内容居中。
1 | #v-box { |
2.2 多行元素垂直居中
2.2.1利用padding
当没有手动指定父元素高度时,可以利用padding
来进行设置。
核心代码:
1 | .wrapper { |
完整代码:
1 |
|
2.2.2 利用表布局
利用表布局的vertical-align: middle
可以实现子元素的垂直居中。
核心代码:
1 | .center-table { |
页面效果:
2.2.3 利用“精灵元素”
利用“精灵元素”技术实现垂直居中,即在父容器内放一个100%高度的伪元素,让文本和伪元素垂直对齐,从而达到垂直居中的目的。
核心代码:
1 |
页面效果:
2.2.4利用flex布局
利用flex布局实现垂直居中,其中flex-direction: column
定义主轴方向为纵向。因为flex布局是CSS3中定义,在较老的浏览器中存在兼容问题。
核心代码:
1 | .center-flex { |
页面效果:
完整代码:
1 |
|
2.3 块级元素垂直居中
2.3.1 固定高度的块级元素
我们知道居中元素的高度和宽度,垂直居中问题就很简单。通过绝对定位元素距离顶部50%,并设置margin-top
向上偏移元素高度的一半,就可以实现垂直居中了。
核心代码:
1 | .parent { |
2.3.1 利用绝对定位+margin
对子元素开启绝对定位,利用绝对定位和margin
可以实现元素的垂直居中对齐。
完整代码:
1 | <!DOCTYPE html> |
原理:
当子元素开启绝对定位后,垂直方向的top
和bottom
的百分比值相对于父元素的高度,水平方向的left
和right
的百分比值相对于父元素的宽度。
当没有设置top
、left
等值时,元素将处在父元素左上角(子元素的左上角是起始点)
当设置top
为50%
时,也就是让子元素在垂直方向上下移父元素高度的一半,到达父元素垂直方向上的中间位置。
当设置left
为50%
时,也就是让子元素在水平方向上右移父元素宽度的一半,到达父元素水平方向上的中间位置。
最终,子元素的左上角就到达了父元素的中心点,如下图所示:
但是,我们要的是子元素的中心点处于父元素的中心点,而非子元素的左上角处于父元素的中心点。
因此,接下来,要做的就是让子元素的中心点向父元素的中心点移动,直至重合,就可以了。那么该如何做呢?
我们可以让子元素在水平方向上向左移动自身宽度的一半,在垂直方向上向上移动自身高度的一半
如果我们知道子元素的具体大小,例如:
我们通过计算可知本例中的子元素
- 宽度为
200px + 10px*2 = 220px
- 高度为
80px + 10px*2 = 120px
我们便可以让水平方向的margin-left
的值为-110px
,让垂直方向的margin-top
的值-50px
,就可以让子元素的中心点移动到父元素的中心点,从而实现元素水平和垂直居中对齐了。
但如果,有的时候我们并不能直接知道子元素的大小,就算知道,还需要手动计算,非常麻烦。有没有一劳永逸的方法呢?接着往下看
2.3.2 利用绝对定位+平移变换
绝对定位的代码和前面一致,子元素不再通过margin
手动计算,而是采用translate()
。
当translate()
的值为百分比时,它是相对于元素自身的,因此,我们通过让水平方向和垂直方向各平移-50%
即可。
完整代码如下:
1 |
|
本文作者: CoderLeiShuo
本文链接:https://coderleishuo.github.io/lele/24724.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!