在 CSS 中要设置元素水平垂直居中是一个非常常见的需求了。但就是这样一个从理论上来看似乎实现起来极其简单的,在实践中,它往往难住了很多人。

让元素水平居中相对比较简单:如果它是一个行内元素,就对它的父元素应用 text-align: center;如果它是一个块级元素,就对它自身应用 margin: auto

然而如果要对一个元素进行垂直居中,那就没有那么容易了,有时候光是想想就令人头皮发麻了。

本文分别从行内元素和块级元素进行说明,将目前比较流行的实现方式进行汇集并解析实现原理,方便大家查阅。这里要说明一点,每一种方式都不是十全十美的,关键要看自己的需求,从而分析出哪种实现方式是最合适的。

行内元素

首先我们先把基础代码写出来:

  1. <div class="main">
  2. <span class="content">我是要居中的行内元素span</span>
  3. </div>
  1. .main {
  2. width: 300px;
  3. height: 300px;
  4. background-color: #50ba8b;
  5. }
  6. .content {
  7. background-color: #5b4d4e;
  8. color: #FFFFFF;
  9. }

class 为 .main 的 div 包裹这一个 class 为 .content 的行内元素 span,我们的目的就是要让 .content 元素 在 .main 元素中居中。

水平居中

text-align

行内元素的水平居中比较简单,我们直接在 .main 中添加 text-align: center; 即可,此时 .main 变为:

  1. .main {
  2. width: 300px;
  3. height: 300px;
  4. background-color: #50ba8b;
  5. text-align: center; /* 水平居中 */
  6. }

实现原理: 设置 text-align 的值为 center ,因为该属性规定元素中的文本的水平对齐方式,那么设置为 center 则文本就水平居中了。

垂直居中

line-height

行内元素的垂直居中我们分为 一行多行或者图片等替换元素 来说明。

如果是 一行,那么我们可以使用 line-height 来实现,此时 .main 元素 css 代码变为:

  1. .main {
  2. width: 300px;
  3. height: 300px; /* 可以不设置 */
  4. background-color: #50ba8b;
  5. line-height: 300px; /* 垂直居中 */
  6. }

其实设置了 line-height 就可以让文本垂直居中,并不需要同时设置 height,这里也是一直存在的一个误区。

实现原理: 这种方式实现垂直居中运用的是 CSS 中“行距的上下等分机制”,这也说明了为什么该方式只适用于 一行 的文本。

还有一点需要说明是,这种方式实现的垂直居中是“近似”的,并不是完美的垂直居中,因为文字字形的垂直中线位置普遍要比真正的“行框盒子”的垂直中线位置低,而由于我们平时使用的 font-size 比较小,使得这点偏差不容易察觉出来,那么感官上也就看成是垂直居中了。

line-height 及 vertical-align

下面再来说说 多行或者图片等替换元素 的垂直居中效果实现,这里我们需要同时借助 line-heightvertical-align 来实现。

先让文本换行:

  1. <div class="main">
  2. <span class="content">
  3. 我是要居中的行内元素span <br>
  4. 我是要居中的行内元素span
  5. </span>
  6. </div>

再看修改之后的 css 代码:

  1. .main {
  2. width: 300px;
  3. background-color: #50ba8b;
  4. line-height: 300px;
  5. }
  6. .content {
  7. display: inline-block;
  8. background-color: #5b4d4e;
  9. color: #FFFFFF;
  10. line-height: 20px;
  11. margin: 0 20px;
  12. vertical-align: middle;
  13. }

实现原理:

  1. 设置 .content 元素的 display 为 inline-block。作用在于既能重置外部的 line-height 为正常大小,又能保持行内元素特性,从而可以设置 vertical-align 属性,以及产生一个非常关键的“行框盒子”。我们需要的其实并不是这个“行框盒子”,而是每个“行框盒子”都会附带的一个产物 —— “幽灵空白节点”,即一个宽度为 0,表现如同普通字符的看不见的“节点”。有了这个“幽灵空白节点”,我们的 line-height: 300px; 就有了作用的对象,从而相当于在 .content 元素前面撑起了一个高度为 300px 的宽度为 0 的行内元素。
  2. 因为行内元素默认都是基线对齐的,所以我们通过对 .content 元素设置 vertical-align: middle; 来调整多行文本的垂直位置,从而实现我们想要的“垂直居中”效果。这种方式也适用于 图片等替换元素 的垂直居中效果。当然这里的“垂直居中”也是近似的,这是由于 vertical-align 导致的,具体为什么可以深入了解 vertical-align: middle;

块级元素

依然先把基础代码写出来:

  1. <div class="main">
  2. <div class="content">我是要居中的块级元素div</div>
  3. </div>
  1. .main {
  2. width: 300px;
  3. height: 300px;
  4. background-color: #50ba8b;
  5. }
  6. .content {
  7. width: 150px;
  8. height: 150px;
  9. background-color: #5b4d4e;
  10. }

class 为 .main 的 div 包裹这一个 class 为 .content 的 块级元素 div,我们的目的就是要让 .content 元素 在 .main 元素中居中。

position + margin: auto

实现代码如下:

  1. .main {
  2. width: 300px;
  3. height: 300px;
  4. background-color: #50ba8b;
  5. /*关键代码*/
  6. position: relative;
  7. }
  8. .content {
  9. width: 150px;
  10. height: 150px;
  11. background-color: #5b4d4e;
  12. /*关键代码*/
  13. position: absolute;
  14. top: 0;
  15. left: 0;
  16. bottom: 0;
  17. right: 0;
  18. margin: auto;
  19. }

实现原理:

  1. 设置 .main 元素为相对定位 position: relative;,这样其子元素设置绝对定位时就相对它了。
  2. 然后设置 .content 元素为绝对定位 position: absolute; 并设置它的 topleftbottomright 都为0,这样该元素的元素的尺寸表现为“格式化宽度和格式化高度”,和 <div> 的“正常流宽度”一样,同属于外部尺寸,也就是尺寸自动填充父级元素的可用尺寸,但由于此时我们设置了 .content 元素的宽高,就限制了元素自动填充,这样就多出来150px的空间了。
  3. 最后我们设置 .content 元素为 margin: auto; ,此时根据 auto 的计算规则,将上下左右剩余空间全部等分了,自然就居中了。

position + margin-left/top

实现代码如下:

  1. .main {
  2. width: 300px;
  3. height: 300px;
  4. background-color: #50ba8b;
  5. /*关键代码*/
  6. position: relative;
  7. }
  8. .content {
  9. width: 150px;
  10. height: 150px;
  11. background-color: #5b4d4e;
  12. /*关键代码*/
  13. position: absolute;
  14. top: 50%;
  15. left: 50%;
  16. margin-left: -75px;
  17. margin-top: -75px;
  18. }

实现原理:

  1. 设置 .main 元素为相对定位 position: relative;,这样其子元素设置绝对定位时就相对它了。
  2. 然后设置 .content 元素为绝对定位 position: absolute; 并设置 top: 50%;left: 50%;,这样.content 元素的左上角就位于 .main 元素的中心了。
  3. 最后设置 .content 元素 margin-left: -75px;margin-top: -75px; 将自身左移及上移宽高的一半,这样 .content 元素的中心处于 .main 元素的中心处,自然就实现了居中效果。
  4. 这种方法的缺点就是需要固定 .content 元素的宽高。

position + translate

实现代码如下:

  1. .main {
  2. width: 300px;
  3. height: 300px;
  4. background-color: #50ba8b;
  5. /*关键代码*/
  6. position: relative;
  7. }
  8. .content {
  9. width: 150px;
  10. height: 150px;
  11. background-color: #5b4d4e;
  12. /*关键代码*/
  13. position: absolute;
  14. top: 50%;
  15. left: 50%;
  16. transform: translate(-50%, -50%);
  17. }

实现原理:

  1. 设置 .main 元素为相对定位 position: relative;,这样其子元素设置绝对定位时就相对它了。
  2. 然后设置 .content 元素为绝对定位 position: absolute; 并设置 top: 50%;left: 50%;,这样.content 元素的左上角就位于 .main 元素的中心了。
  3. 最后设置 .content 元素 transform: translate(-50%, -50%); 将自身左移及上移宽高的一半,这样 .content 元素的中心处于 .main 元素的中心处,自然就实现了居中效果。
  4. 这种方法的好处就是不需要固定 .content 元素的宽高。

Flexbox

实现代码如下:

  1. .main {
  2. width: 300px;
  3. height: 300px;
  4. background-color: #50ba8b;
  5. /*关键代码*/
  6. display: flex;
  7. }
  8. .content {
  9. width: 150px;
  10. height: 150px;
  11. background-color: #5b4d4e;
  12. /*关键代码*/
  13. margin: auto;
  14. }

实现原理:

  1. 设置 .main 元素 display: flex;
  2. 然后设置 .content 元素为 margin: auto; 即可实现居中。
  3. 这是毋庸置疑的最佳解决方案,我们不需要设置 .content 元素为绝对定位,margin: auto 自然就可以作用于宽高,而且我们也不需要设置 .content 元素的宽高, 因为Flexbox(伸缩盒)是专门针对这类需求所设计的。
  4. 缺点就是目前浏览器支持程度相对其它方式会低些。

Flexbox 的另一个好处在于,它还可以将匿名容器(即没有被标签包裹的文本节点)垂直居中。比如我们不设置 .main 元素为 display: flex;,而是设置 .content 元素为 display: flex;,并借助 Flexbox 规范所引入的 align-items 和 justify-content 属性,我们可以让它内部的文本也实现居中(我们可以对.main 元素使用相同的属性来使 .content 元素元素居中,但比 margin: auto 方法要更加优雅一些,并且同时起到了回退的作用)。

  1. .content {
  2. width: 150px;
  3. height: 150px;
  4. background-color: #5b4d4e;
  5. /*关键代码*/
  6. display: flex;
  7. align-items: center;
  8. justify-content: center;
  9. margin: auto;
  10. }

CSS实现元素居中原理解析的更多相关文章

  1. CSS实现三角形图标原理解析

    CSS实现三角形图标原理解析: border边框语法: border 四条边框设置border-left 设置左边框,一般单独设置左边框样式使用border-right 设置右边框,一般单独设置右边框 ...

  2. 经典CSS实现三角形图标原理解析

    前言: 在写这篇文章之前,我也看过很多前端大神写的代码,But,都只是粘贴代码和给出显示效果,对于初学者来说大家都喜欢刨根问底,为什么要这样做呢? 接下来就让我给大家分享一下我对CSS实现三角形的理解 ...

  3. CSS中包含块原理解析

    CSS包含块原理解析 确定CSS中的包含块也确定就是元素的父元素.关键是:看元素是如何定位的.确定包含块很重要,比如设置百分比.另外也可以进行样式的继承等等. 分两个情况: 相对定位和静态定位 静态定 ...

  4. css让元素居中显示

    通常在absolute之后, 想让元素居中,都会采用margin-top:-[元素高度的一半]和 margin-left:-[元素宽度的一半] ,  但是当我们的元素宽高不是固定的时候, 这就难办了, ...

  5. css实现元素居中

     参见详细教程,该教程涵盖了所有居中的情况: https://css-tricks.com/centering-css-complete-guide/ css元素居中 1.水平居中 1)文本,图片等行 ...

  6. 使用CSS完成元素居中的七种方法

    在网页布局中元素水平居中比元素垂直居中要简单不少,同时实现水平居中和垂直居中往往是最难的.现在是响应式设计的时代,我们很难确切的知道元素的准确高度和宽度,所以一些方案不大适用.据我所知, 在CSS中至 ...

  7. css 使元素居中

    css使元素水平居中 1.对于行内元素的水平居中 给父元素设置text-align:center <div style="text-align:center;">居中显 ...

  8. css中元素居中总结

    很多时候,我们需要让元素居中显示:1. 一段文本的水平居中,2. 一张图片的水平居中,3. 一个块级元素的水平居中:4. 单行文本的竖直居中,5. 不确定高度的一段文本竖直居中,6. 确定高度的块级元 ...

  9. css 浮动元素居中

    方法一 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

随机推荐

  1. 分享java常用技术教程:dubbo、zookeeper、ActiveMq、多线程、Redis、PowerDesigner等

    游戏是自己整理的邮箱来源于网上,下面是我的有道云的分享地址: https://note.youdao.com/share/?id=c5f258fa9efd1b28b2d8f0d37e59b194&am ...

  2. Java中对List去重, Stream去重

    问题 当下互联网技术成熟,越来越多的趋向去中心化.分布式.流计算,使得很多以前在数据库侧做的事情放到了Java端.今天有人问道,如果数据库字段没有索引,那么应该如何根据该字段去重?大家都一致认为用Ja ...

  3. 如何使用Visual Studio 2017自带的源代码反编译功能

    反编译C#源代码,大家可能第一时间想到 .NET Reflector 这个工具.但是这个工具反编译出来的代码跟实际源码还是有一定差距的,阅读起来不是很便利. 本人在查看Visual Studio 20 ...

  4. CSS3 3D立方体效果

    <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...

  5. java Thread 接口学习

    对于程序员来说 Thread应该都不会陌生,具体的接口调用不是本篇的重点.Thread的基本概念及接口的使用:java多线程 下面将更多的从底层实现角度讲一下Thread. Thread的声明如下: ...

  6. Linux(一)VMware虚拟机的安装

    vmware的安装文件: 链接:https://pan.baidu.com/s/1QGjNqRZzE-vV7Af0PI2QYA 密码:omfe 1.1 首先下载安装包 安装包的内容 1.2 双击exe ...

  7. further occurrences of HTTP header parsing errors will be logged at DEBUG level.错误

    今天进行项目测试的时候出现了further occurrences of HTTP header parsing errors will be logged at DEBUG level.错误,查了半 ...

  8. Java 枚举类型简介

    目录 Java 枚举示例 Java 枚举构造函数 枚举类型是用于定义常量集合的特殊类型,更确切的说,JAVA枚举类型是一种特殊的 java 类.枚举类型可以包含常量.方法等.在 java5 中添加了 ...

  9. mysql如何选择合适的数据类型1:CHAR与VARCHAR

    CHAR和VARCHAR类型类似,都用来存储字符串,但它们"保存"和"检索"的方式不同.CHAR属于"固定长度"的字符串,而VARCHAR属 ...

  10. pyqt5 动画学习(四) 旋转动画,使用QGraphicsView让自己的控件旋转起来

    今天学有所成,赶紧记下今天的成果 之前三篇文章分别演示了空间的大小改变,移动,及颜色变化.在后续研究旋转的过程中即为艰难 如果你是使用pyqt4,那么使用QGraphicsItemAnimation便 ...