关于CSS水平垂直居中的布局,很多场景中都会用到,而且面试中也基本都是必考题。
于是就有了这篇文章,一方面根据自己所学巩固一下记忆,另一方面也能收集一些自己未曾了解到的解决方案,温故而知新。
如非特别声明,以下CSS布局全以以下html结构为准
1 2 3
| <div class="wrapper"> <div class="box"></div> </div>
|
使用绝对定位
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| .wrapper { position: relative; width: 300px; height: 300px; background: aqua; }
.box { position: absolute; width: 100px; height: 100px; background: skyblue; }
|
一种方案是给父级元素添加相对定位,子元素设置固定定位 top
值和 left
值为 50%
;然后设置 margin-top
和 margin-left
值为宽度负值的一半:
1 2 3 4 5 6
| .box { top: 50%; left: 50%; margin-top: -50px; margin-left: -50px; }
|
使用CSS的calc函数:原理同上,通过calc函数计算得到子元素 top
值和 left
的 50%
减去子元素宽高的一半
1 2 3 4
| .box { top: calc(50% - 50px); left: calc(50% - 50px); }
|
另一种方案是设置子元素各个方向距离都为0,再使用margin: auto
外边距设为自适应
1 2 3 4 5 6 7 8
| .box { top: 0; right: 0; bottom: 0; left: 0; margin: auto; background: skyblue; }
|
弹性盒布局
- 弹性盒布局的好用之处在于使用非常方便,只需指定父元素
display: flex
即可,下面来看看使用flex的处理方案
1 2 3 4 5
| .wrapper { display: flex; justify-content: center; align-items: center; }
|
短短三行CSS代码,即可完成元素水平垂直方向居中,当然flex布局的强大不止于此,日后我会整理一篇关于详细应用flex布局的文章,这里就不再赘述
Grid 网格布局
- grid布局同样是很优秀的一种布局方案与flex布局有许多相似之处,但只支持高版本浏览器,兼容性不如flex,grid布局处理元素水平垂直居中,同样只需要三行代码:
1 2 3 4 5 6 7 8
| .wrapper { display: grid; }
.box { align-self: center; justify-self: center; }
|
表格布局
- 如果只是为了水平垂直居中一个元素而使用table来实现,未免太闲了,这里要用到的是css的
display: table
属性,设置子元素为行内块元素,并设置父元素为table布局,再设置子元素水平方向和垂直方向居中即可
1 2 3 4 5 6 7 8 9
| .wrapper { display: table; vertical-align: middle; text-align: center; }
.box { display: inline-block; }
|
结语
目前我所知道的关于CSS实现元素水平垂直方向居中的方案就是这些,如果您也有比较好的方案欢迎通过留言提出来,我会整理到文章中,感谢您的分享