css布局-居中布局

1,134 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

水平居中布局

含义:指当前元素在父级元素容器中,水平方向是居中显示的;

文本 / 行内元素 / 行内块级元素

原理:text-align 只 控制行内内容(文字、行内元素、行内块级元素)如何相对他的块父元素对齐。

<!--定义父级元素-->
<div id="parent">
	<!--定义子级元素-->
	<div id="child">水 平居中布局</div>
</div>

通过以下 CSS 样式代码实现水平居中

#parent{ text-align: center; }

优点

简单快捷,容易理解,兼容性非常好;

缺点

只对行内内容有效:属性会继承影响到后代行内内容;如果子元素宽度大于父元素宽度则无效,只有后代行内内容中宽度小于设置 text-align 属性的元素宽度的时候,才会水平居中;

单个块级元素

原理:在 margin 有节余的同时如果左右 margin 设置了 auto,将会均分剩余空间。另外,如果上下 的 margin 设置了 auto,其计算值为 0;

<!-- 定义父级元素-->
实现效果图:
<div id="parent" >
<!--定义子级元素-->
	<div id="child">水平居中布局</div>
</div>

通过以下 CSS 样式代码实现水平居中

#son {
	width: 100px; /*必须定宽*/
}

优点:

简单;兼容性好;

缺点:

必须定宽,并且值不能为 auto; 宽度要小于父元素,否则无效;

多个块级元素

原理:text-align 只 控制行内内容(文字、行内元素、行内块级元素)如何相对他的块父元素对齐。

<!--定义父级元素-->
<div id="parent">
	<!--定义子级元素-->
	<div id="child">水平居中布局</div>
</div>

通过以下 CSS 样式代码实现水平居中

parent{
	text-align: center;
}
.son{
	display: inline-block;
	/*改为行内或者行内块级形式,以达到text-align对其生效*/
}

优点:

简单,容易理解,兼容性非常好;

缺点:

只对行内内容有效;属性会继承影响到后代行内内容;块级改为 inline-block 换行、空格会产生元素间隔;

使用绝对定位实现

原理:子绝(绝对定位)父相(相对定位),top、 right、 bottom、 left 的值 是相对于父元素尺寸的,然后 margin 或者 transform 是相对于自身尺寸的,组合使用达到水平居中的目的;

<!--定义父级元素-->
<div id="parent">
  <!--定义子级元素-->
  <div id="child">水 平居中布局</div>
</div>

通过以下 CSS 样式代码实现水平居中

#parent{
	position: relative; /*子相*/
}
#son{
  position: absolute; /* 子绝*/
  left: 50%; /* 等同于 margin-left: -50px; */
  translatex(-50x);
}

优点:

使用 margin-left 兼容 性好;不管是块级还是行内元素都可以实现;

缺点:

代码较多;脱离文档流;使用 margin-left 需要知道宽度值:使用 transform 兼容性不好 (ie9+);

任意个元素 (flex)

原理:设置当前主轴对齐方式为居中。

<!--定义父级元素-->
<div id="parent">
  <!--定义子级元素-->
  <div id="child">水 平居中布局</div>
</div>

通过以下 CSS 样式代码实现水平居中

#parent{
  display: flex;
  justify-content: center;
}

优点:

功能强大;简单方便;容易理解;

缺点:

PC 端兼容性不好,移动端 (Android4. 0+)

垂直居中布局

含义:指当前元素在父级元素容器中,垂直方向是居中显示的;

单行文本 / 行内元素 / 行内块级元素:

原理:line-height 的最终表现是通过 inline box 实现的,而无论 inline box 所占据的高度是多少(无论比文字大还是比文字小),其占据的空间都是与文字内容公用水平中垂线的。

<!--定义父级元素-->
<div id="parent" >
<!--定义子级元素-->
	<div id="child">水平居中布局</div>
</div>

通过以下 CSS 样式代码实现水平居中

#parent{
	height: 150px;
	/*.与height等值*/
  line-height: 150px;
}

优点:

简单;兼容性好

缺点:

只能用于单行行内内容;要知道高度的值;

图片垂直居中:

原理:vertical-align 和 line-height 的基友关系。

<!--定义父级元素-->
<div id="parent">
  <!--定义子级元素-->
  <div id="child">水平居中布局</div>
</div>

通过以下 CSS 样式代码实现水平居中

#parent{
  height: 150px;
  line-height 150px;
  font-size: 0;
}
/*默认是基线对齐,改为middle*/
img#child{vertical-align: middle;}

优点:

简单;兼容性好

缺点:

需要添加 font-size: 0; 才可以完全的垂直居中;不过需要主要,html#parent 包 裹 img 之间需要有换行或空格;

单个块级元素:

使用 tabel-cell 实现:

原理:CSS Table, 使表格内容对齐方式为 middle。

<!--定义父级元素-->
<div id= "parent" >
  <!--定义子级元素-->
  <div id="child">水平居中布局</div>
</div>

通过以下 CSS 样式代码实现水平居中

#parent{
  display: table-cell;
  vertical-align: middle;
}

优点: 简单;宽高不定:兼容性好 (ie8+) 缺点: 设置 tabl-cell 的元素, 宽度和高度的值设置百分比无效,需要给它的父元素设置 display: table; 才生效;table-cell 不感知 margin,在父元素上设置 table-row 等属性,也会使其不感知 height; 设置 float 或 position 会对默认布局造成破坏,可以考虑为之增加一个父 div 定义 float 等属性;内容溢出时会自动撑开父元素;

3-2. 使用绝对定位实现:

原理:子绝父相,top、 right、 bottom、 left 的值是相对于父元素尺寸的,然后 margin 或者 transform 是相对于自身尺寸的,组合使用达到水平居中的目的。

<!-- 定义父级元素-->
<div id="parent">
<!--定义子级元素-->
  <div id="child">水平居中布局</div>
</div>
#parent(
	position: relative; /*父相*/
}
#child{
  position: absolute; /*子他*/
  top: 50%;
  /*自身高度-不,这里等月于margin-top:-25px;*/
  transform: translate(-50%);
  height: 50px;
}

/

#parent{ position: relative; }
#child{
  position: absolute;
  margin: auto;
  top: 0;
  bottom: 0;
  height: 50px;
}

优点: 使用 margin-top 兼容性好;不管是块级还是行内元素都可以实现 缺点: 代码较多;脱离文档流;使用 margin-top 需要知道高度值:使用 transform 兼容性不好 (ie9+ )

使用 flex 实现:

原理:flex 设置对齐方式。

<!--定义父级元素-->
<div id="parent">
  <!-- 定义子级元素-->
  <div id="child">水平居中布局</div>
</div>

通过以下 CSS 样式代码实现水平居中

#parent{
  display: flex;
  align-items: center;
}

优点:

功能强大;简单方便;容易理解;

缺点:

PC 端兼容性不好,移动端 (Android4. 0+)

水平垂直居中布局

含义:指当前元素在父级元素容器中,水平垂直方向都是居中显示的;

利用 table-cell 実現:

原理:CSSTable, 使表格内容垂直対斉方式内 middle, 突現垂直居中;然后根据是行内内容丕是

块级内容采取不同的方式到水平居中。

<!--定乂父級元素-->
<div id="parent" >
  <!-- 定文子級元素-->
  <div id="child">水 平居中布局</div>
</div>
#parent{
	display: table-cell;
	vertical-align: middle;
	/* text-align: center; */ /*如果是行内元素就添加过 */
}
#child{
  display: table;
  margin: 0 auto;
  /*如果是快綬元素就添加过*/
}
优点:
	简单;适用于宽度高度未知情况;兼容性好(ie8+)
缺点:
	vertical-align属性 具有继承性,导致父元素的文本也是居中显示的;

定位 position 实现:

原理:子绝父相,top、 right、 bottom、 left 的值是相对于父元素尺寸的,然后 margin 或者 transform 是相对于自身尺寸的,组合使用达到几何上的水平垂直居中。

<!--定义父级元素-->
<div id="parent">
	<!--定义子级元素-->
	<div id="child">水 平居中布局</div>
</div>

通过以下 CSS 样式代码实现水平居中

#parent{position: relative;}
#child{
  position: absolute;
  top: 50%;
  left: 50%;
	/*定宽高时等同于margin-left:负自身宽度一半;margin-top:负自身高度一半;*/
	transform: translate(-50%, -50%);
}
优点:
	使用margin兼容性好;不管是块级还是行内元素都可以实现
缺点:
	代码较多;脱离文档流;使用margin需要知道宽高;使用transform兼容性不好(ie9+) ;

利用 flex 实现:

原理:flex 设置对齐方式。

<!--定义父级元素-->
<div id= "parent">
  <!--定义子级元素-->
  <div id="child">水 平居中布局</div>
</div>

通过以下 CSS 样式代码实现水平居中

#parent{
  display: flex;
  justify-content: center;
  align-items: center;
}