首页 > 代码库 > 垂直居中
垂直居中
不得不说,对于前端而言,垂直居中似乎成了一道迈不过去的坎,每一个前端基本上都踩过类似的坑,每一个前端博主的文章中似乎都有这么一篇关于垂直居中的文章。
我也不能免俗,就试试看自己能写出几种垂直居中的方案吧(完全css方案,不使用任何js配合)!
为了显示效果能更方便观察,首先清除整个浏览器的所有默认样式,简单起见,直接使用通配符清除。
*{ margin: 0; padding: 0; }
1、应该属于最简单的一类,利用对内联标签设置行高的方式
<div class="center1"> <p> 垂直居中,似乎是每一个前端都面对过的比较棘手的问题。 </p> </div>
后面如果没有重写html标签,默认使用该结构,仅仅将div的class一句序号替换一下,以方便一一对应。
css样式:
.center1{ width: 400px; height: 200px; background: pink; line-height: 200px; text-align: center; margin: 1em; } .center1 > p{ width: 200px; display: inline-block; vertical-align: middle; line-height: 1.5; background: #ccc; text-align: left; }
这里对内部标签p设置display:inline-block;使其在一定程度上具有内联标签的特性,对父元素div设置text-align:center;使其水平方向居中,line-height:200px;利用的是单行文本垂直居中的原理。
2、通过设置父元素的display:box盒模型
.center2{ margin: 1em; width: 400px; height: 200px; background: pink; display: -webkit-box; -webkit-box-align: center; -webkit-box-pack: center; } .center5>p{ width: 200px; background: #ccc; }
利用盒模型设置居中,box-align: center; 垂直居中, box-pack: center; 水平居中。
3、通过设置父元素的display:flex,就是我们常说的flex布局,在一定程度上这个方案应该会成为以后的主流方案。
.center3{ margin: 1em; width: 300px; height: 200px; background: pink; display: flex; align-items: center; justify-content: center; } .center3>p{ width: 200px; background: #ccc; }
justify-content: center;定义了子元素在主轴方向上的居中对齐;align-items: center; 子元素在交叉轴方向上的居中对齐。
4、还是display的方案,模拟表格的居中对齐的方式
.center4{ margin: 1em; width: 400px; background: pink; display: table; } .center4>p{ background: #ccc; display: table-cell; vertical-align: middle; }
这种对齐方式就很像table布局的对齐方式,文本较长的时候水平居中会产生各种问题。
5、下面几个是通过使用定位,来达到垂直居中的目的的。
.center5{ width: 400px; height: 200px; background: pink; position: relative; margin: 1em; } .center5>p{ background: #ccc; position: absolute; left: 10%; right: 10%; top: 10%; bottom: 10%; }
可以达到子元素四边都距离父元素10%的距离。
6、已知子元素大小的情况下,可以通过margin的负值,达到刚刚好居中对齐的方式
.center6{ width: 400px; height: 200px; background: pink; position: relative; margin: 1em; } .center6> p{ width: 200px; height: 100px; background: #ccc; position: absolute; left: 50%; margin-left: -100px; top: 50%; margin-top: -50px; }
通过绝对定位50%,然后margin负值自身的一半刚好达到居中的目的。
7、一个意向不到的属性,变形transform属性,这也应该成为一种主流方式。
.center7{ width: 400px; height: 200px; background: pink; position: relative; margin: 1em; } .center7> p{ background: #ccc; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); }
通过调整translate的值达到居中的目的。
就我个人而言,display:table的方式很少会用到,其他的视项目需求决定用哪种方式。我比较喜欢的是2、3、7三种方案。
垂直居中