水平垂直居中定位的几种方法
水平垂直居中可以分为两类,一类是居中元素宽高已定,一类是居中元素宽高未定。
对于居中元素宽高已知的情况,可以用下列方法:
- position:absolute + margin-top/left: -定位元素宽高一半 + 定位:top: 50%, left: 50%
- position:absolute + margin: auto + 定位: top: 0; right: 0, bottom:0, left:0
- position:absolute + 定位: top/left:calc(50% - 定位元素宽高一半)
对于宽高不一定的情况:可以使用下列方法:
- position: absolute + transform
- line-height
- table-cell + text-align + vertical-align + inline-block
- fllex
- grid
- table
- writing-mode
下面将逐一介绍他们的使用方法和实现原理
居中元素宽高已知
position absolute + 负margin
实现原理:绝对定位都是相对于元素的边缘的,比如top:50%
则是元素的上边缘相对于定位元素的下移50%,同理,我们设置left:50%
的时候则是相对左边缘进行位移
实现关键:
<div class="parent"> <!-- 相对定位的父元素 -->
<div class="content">垂直居中定位的子元素</div>
</div>
.parent{
position: relative;
}
.content{
width: 100px;
height: 100px;
position: absolute;
top: 50%;
left: 50%;
margin-left: -50px; /* 值是宽的一半*/
margin-top: -50px; /* 值是高的一半 */
}
position: absolute + margin auto
实现原理:绝对定位之后设置每个方向的定位都为0,再利用margin:auto
填充各个方向上的间隙,整体就水平垂直居中了
实现关键:
<div class="parent"> <!--相对定位的父元素-->
<div class="content">水平垂直居中的元素</div>
</div>
.parent{
position: relative;
}
.content{
width: 100px;
height: 100px;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
}
position:absolute
+ calc属性
实现原理:利用CSS的Calc属性,直接将元素定位到水平垂直居中位置
关键实现:
<div class="parent"> <!--相对定位的父元素-->
<div class="content">水平垂直居中的元素</div>
</div>
.parent{
position: relative;
}
.content{
position: absolute;
width: 100px;
height: 100px;
top: calc(50% - 50px);
left: calc(50% - 50px);
}
居中元素宽高未知的情况
table-cell
实现原理: 定位为table-cell的子元素有自己的计算规则,可以实现table-cell
实现关键:
<div class="parent"> <!--父元素-->
<!--子元素块-->
<div class="cell">
<div class="content">子元素</div>
</div>
</div>
.cell {
display: table-cell;
text-align: center;
vertical-align: middle;
}
.content{
display: inline-block;
}
position: absolute + transform
实现原理:transform是的百分比是相对于自己宽高来计算的,所以就能配合绝对定位一起实现
实现关键:
<div class="parent"> <!--相对定位的父元素-->
<div class="content">子元素</div>
</div>
.parent{
position: relative;
}
.content{
position: relative;
top: 50%;
left: 50%;
transform: translateX(50%) translateY(50%);
}
lineheight
实现关键:
<div class="parent">
<div class="content-box">
<div class="content">承载内容的子元素</div>
</div>
</div>
.content-box{
lineheight: ;/*父元素的高*/
vertical-align: middle;
text-align: center;
}
.content{
display: inline-block;
}
flex
flex是现代化的布局系统,在移动端的兼容性很好
实现示例:
<div class="parent">
<div class="content">承载内容的子元素</div
</div>
.parent{
display: flex;
justify-content: center;
align-items: center;
}