实现垂直居中的几种方式

本文介绍了几种常见的CSS垂直居中方法,包括单行文本垂直居中、利用vertical-align垂直居中、通过绝对定位实现垂直居中及使用flex布局实现垂直居中等。每种方法都附带了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方式一:单行文本垂直居中

其实单行文本垂直居中是垂直居中中最为简单的了。通常使用line-height 和 height配合使用即可,也就是将line-height和height设置为同样的数值。
当然也有道友说其实这个地方设置height值其实完全没有必要,容器会根据line-height自动撑开。这个理论实际上是正确的,他的正确的前提在于该元素内只有文本节点。
但是如果父级元素不设置高度,子元素设置了高度,这个时候就不能垂直居中了,因为父级元素的高度和子元素的高度+margin值 一样了。因此为了保险建议还是设置height和line-height相同,来实现单行文本的居中。

<span style="font-size:14px;"><div style="height:200px;line-height:200px;">
	我是垂直居中的
</div></span>

方式二:利用vertical-align垂直居中

很多人说vertical-align不好用,使用了这个样式,达不到居中的效果。其实写这个文章之前我也是这么认为的,但是看了vertical-align的说明后,才发现是自己用错了。在w3c上面,vertical-align是这样解释的:
“该属性定义行内元素的基线相对于该元素所在行的基线的垂直对齐。允许指定负长度值和百分比值。这会使元素降低而不是升高。在表单元格中,这个属性会设置单元格框中的单元格内容的对齐方式。”
根据这个话,做垂直居中其实可以这样玩:

(1)、设置父级元素为table-cell



通过设置父级元素为display:table-cell以及vertical-align:middle,这样就可以使子元素垂直居中了。这里呢和table里面的垂直居中类似。
注意:设置为display:table-cell的元素,千万不能使用浮动或者定位,否则会丧失table-cell元素的垂直居中的功能。因为浮动和定位是块级元素专有的。如果实在要使用浮动或者定位,可以再外面套一层div,在这个div上面使用浮动或者定位。

<div style="height:200px;display:table-cell;vertical-align:middle;">
	<div>我是垂直居中的,多点字可以变成多行文本我是垂直居中的,多点字可以变成多行文本我是垂直居中的,多点字可以变成多行文本我是垂直居中的,多点字可以变成多行文本</div>
</div>

(2)、如果子元素是图片

vertical-align:middle的解释是元素的中垂点与父元素的基线加1/2父元素中字母X的高度对齐。由于字符X在em框中并不是垂直居中的,且各个字体的字符X的高低位置不一致。所以,当字体大小较大时,这种差异就更明显。当font-size为0时,相当于把字符X的字体大小设置为0,于是可以实现完全的垂直居中。

<div style="height:200px;font-size:0px;line-height:200px;">
	<img style="vertical-middle:middle;" src="http://sandbox.runjs.cn/uploads/rs/26/ddzmgynp/img1.gif" width="50%" alt="test">  
</div>

(3)、通过新增元素来实现垂直居中

可以将新增的元素高度设置的和父级元素一样高,宽度为0,并且同样设置vertical-middle:middle以及display:inline-block;
   由于两个元素之间的空白会被解析,因此需要在父级设置font-size:0px;在子级又将font-size设置回来。

<style>
   .parent{
   height:300px;
   font-size:0px;
   }
   .child{
   font-size:14px;
   display:inline-block;
   vertical-align:middle;
   }
   .childAdd{
	display:inline-block;
	vertical-align:middle;
	height:100%;
	width:0px;
   }
   
   </style>

<div class="parent">
	<div class="child">
	我是垂直居中的,多点字可以变成多行文本我是垂直居中的
	</div>
	<lable class="childAdd"></label>
</div>

如果对文档结构要求比较严格,其实我们也可以利用:after来实现。
<style>
#parent3{
            background: red;
            height:300px;
            font-size:0px;
        }
        #parent3:after{
            content:"";
            display:inline-block;
            height:100%;
            vertical-align: middle;
        }
        #parent3>div{
            font-size:1rem;
            vertical-align:middle;
            display: inline-block;
        }
</style>

<div id="parent3">
    <div>我就是想垂直居中而已我就是想垂直居中而已我就</div>
</div>

方式三:通过绝对定位来实现垂直居中

配合translate()位移函数。translate样式的百分比是相对于自身高度的。而top的百分比是相对于父级元素的高度的。因此可以利用这个特性来实现垂直居中。

<style>
.parent{
  position:relative;
}
.child{
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}
</style>
<div class="parent" style="height:100px;">
  <div class="child">测试文字</div>
</div> 


那么同样的道理,如果要求body的子元素垂直居中,也可以使用margin来实现。


<style>
.child{
	margin-top:50vh;
	transform:translateY(-50%);
}
</style>

<body>
  <div class="child">测试文字</div>
</body> 


方式四:使用弹性盒模型flex实现垂直居中

(1)、在伸缩容器上设置侧轴对齐方式align-items: center

<style>
.parent{
  display: flex;
  align-items: center;
}
</style>


<div class="parent" style="background-color: gray; height: 100px;">
    <div class="child" style="background-color: lightblue;">测试文字</div>   
</div>


(2)、在伸缩项目上设置margin: auto 0

<style>
.parent{
  display: flex;
}
.child{
  margin: auto 0;
}
</style>


<div class="parent" style="background-color: gray; height: 100px;">
    <div class="child" style="background-color: lightblue;">测试文字</div>   
</div>



以上则是垂直居中的几种实现方式。有一些是利用了css3的样式属性,使用的时候一定要注意。

<think>嗯,用户问的是实现水平垂直居中几种方式。这个问题在CSS布局中挺常见的,但可能对于新手来说有点挑战。我需要回忆一下不同的方法,并确保解释清楚每种方法的适用场景和注意事项。 首先,我应该先考虑传统的布局方法。比如,使用绝对定位结合负边距。这种方法比较经典,但是需要知道元素的宽高,否则负边距可能不准确。然后,Flex布局应该是一个更现代、更简便的方法,特别是对于不需要考虑兼容性的情况。Flex的justify-content和align-items属性可以轻松实现居中。 接着,Grid布局也是一个强大的工具,和Flex类似,但适用于更复杂的布局。使用place-items属性或者justify-content和align-content的组合,可能更简洁。然后,还有table-cell的方法,这种方法在需要兼容旧浏览器时可能有用,不过现在用得少了。 另外,transform的translate方法也是一个不错的选项,特别是当元素的尺寸未知时,利用translate的百分比相对于自身宽高的特性,可以动态调整位置。还有line-height的方法,适用于单行文本的垂直居中,但可能不适用于块级元素。 可能需要检查每种方法的代码示例是否正确,比如绝对定位的代码是否正确应用了top和left各50%,然后通过transform调整。Flex和Grid的容器属性是否正确设置,子元素是否需要额外样式。 还需要注意不同方法的兼容性,比如Flex在IE10以上的支持,Grid的兼容性可能更差一些。用户可能需要根据项目需求选择合适的方法。另外,是否提到现代方法和传统方法的区别,以及推荐使用哪种方法? 可能用户的需求是解决一个具体的布局问题,比如弹窗居中或者页面整体的居中。需要确保每种方法都适用不同的场景,比如Flex适合容器内的项目居中,Grid适合更复杂的布局,而绝对定位可能适合需要脱离文档流的情况。 最后,应该总结一下,给出最佳实践的建议,比如优先使用Flex或Grid,因为它们更简洁和灵活,而传统方法在特定情况下仍有其用处。需要避免可能的错误,比如忘记设置父容器的position为relative,或者在Flex容器中忘记设置高度,导致垂直居中不生效。</think>实现水平垂直居中有以下常见方式(以父子容器结构为例): 1. **Flex 弹性布局**(现代推荐方案) ```css .parent { display: flex; justify-content: center; /* 水平居中 */ align-items: center; /* 垂直居中 */ height: 100vh; /* 需要明确容器高度 */ } ``` 2. **Grid 网格布局**(现代推荐方案) ```css .parent { display: grid; place-items: center; /* 同时设置水平和垂直居中 */ height: 100vh; } ``` 3. **绝对定位 + transform**(未知尺寸元素适用) ```css .parent { position: relative; } .child { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } ``` 4. **绝对定位 + 负边距**(已知尺寸元素适用) ```css .child { position: absolute; width: 200px; height: 100px; top: 50%; left: 50%; margin: -50px 0 0 -100px; /* 负边距为宽高的一半 */ } ``` 5. **table-cell 布局**(传统方案) ```css .parent { display: table-cell; text-align: center; /* 水平居中 */ vertical-align: middle; /* 垂直居中 */ width: 100vw; height: 100vh; } .child { display: inline-block; /* 需要转为行内块元素 */ } ``` 6. **line-height 方案**(单行文本简单场景) ```css .parent { height: 200px; line-height: 200px; /* 值等于容器高度 */ text-align: center; } .child { display: inline-block; line-height: normal; /* 重置子元素行高 */ } ``` **选择建议**: - 现代项目优先使用 Flex 或 Grid(代码简洁、响应式好) - 传统项目考虑绝对定位方案 - 简单文本场景可使用 line-height - 需要兼容 IE9 等老旧浏览器时使用 table-cell **注意事项**: - Flex/Grid 需要设置父容器尺寸 - 绝对定位方案会使元素脱离文档流 - 移动端优先推荐 Flex 布局 - 多行文本建议使用 padding 或 Flex 布局
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值