【CSS】元素居中
- 一、 水平居中
- 1.行内元素水平居中
- (1)text-align
 
- 2.块级元素水平居中
- 2.1 margin
- (1)margin
 
- 2.2布局
- (1)flex+ justify-content(推荐)
- (2) flex+margin
- (3)grid+ justify-content
- (4)grid+ margin
- (5)table+margin
 
- 2.3 定位
- (1)absolute+translate+left
- (2)absolute+margin
- (3)absolute+负margin+left(定宽)
- (4)relative + 负margin(定宽)
 
- 2.4 其他方法
- (1)转行内元素inline-block+text-align
- (2)浮动元素:margin
- (3)浮动元素:relative
 
 
 
- 二、 垂直居中
- 1.行内元素水平居中
- (1)line-height=height
 
- 2.块级元素垂直居中
- 2.2布局
- (1)flex+ align-items
- (2)flex+ margin
- (3)grid+ align-content
- (4)table-cell+vertical-align+inline-block
 
- 2.3 定位
- (1)absolute+translate+top
- (2)absolute+负margin+left(定宽)
 
 
- 3.垂直水平居中
- 3.1布局
- (1)flex+ align-items+justify-content
- (2)flex+ margin
- (3)grid+ place-items
- (4)table-cell+text-align+vertical-align
 
- 3.1定位
- (1)absolute+translate+left+top
- (2)absolute+负margin+left+top(定宽)
 
 
 
每每用到居中,总会头疼于css的编写,想着一定要找个时间好好整理一番:
 整理的过程中发现很多拼拼凑凑的属性都能实现居中,其实掌握通用的几个就行,一般都比较推荐flex布局,绝对定位在项目中也常有见到,大部分水平和垂直居中分别掌握了,水平垂直居中就是合并在一起,简单的做了个图
 (代码部分可以用菜鸟工具在线运行查看:https://c.runoob.com/front-end/61/)

一、 水平居中
1.行内元素水平居中
(1)text-align
(1)块级元素使用text-align: center,使得块级元素文本内容水平居中
(2)块级元素使用text-align: center,使得包含在块级元素的行内元素或行内块元素居中对齐
(3)块级元素下使用text-align: center,包含在其中的块级元素不能居中对齐
<div class="div1">
  <p class="p1">块级元素内块级元素文本内容水平居中</p>
  <span class="span1">块级元素内行内元素或行内块元素水平居中</span>
  <p class="p2">块级元素内块级元素本身不能水平居中</p>
  <p class="p2">但块级元素内块级元素继承了文本内容水平居中</p>
</div>
.div1{
  width:80%;
  border:10px solid green;
  text-align:center;
}
.p1{
  background-color:red
}
.span1{
 background-color:yellow  
}
.p2{
  background-color:grey;
  width:80%
}

2.块级元素水平居中
2.1 margin
(1)margin
块级元素上margin:0 auto (必须设置宽度width)
 适合单个块级元素
 <div class="div1">
   <p class="p1">块级元素利用margin水平居中</p>
</div>
.div1{
   width:90%;
  border:10px solid red;
 
}
.p1{
  background-color:grey;
  width:90%;
  margin:0 auto;
}

2.2布局
(1)flex+ justify-content(推荐)
块级元素父元素上:
 display:flex
 justify-cointent:center
 (可实现多个块元素同行居中)
<div class="div2">
	 <p class="p2">块级元素利用flex+justify-content水平居中</p>
</div>
.div2{
  width:90%;
  border:10px solid blue;
  display:flex;
  justify-content:center;
}
.p2{
 width:90%;
 background-color:grey;
}

(2) flex+margin
父元素: display:flex
 子元素: margin:0 auto
 (可实现多个块元素在一行中水平居)
<div class="div3">
    <p class="p3">块级元素利用flex+margin水平居中</p>
</div>
.div3{
  width:90%;
  border:10px solid purple;
  display:flex;
}
.p3{
 width:90%;
 background-color:grey;
 margin:0 auto
}

 felx+margin此方法还可实现多个块元素在一行中水平居中
<div class="div3">
    <p class="p3">块级元素利用flex+margin水平居中</p>
    <p class="p3">块级元素利用flex+margin水平居中</p>
    <p class="p3">块级元素利用flex+margin水平居中</p>
</div>
.div3{
  width:90%;
  height:20%;
  border:10px solid purple;
  display:flex;
}
.p3{
  background-color:grey;
   border:1px solid yellow;
  margin:0 auto
}

(3)grid+ justify-content
(4)grid+ margin
将方法(1)(2)中flex改为grid即可实现
 此方法不能多个块元素一行居中
(5)table+margin
将方法(2)中flex改为table即可实现
 此方法不能多个块元素一行居中
2.3 定位
(1)absolute+translate+left
父元素相对定位:position:relative;
 子元素绝对定位:
 position:absolute;
 left:50%;
 transform:translate(-50%,0);
 其中: left:50%子元素以它自己的左边为基准,向右平移了父元素宽度的50%,此时子元素的左边基准在中间位置,整体子元素偏右
 transform:translate(-50%,0);(子元素向左平移自己宽度的一半)
 transate参考:https://blog.csdn.net/weixin_42154189/article/details/109714379
 <div class="div6">
	 <p class="p6">块级元素absolute+translate水平居中</p>
</div>
.div6{
  width:90%;
  height:20%;
  border:10px solid orange;
  position:relative;
}
.p6{
 width:90%;
 background-color:grey;
 position:absolute;
 left:50%;
 transform:translate(-50%,0);
}

(2)absolute+margin
父级元素:position:relative
 子元素:
 position:absolute;
 left:0;
 right:0;
 margin:0 auto;
<div class="div9">
    <p class="p9">块级元素absolute+margin水平居中</p>
</div>
.div9{
  width:90%;
  height:20%;
  border:10px solid pink ;
  position:relative;
}
.p9{
 width:90%;
 background-color:grey;
 position:absolute;
 left:0;
 right:0;
 margin:0 auto;
}

(3)absolute+负margin+left(定宽)
(类似于absolute+translate,只不过这个要求居中的元素定宽)
 父级元素:position:relative
 子元素:
 position:absolute;
 left:50%;
 margin-left:-100px;
<div class="div8">
    <p class="p8">块级元素absolute+负margin水平居中</p>
</div>
.div8{
   width:90%;
  height:20%;
  border:10px solid Brown ;
  position:relative;
}
.p8{
 width:200px;
 background-color:grey;
 position:absolute;
 left:50%;
 margin-left:-100px;
}

(4)relative + 负margin(定宽)
对于定宽的块级元素:(对于浮动元素也有效)
 position:relative
 margin-left:-(元素宽一半)px;
<div class="div7">
	 <p class="p7">块级元素relative + 负margin(定宽)水平居中</p>
</div>
.div7{
  width:90%;
  border:10px solid black;
}
.p7{
 width:200px;
 background-color:grey;
 position:relative;
 left:50%;
 margin-left:-100px;
}

2.4 其他方法
(1)转行内元素inline-block+text-align
块级元素转为行内元素:
 父级元素text-align:center ;
 块级元素display:inline-block;
 (其中多个块级元素并列,可在并列块级元素中添加display:inline-block;)
 <div class="div5">
	 <p class="p5">块级元素转为行内元素水平居中</p>
</div>
.div5{
  width:90%;
  border:10px solid yellow;
  text-align:center;
}
.p5{
 width:90%;
 background-color:grey;
 display:inline-block;
}

(2)浮动元素:margin
在浮动的元素外套一个div,设置margin: 0 auto
<div class="div10"> 
  <div class="div101">
    <p class="p10">浮动块级元素水平居中</p>
  </div>
</div>
.div10{
  width:90%;
  height:20%;
  border:10px solid GreenYellow  ;
}
.div101{
  width:20%;
  margin:0 auto;
}
.p10{
 background-color:grey;
 float: left;
}

(3)浮动元素:relative
<div class="div11"> 
  <div class="div111">
	 <p class="p11">浮动块级元素水平居中</p>
  </div>
</div>
.div11{
   width:90%;
  height:20%;
   border:10px solid LightBlue   ;
}
.div111{
 float: left;
 position: relative;
 left: 50%;
}
.p11{
background-color:grey;
float: left;
position: relative;
right: 50%;
}

二、 垂直居中
1.行内元素水平居中
(1)line-height=height
父元素的height=子元素line-height
<div class="div1"> 
   <p class="p1">浮动块级元素垂直居中</p>
</div>
*{
  margin:0px;
  padding
}
.div1{
  width:90%;
  height:200px;
  border:10px solid GreenYellow  ;
}
.p1{
 background-color:grey;
  line-height:200px
}

2.块级元素垂直居中
2.2布局
(1)flex+ align-items
父元素:display:flex;
 align-items:center;
<div class="div2">
	 <p class="p2">块级元素利用flex+align-items垂直居中</p>
</div>
*{
  margin:0px;
  padding
}
.div2{
  width:90%;
  height:20%;
  border:10px solid blue;
  display:flex;
  align-items:center;
}
.p2{
 width:90%;
 background-color:grey;
}

(2)flex+ margin
<div class="div3">
	 <p class="p3">块级元素利用flex+margin垂直
</div>
*{
  margin:0px;
  padding:0px;
}
.div3{
  width:90%;
  height:100px;
  border:10px solid purple;
  display:flex;
}
.p3{
 width:40%;
 background-color:grey;
 margin:auto 0
}

(3)grid+ align-content
display:grid;
 align-content:center;
<div class="div22">
	 <p class="p22">块级元素利用grid+align-content垂直居中</p>
</div>
*{
  margin:0px;
  padding
}
.div22{
  width:90%;
  height:20%;
  border:10px solid red;
  display:grid;
  align-content:center;
}
.p22{
 background-color:grey;
}

(4)table-cell+vertical-align+inline-block
<div class="div2">
	 <p class="p2">块级元素利用table-cell;vertical-align垂直居中</p>
</div>
.div2{
  width:90%;
  height:200px;
  border:10px solid blue;
  vertical-align:middle;
  display:table-cell;
}
.p2{
 width:90%;
 background-color:grey;
 display:inline-block;
}

2.3 定位
(1)absolute+translate+top
参照水平方法,把移动从x轴变为y轴即可
 父元素相对定位:position:relative;
 子元素绝对定位:
 position:absolute;
 top:50%;
 transform:translate(0,-50%);
 <div class="div6">
	 <p class="p6">块级元素absolute+translate垂直居中</p>
</div>
*{
  margin:0px;
  padding
}
.div6{
  width:90%;
  height:20%;
  border:10px solid orange;
  position:relative;
}
.p6{
 width:90%;
 background-color:grey;
 position:absolute;
 top:50%;
 transform:translate(0,-50%);
}

(2)absolute+负margin+left(定宽)
<div class="div8">
	 <p class="p8">块级元素absolute+负margin垂直居中</p>
</div>
*{
  margin:0px;
  padding
}
.div8{
   width:90%;
   height:200px;
  border:10px solid Brown ;
  position:relative;
}
.p8{
 width:200px;
  height:100px;
 background-color:grey;
 position:absolute;
 top:50%;
margin-top:-50px;
}

3.垂直水平居中
3.1布局
(1)flex+ align-items+justify-content
结合水平和垂直方法
<div class="div2">
	 <p class="p2">块级元素利用flex+align-items+justify-content垂直居中</p>
</div>
*{
  margin:0px;
  padding
}
.div2{
  width:90%;
  height:20%;
  border:10px solid blue;
  display:flex;
  align-items:center;
  justify-content:center;
}
.p2{
 width:90%;
 background-color:grey;
}

(2)flex+ margin
结合水平和垂直方法
<div class="div3">
	 <p class="p3">块级元素利用flex+margin垂直居中</p>
</div>
*{
  margin:0px;
  padding:0px;
}
.div3{
  width:90%;
  height:100px;
  border:10px solid purple;
  display:flex;
}
.p3{
 width:40%;
 background-color:grey;
 margin:auto 
}

(3)grid+ place-items
结合水平和垂直方法
<div class="div22">
	 <p class="p22">块级元素利用grid+place-items垂直居中</p>
</div>
*{
  margin:0px;
  padding
}
.div22{
  width:90%;
  height:20%;
  border:10px solid red;
  display:grid;
  place-items:center;
}
.p22{
 background-color:grey;
}

(4)table-cell+text-align+vertical-align
父元素:
 display:table-cell;
 text-align:center;
 vertical-align:middle;
 子元素:
 display:inline-block;
 (会被float、absolute属性破坏效果,同时margin没有效果)
<div class="div8">
	 <p class="p8">块级元素table-cell+水平垂直居中</p>
</div>
*{
  margin:0px;
  padding:0px;
}
.div8{
   width:80%;
   height:200px;
   border:10px solid Brown ;
   display:table-cell;
   text-align:center;
   vertical-align:middle;
}
.p8{
  width:80%;
  background-color:grey;
  display:inline-block;
}

3.1定位
(1)absolute+translate+left+top
结合水平和垂直方法
<div class="div6">
	 <p class="p6">块级元素absolute+translate+left+top水平垂直居中</p>
</div>
*{
  margin:0px;
  padding
}
.div22{
  width:90%;
  height:20%;
  border:10px solid red;
  display:grid;
  place-items:center;
}
.p22{
 background-color:grey;
}

(2)absolute+负margin+left+top(定宽)
结合水平和垂直方法
<div class="div8">
	 <p class="p8">块级元素absolute+负margin水平垂直居中</p>
</div>
*{
  margin:0px;
  padding
}
.div8{
   width:90%;
   height:200px;
  border:10px solid Brown ;
  position:relative;
}
.p8{
  width:200px;
  height:100px;
  background-color:grey;
  position:absolute;
  top:50%;
  left:50%;
  margin-left:-100px;
 margin-top:-50px;
}




















