CSS 居中方案整理

前言

认为自己的 CSS 停留在会用的阶段,遇到复杂一些的效果都是各种尝试,没有一些理性的知识做支撑。

这次离职闲暇之余,便想着整理一下常见的 CSS 问题,下次遇到相应的场景,也能够有些参考。

1. 水平居中

1.1 行内元素或类行内元素水平居中

利用 text-align: center 可以实现 块级元素内部内联元素 水平居中

  1. 文本

<p style="text-align: center;background: #f06d06;">
  我要居中
</p>
  1. display 值为 inline, inline-block, inline-table, inline-flex 之一

<p style="text-align: center;background: #f06d06;">
  <div style="display: inline;">
    我要居中
  </div>
</p>

在测试以上代码的时候,发现并不能居中,而且最终渲染的结果是:

也就是说, p 标签中不能嵌套 div 标签,否则会造成这种 bug.

于是换用以下代码测试:

1.2 单个块级元素水平居中

1.2.1 margin: 0 auto;

通过 margin:0 auto; 使得块级元素水平居中,前提是 设置了居中元素的 width

1.2.2 width: fit-content

同上,使用 margin:0 auto; 设置要居中元素为 width: fit-content (相当于明确设置居中元素的宽度), 在 实现水平居中。

缺点是, fit-content 的浏览器兼容略差

1.2.3 绝对定位

通过设置要居中的元素向右移动父元素的 50%, 再向左移动自身元素的 -50%, 即可试下居中。

如果已知子元素宽度,比如:

此时 tranxlateX(-50%) 还可以换成 margin-left: -200px.

另外,还可以利用 calc, 设置准确的 left 值:

1.3 多个块级元素水平居中

1.3.1 text-align: center 方式

即通过让块级元素变为 inline-block 元素,再让父级 text-align: center 使得元素居中

1.3.2 flex 布局方式

通过父元素设置为 flex 布局,并设置 justify-content: center 实现居中

1.3.3 使用 float 实现水平居中

原理是,设置多个元素的共同父元素 float:left, 那么父元素的宽度即为其内容(即子元素)的宽度。子元素设置为 float: left, 保证多个子元素都在同一行。

接着父元素 A 相对父元素的父元素 B left: 50%。然后子元素 C 设置 right: 50% 相对与 A的,其实就类似 A 元素 transform: translateX(-50%), 从而实现居中。

1.3.4 绝对定位实现水平居中

原理同上,通过设置父元素为 position: absolute,使得父元素宽度取决于所包含的内容(即子元素)的宽度

2. 垂直居中

2.1 行内或类行内元素垂直居中

2.1.1 padding-top === padding-bottom

即通过设置 padding-top 和 padding-bottom 相等,使得文字居中 (适用于单行和多行文字)

2.1.2 line-height === height 垂直居中

即设置 line-height 的值与height值一样,但只适用于单行文本,如果有多行,则无效。

2.1.3 table 垂直居中

支持多行文本垂直居中

设置父元素为 display: table,并设定高度。 子元素设为 display: table-cell; vertical-align: middle; 即可

同理,我们也可以直接用 table 标签:

默认 tbody 的 vertivcal-align 即为 middle;

2.1.4 flex 布局垂直居中

2.1.5 幽灵元素实现垂直居中

即某个元素需要垂直居中,那么可以给它加一个兄弟元素(通过父元素为元素的方式),其高度为父元素的 100%.

同时设置两个元素都是 inline-block, 再通过 vertical-align:middle 实现垂直居中。

2.2 块级元素垂直居中

2.2.1 绝对定位实现垂直居中

元素高度已知

元素高度未知

同水平居中一样,高度未知时可以采用 transform: translateY(-50%) 的方式:

2.2.2 flex 布局

2.2.3 table 布局

同行内元素垂直居中(2.1.3部分内容):

display: table-cell 也是一样的:

3. 水平垂直居中

3.1 绝对定位

元素宽高已知

absolute + calc 的方式适用于元素宽高已知的情况

同理还有 transform 的方式适用于元素宽高未知的情况

3.2 flex

略,同以上 flex 的方式

3.3 absolute + margin: auto;

即通过绝对定位,同时设置 left,right,top,bottom 均为 0, 此时再设置 margin: auto; 即可实现水平垂直居中。前提是已知元素的宽高

3.4 使用 line-height

即通过 line-height 垂直居中, text-align: center; 实现水平居中。

在子元素中, line-height: initial; text-align: left; 都是为了消除父元素样式对自己的影响。

4. 最后说一说

本文只是对于网上答案的整理,没有原创部分,仅用于自己备忘,在实际工作中遇到相关问题能有资料参考。

该文章从动笔到现在已经两周时间了,忙于搬家,入职新公司等各种事情。现在是深夜 2019-12-09 00:52:00 ,整理完这个知识,接下来新的一周抓紧看 Vue 的文档,把 Entry Task 完成。尽管 Vue 相关技术栈和 TypeScript 都不是熟,一周的时间也觉得有点紧,但也要尽量去完成啊。

另外,对于前端的很多的知识点,希望之后自己都能尽量弄明白,或者是自己的独立思考,或者是整理与理解网上的资料,充实自己也丰富自己的 blog。

参考资料

  1. 核心参考: CSS居中完整指南

  2. 你能实现多少种水平垂直居中的布局(定宽高和不定宽高):https://juejin.cn/post/6844903982960214029#heading-18

Last updated

Was this helpful?