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-height
和 vertical-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;
}
实现原理:
- 设置
.content
元素的 display 为 inline-block。作用在于既能重置外部的 line-height 为正常大小,又能保持行内元素特性,从而可以设置 vertical-align 属性,以及产生一个非常关键的“行框盒子”。我们需要的其实并不是这个“行框盒子”,而是每个“行框盒子”都会附带的一个产物 —— “幽灵空白节点”,即一个宽度为 0,表现如同普通字符的看不见的“节点”。有了这个“幽灵空白节点”,我们的line-height: 300px;
就有了作用的对象,从而相当于在.content
元素前面撑起了一个高度为 300px 的宽度为 0 的行内元素。 - 因为行内元素默认都是基线对齐的,所以我们通过对
.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;
}
实现原理:
- 设置
.main
元素为相对定位position: relative;
,这样其子元素设置绝对定位时就相对它了。 - 然后设置
.content
元素为绝对定位position: absolute;
并设置它的top
、left
、bottom
、right
都为0,这样该元素的元素的尺寸表现为“格式化宽度和格式化高度”,和<div>
的“正常流宽度”一样,同属于外部尺寸,也就是尺寸自动填充父级元素的可用尺寸,但由于此时我们设置了.content
元素的宽高,就限制了元素自动填充,这样就多出来150px的空间了。 - 最后我们设置
.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;
}
实现原理:
- 设置
.main
元素为相对定位position: relative;
,这样其子元素设置绝对定位时就相对它了。 - 然后设置
.content
元素为绝对定位position: absolute;
并设置top: 50%;
、left: 50%;
,这样.content
元素的左上角就位于.main
元素的中心了。 - 最后设置
.content
元素margin-left: -75px;
、margin-top: -75px;
将自身左移及上移宽高的一半,这样.content
元素的中心处于.main
元素的中心处,自然就实现了居中效果。 - 这种方法的缺点就是需要固定
.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%);
}
实现原理:
- 设置
.main
元素为相对定位position: relative;
,这样其子元素设置绝对定位时就相对它了。 - 然后设置
.content
元素为绝对定位position: absolute;
并设置top: 50%;
、left: 50%;
,这样.content
元素的左上角就位于.main
元素的中心了。 - 最后设置
.content
元素transform: translate(-50%, -50%);
将自身左移及上移宽高的一半,这样.content
元素的中心处于.main
元素的中心处,自然就实现了居中效果。 - 这种方法的好处就是不需要固定
.content
元素的宽高。
Flexbox
实现代码如下:
.main {
width: 300px;
height: 300px;
background-color: #50ba8b;
/*关键代码*/
display: flex;
}
.content {
width: 150px;
height: 150px;
background-color: #5b4d4e;
/*关键代码*/
margin: auto;
}
实现原理:
- 设置
.main
元素display: flex;
。 - 然后设置
.content
元素为margin: auto;
即可实现居中。 - 这是毋庸置疑的最佳解决方案,我们不需要设置
.content
元素为绝对定位,margin: auto
自然就可以作用于宽高,而且我们也不需要设置.content
元素的宽高, 因为Flexbox(伸缩盒)是专门针对这类需求所设计的。 - 缺点就是目前浏览器支持程度相对其它方式会低些。
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实现元素居中原理解析的更多相关文章
- CSS实现三角形图标原理解析
CSS实现三角形图标原理解析: border边框语法: border 四条边框设置border-left 设置左边框,一般单独设置左边框样式使用border-right 设置右边框,一般单独设置右边框 ...
- 经典CSS实现三角形图标原理解析
前言: 在写这篇文章之前,我也看过很多前端大神写的代码,But,都只是粘贴代码和给出显示效果,对于初学者来说大家都喜欢刨根问底,为什么要这样做呢? 接下来就让我给大家分享一下我对CSS实现三角形的理解 ...
- CSS中包含块原理解析
CSS包含块原理解析 确定CSS中的包含块也确定就是元素的父元素.关键是:看元素是如何定位的.确定包含块很重要,比如设置百分比.另外也可以进行样式的继承等等. 分两个情况: 相对定位和静态定位 静态定 ...
- css让元素居中显示
通常在absolute之后, 想让元素居中,都会采用margin-top:-[元素高度的一半]和 margin-left:-[元素宽度的一半] , 但是当我们的元素宽高不是固定的时候, 这就难办了, ...
- css实现元素居中
参见详细教程,该教程涵盖了所有居中的情况: https://css-tricks.com/centering-css-complete-guide/ css元素居中 1.水平居中 1)文本,图片等行 ...
- 使用CSS完成元素居中的七种方法
在网页布局中元素水平居中比元素垂直居中要简单不少,同时实现水平居中和垂直居中往往是最难的.现在是响应式设计的时代,我们很难确切的知道元素的准确高度和宽度,所以一些方案不大适用.据我所知, 在CSS中至 ...
- css 使元素居中
css使元素水平居中 1.对于行内元素的水平居中 给父元素设置text-align:center <div style="text-align:center;">居中显 ...
- css中元素居中总结
很多时候,我们需要让元素居中显示:1. 一段文本的水平居中,2. 一张图片的水平居中,3. 一个块级元素的水平居中:4. 单行文本的竖直居中,5. 不确定高度的一段文本竖直居中,6. 确定高度的块级元 ...
- css 浮动元素居中
方法一 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
随机推荐
- 分享java常用技术教程:dubbo、zookeeper、ActiveMq、多线程、Redis、PowerDesigner等
游戏是自己整理的邮箱来源于网上,下面是我的有道云的分享地址: https://note.youdao.com/share/?id=c5f258fa9efd1b28b2d8f0d37e59b194&am ...
- Java中对List去重, Stream去重
问题 当下互联网技术成熟,越来越多的趋向去中心化.分布式.流计算,使得很多以前在数据库侧做的事情放到了Java端.今天有人问道,如果数据库字段没有索引,那么应该如何根据该字段去重?大家都一致认为用Ja ...
- 如何使用Visual Studio 2017自带的源代码反编译功能
反编译C#源代码,大家可能第一时间想到 .NET Reflector 这个工具.但是这个工具反编译出来的代码跟实际源码还是有一定差距的,阅读起来不是很便利. 本人在查看Visual Studio 20 ...
- CSS3 3D立方体效果
<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...
- java Thread 接口学习
对于程序员来说 Thread应该都不会陌生,具体的接口调用不是本篇的重点.Thread的基本概念及接口的使用:java多线程 下面将更多的从底层实现角度讲一下Thread. Thread的声明如下: ...
- Linux(一)VMware虚拟机的安装
vmware的安装文件: 链接:https://pan.baidu.com/s/1QGjNqRZzE-vV7Af0PI2QYA 密码:omfe 1.1 首先下载安装包 安装包的内容 1.2 双击exe ...
- 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.错误,查了半 ...
- Java 枚举类型简介
目录 Java 枚举示例 Java 枚举构造函数 枚举类型是用于定义常量集合的特殊类型,更确切的说,JAVA枚举类型是一种特殊的 java 类.枚举类型可以包含常量.方法等.在 java5 中添加了 ...
- mysql如何选择合适的数据类型1:CHAR与VARCHAR
CHAR和VARCHAR类型类似,都用来存储字符串,但它们"保存"和"检索"的方式不同.CHAR属于"固定长度"的字符串,而VARCHAR属 ...
- pyqt5 动画学习(四) 旋转动画,使用QGraphicsView让自己的控件旋转起来
今天学有所成,赶紧记下今天的成果 之前三篇文章分别演示了空间的大小改变,移动,及颜色变化.在后续研究旋转的过程中即为艰难 如果你是使用pyqt4,那么使用QGraphicsItemAnimation便 ...