css中有好多实现居中的方式,在项目中常常不知道使用哪一种方式会比较好,因此记录下来。
复制代码
水平垂直居中包括行内元素居中,以及块级元素居中css
行内元素html结构html
<div class="outer">
<span class="inner"></span>
</div>
复制代码
块级元素结构git
<div class="outer">
<div class="inner"></div>
</div>
复制代码
基础样式github
<style>
.outer {
width: 400px;
height: 400px;
border: 1px solid red;
}
.outer .inner {
width: 50px;
height: 50px;
border: 1px solid blue;
}
</style>
复制代码
.outer {
text-align: center;
}
复制代码
当使用这种方式时,内部元素必须定义宽度,否则margin属性会无效浏览器
.outer .inner {
margin: auto;
}
复制代码
前面这种方式须要为内部元素定义宽度,若是不想定义宽度,能够设置内部元素的display 为 table,它的宽度会由内部元素来撑开。bash
.outer .inner {
margin: auto;
display: table;
}
复制代码
为内部元素设置display 为inline,将它转换为行内元素,再对父元素使用text-align: center 能够实现水平居中,缺点就是内部元素没法设置宽度。flex
.outer {
text-align: center;
}
.outer .inner {
display: inline;
}
复制代码
方案三没法为内部元素设置宽度,可是采用inline-block,则能够为内部元素设置宽度。flexbox
.outer {
text-align: center;
}
.outer .inner {
display: inline-block;
}
复制代码
这种方式不须要知道内部元素宽度。spa
.outer .inner {
position: relative;
left: 50%;
transform: translateX(-50%);
}
复制代码
.outer {
position: relative;
}
.outer .inner {
position: absolute;
left: 50%;
margin-left: -25px;
}
复制代码
用的最多的方式,但低版本浏览器会有兼容问题
复制代码
.outer {
display: flex;
justify-content: center; // 主轴上居中
}
复制代码
外部元素设置line-heightcode
.outer {
line-height: 400px;
}
复制代码
使用绝对定位将内部元素的顶部定位在中间,再经过margin-top 负值拉回高度,须要提早知道内部元素的高度
.outer {
position: relative;
}
.outer .inner {
position: absolute;
top: 50%;
margin-top: -25px;
}
复制代码
这种方式不须要知道内部元素的高度,兼容性也很好
.outer {
position: relative;
}
.outer .inner {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
}
复制代码
前面水平居中的时候也出现过这种方式,也能够使用position: absolute方式,但要对应地将外部元素设置成position: relative
.outer .inner {
position: relative;
top: 50%;
transform: translateY(-50%);
}
复制代码
.outer {
display: table-cell;
vertical-align: middle;
}
复制代码
原理是新建一个inner的兄弟元素,高度撑开整个容器,再对inner使用vertical-align: middle 使元素居中,不须要知道内部元素的高度
html结构
<div class="outer">
<div class="inner"></div>
<div class="sibling"></div>
</div>
复制代码
.outer .inner {
vertical-align: middle;
display: inline-block;
}
.outer .slibing {
height: 400px;
display: inline-block;
vertical-align: middle;
}
复制代码
原理和上面的方式同样,只是经过伪元素去撑开高度
.inner {
display: inline-block;
vertical-align: middle;
}
.outer::before {
content: '';
height: 100%;
display: inline-block;
vertical-align: middle;
}
复制代码
.outer {
display: flex;
align=items: center;
}
复制代码
欢迎继续补充~