我们都知道,固定宽高的 div 在网页中水平垂直居中很简单,相信大家也很容易的写出来,但是不固定宽高的 div 如何水平垂直居中呢?我们在网页布局,特别是手机等 web 端网页经常是不固定宽高的 div,那么这些 div 如何水平垂直居中呢?这篇文章,我总结一下。
固定宽高水平垂直居中(块级元素)
Demo
<div class="wrap"></div>
.wrap {background-color: greenyellow;position: absolute;left: 50%;top: 50%;width: 200px;height: 100px;margin-left: -100px;margin-top: -50px;}
效果示例
不固定宽高水平垂直居中
注意:这里的”不固定宽高“指的是子元素
△ 方法一:vertical-align: middle(禁IE6、7、8)
<div class="wrap"><div class="centered"></div></div>
.wrap {width: 400px;height: 400px;background-color: greenyellow;text-align: center;vertical-align: middle;display: inline-block;}.wrap .centered {/* 如果子元素是块级元素,需要 display:inline-block; 将其变为行块级元素 */display: inline-block;width: 50%;height: 50%;background-color: #77bbdd;vertical-align: middle;}.wrap::after {content: "";width: 5px;line-height: 400px;background-color: #77bbdd;}
效果示例
△ 方法二:table-cell
<div class="wrap"><div class="centered"></div></div>
.wrap {width: 400px;height: 400px;background-color: chartreuse;display: table;display: table-cell;vertical-align: middle;}.wrap .centered {width: 50%;height: 50%;margin: 0 auto;background-color: burlywood;}
效果示例
△ 方法三:translate() 终极解决方法
<div class="wrap"><div class="centered"></div></div>
.wrap {position: relative;width: 400px;height: 400px;background-color: rgb(163, 240, 236);}.wrap .centered {position: absolute;top: 50%;left: 50%;background-color: greenyellow;width: 50%;height: 50%;-webkit-transform: translateX(-50%) translateY(-50%);-moz-transform: translateX(-50%) translateY(-50%);-ms-transform: translateX(-50%) translateY(-50%);transform: translateX(-50%) translateY(-50%);}
效果示例
CSS 3 不固定宽高水平垂直居中
在父级元素上加入下面 3 行代码,就可以实现子元素水平垂直居中。
/* 子元素水平居中 */justify-content: center;/* 子元素垂直居中 */align-items: center;display: -webkit-flex;
Demo
<div class="wrap"><div class="centered"></div></div>
.wrap {width: 400px;height: 400px;background: greenyellow;justify-content: center;align-items: center;display: -webkit-flex;}.wrap .centered {width: 50%;height: 50%;background: rgb(163, 240, 236);}
效果示例
运用 margin:auto; 进行水平垂直居中
我们可以利用定位的方式,让 margin 上下左右都有足够的空间!那么就可以用 margin:auto; 来实现水平垂直居中了!
Demo
<div class="wrap"><div class="centered"></div></div>
.wrap {width: 100%;height: 100%;}.centered {position: absolute;top: 0;left: 0;bottom: 0;right: 0;width: 50%;height: 50%;margin: auto;background-color: greenyellow;}
效果示例