原文:CSS实现元素居中原理解析

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

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

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

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

行内元素

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

<div class="main"><span class="content">我是要居中的行内元素span</span>
</div>

.main {width: 300px;height: 300px;background-color: #50ba8b;
}.content {background-color: #5b4d4e;color: #FFFFFF;
}

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

水平居中

text-align

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

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

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

垂直居中

line-height

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

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

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

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

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

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

line-height 及 vertical-align

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

先让文本换行:

<div class="main"><span class="content">我是要居中的行内元素span <br>我是要居中的行内元素span</span>
</div>

再看修改之后的 css 代码:

.main {width: 300px;background-color: #50ba8b;line-height: 300px;
}.content {display: inline-block;background-color: #5b4d4e;color: #FFFFFF;line-height: 20px;margin: 0 20px;vertical-align: middle;
}

实现原理:

  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;

块级元素

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

<div class="main"><div class="content">我是要居中的块级元素div</div>
</div>

.main {width: 300px;height: 300px;background-color: #50ba8b;
}.content {width: 150px;height: 150px;background-color: #5b4d4e;
}

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

position + margin: auto

实现代码如下:

.main {width: 300px;height: 300px;background-color: #50ba8b;/*关键代码*/position: relative;
}.content {width: 150px;height: 150px;background-color: #5b4d4e;/*关键代码*/position: absolute;top: 0;left: 0;bottom: 0;right: 0;margin: auto;
}

实现原理:

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

position + margin-left/top

实现代码如下:

.main {width: 300px;height: 300px;background-color: #50ba8b;/*关键代码*/position: relative;
}.content {width: 150px;height: 150px;background-color: #5b4d4e;/*关键代码*/position: absolute;top: 50%;left: 50%;margin-left: -75px;margin-top: -75px;
}

实现原理:

  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

实现代码如下:

.main {width: 300px;height: 300px;background-color: #50ba8b;/*关键代码*/position: relative;
}.content {width: 150px;height: 150px;background-color: #5b4d4e;/*关键代码*/position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);
}

实现原理:

  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

实现代码如下:

.main {width: 300px;height: 300px;background-color: #50ba8b;/*关键代码*/display: flex;
}.content {width: 150px;height: 150px;background-color: #5b4d4e;/*关键代码*/margin: auto;
}

实现原理:

  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 方法要更加优雅一些,并且同时起到了回退的作用)。

.content {width: 150px;height: 150px;background-color: #5b4d4e;/*关键代码*/display: flex;align-items: center;justify-content: center;margin: auto;
}

CSS实现元素居中原理解析相关推荐

  1. css 伪元素居中对齐

    css 伪元素居中对齐 .demo {display: flex;padding: 40px;}.demo::after {content: '';display: inline-block;back ...

  2. 10 个CSS实现元素居中的方法汇总

    英文 | https://javascript.plainenglish.io/10-css-tricks-you-should-know-for-centering-elements-61092d3 ...

  3. 【CSS】元素居中总结-水平居中、垂直居中、水平垂直居中

    [CSS]元素居中 一. 水平居中 1.行内元素水平居中 (1)text-align 2.块级元素水平居中 2.1 margin (1)margin 2.2布局 (1)flex+ justify-co ...

  4. css中元素居中总结

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

  5. html css 让元素居中显示,html – CSS:如何在居中元素周围对齐元素?

    我正在尝试创建一个由三部分组成的简单页面导航: >几个以前的页码(如果有的话) >当前页码(必须居中) >一些即将到来的页码(如果有的话) 重要的是当前页码始终在父容器中水平居中.其 ...

  6. CSS绝对定位元素居中的几种方法

    CSS居中绝对定位元素的方法,有很多种,下面是我收集的几种 1,div宽度未知1 <body><div style="position: absolute; left: 5 ...

  7. css实现元素居中的常见方法

    1.通过 margin 属性调整 : { position: absolute; top: 50%; left: 50%; margin-left: 盒子的一半: margin-top: 盒子的一半; ...

  8. CSS子元素居中(父元素宽高已知,子元素未知)

    <style> .container{width:400px; height:400px; position:relative;} .center{position:absolute; l ...

  9. 码匠编程:CSS让元素绝对居中,你知道几种方法?

    经常碰到有同学在问,如何让一个元素上下左右都居中呢? 相信大家在面试的时候也会经常碰到这个问题,一下列出来几种方式以供大家参考,如有不足之处,请大家补充 问题描述: 给定两个元素,这两个元素是父子级关 ...

最新文章

  1. java 二维码生成和解析
  2. 陈十一院士旗下国产CAE软件开发商获数亿元融资,产品技术已有应用成果
  3. 使用Swagger2Markup实现API文档的静态部署(二):Markdown和Confluence
  4. MyEclipse 设置字体
  5. P6628-[省选联考 2020 B 卷] 丁香之路【欧拉回路,最小生成树】
  6. call stack and stack buffer overflow
  7. LNMP安装步骤详细教程以及一键部署脚本
  8. mysql的未提示输入密码
  9. Linux Kernel 5.8 发布,华为内核代码贡献全球持续领先
  10. kotlin学习笔记-异常好玩的list集合总结
  11. 人工智能在智能制造中的应用
  12. 词法分析之LED文件生成程序【调试中......】
  13. 杭电计算机学硕还是专硕就业好,19计算机考研选学硕还是专硕?
  14. Clickhouse:日志表占用大量磁盘空间怎么办?
  15. Ceph学习——客户端读写操作分析
  16. java计算机毕业设计人口普查信息管理系统源代码+数据库+系统+lw文档
  17. MapReduce -----MapReduce 调优
  18. R语言绘图patchwork拼图详解快速实现组合图拼接
  19. 春运火车票开售 多地火车站启用刷脸通关
  20. AOP -- 注解 @Aspect 、@Pointcut

热门文章

  1. “新一代城市大脑建设与发展“专家研讨会
  2. 区块链架构下 智慧城市发展加速
  3. Gartner 2019年超融合魔力象限:新增深信服,国内华为、华云在榜
  4. MIT科学家Dimitri P. Bertsekas最新2019出版《强化学习与最优控制》(附书稿PDF讲义)...
  5. “反机器学习”:人工智能突破的关键是“遗忘”
  6. 【重磅】吴恩达宣布 Drive.ai 自动驾驶汽车服务落地 理想就这样成了现实!
  7. ACM公布2017年图灵奖,大卫·帕特森和约翰·轩尼诗获奖
  8. 阿里巴巴年度技术总结:人工智能在搜索的应用和实践
  9. 13000行代码、19大技术,这位16岁高中生用C++从头到尾构建了一个机器学习库!...
  10. iPhone nano 被取消是因为乔布斯看到了风向?