当前位置: 首页 > Web前端 > HTML

CSS垂直居中的七种方法

时间:2023-04-02 12:21:35 HTML

我们在编辑一个布局,通常使用水平居中和垂直居中来设计,而水平居中好办,无非就是设置margin:0auto;或者text-align:center;,可以轻松解决水平居中的问题,但最头疼的对齐问题一直是“垂直居中”这个烦人的设置。下面将单独介绍七种使用CSS实现垂直居中的方法。垂直居中的七种方式设置行高(line-height)添加伪元素calc动态计算使用表格或假表格变换绝对定位使用Flexbox设置行高(line-height)设置行高是最简单的垂直居中方法适用于“单行”的“行内元素”(inline、inline-block),比如单行的标题,或者已经设置了inline-block属性的div。如果line-height设置为与height相同的值,那么内容的inline元素会垂直居中,因为是行高,所以inline的上下各增加1/2的行高元素,所以它是垂直居中的!但是从这里我们可以看出为什么需要单行的内联元素,因为如果有多行,第二行和第一行的距离就会变得过大,这不是我们预期的效果。CSS示例:.div0{width:200px;高度:150px;边框:1px实心#000;行高:150px;text-align:center;}.redbox{display:inline-block;宽度:30px;高度:30px;background:#c00;}添加伪元素(::before,::after)只是第一种方法,虽然是最简单的方法(适用于单行标题),但是只能是单行,所以如果我们想让多个行的元素也可以垂直居中,那么就必须使用伪元素。在此之前,让我解释一下CSS中的vertical-align属性。虽然这个属性是垂直居中的,但它意味着元素中的所有元素相互垂直居中,而不是相对于外框的高度垂直居中。(下面的CSS会像这样造成垂直居中).div0{width:200px;高度:150px;边框:1px实心#000;text-align:center;}.redbox{宽度:30px;高度:30px;背景:#c00;显示:内联块;vertical-align:middle;}.greenbox{宽度:30px;高度:60px;背景:#0c0;显示:内联块;vertical-align:middle;}.bluebox{宽度:30px;高度:40px;背景:#00f;显示:内联块;vertical-align:middle;}因此,如果一个块的高度变为100%,那么其他块将真正垂直居中。.greenbox{宽度:30px;高度:100%;背景:#0c0;显示:内联块;vertical-align:middle;}但我们不能总是在每次想要垂直居中时在其中添加一个奇怪的div!所以我们只好动动脑筋去“伪元素”,用::before和::after把div加到bar里,让这个“伪”div的高度为100%,就可以轻松让其他div居中了。但是却又不是!div记得设置显示为inline-block。毕竟,vertical-align:middle;是针对行内元素的,而div本身就是一个块,所以一定要改!.div0::before{内容:'';宽度:0;高度:100%;显示:内联块;职位:相对;会有疑惑,如果今天我的div一定是一个block,那怎么让它垂直居中呢?这时候就必须借助CSS特有的calc动态计算能力。我们只需要让div的top属性居中,距离top的距离为“外框高度的50%+div高度的50%”。垂直居中,至于为什么不用margin-top,因为margin是相对于水平宽度的,必须用top才正确。.div0{宽度:200px;高度:150px;border:1pxsolid#000;}.redbox{宽度:30px;高度:30px;背景:#c00;向左飘浮;顶部:计算(50%-15px);-left:calc(50%-45px);}.greenbox{宽度:30px;高度:80px;背景:#0c0;向左飘浮;top:calc(50%-40px);}.bluebox{宽度:30px;高度:40px;背景:#00f;向左飘浮;top:calc(50%-20px);}使用表格或伪装表格可能有人会发现,在表格HTML中常用的DOM中,要实现垂直居中很容易,只需要下一行vertical-align:middle,为什么?主要原因是table的显示是table,而td的显示是table-cell,所以除了直接使用table之外,我们还可以将元素的父元素的显示改为垂直居中table-cell,可以轻松实现,但是修改显示有时会引起其他样式属性的联动效果,需要谨慎使用。HTML:

表格垂直居中
假表格垂直居中
CSS:.like-table{display:table-cell;}td,.like-table{width:150px;高度:100px;边框:1px实心#000;vertical-align:middle;}tddiv,.like-tablediv{width:100px;高度:50px;保证金:0自动;颜色:#fff;字体大小:12px;行高:50px;文本对齐:居中;background:#c00;}.like-tablediv{background:#069;}transformtransform是CSS3的一个新属性,主要负责元素的变形、旋转和位移。在transform中使用translateY(改变垂直位移,如果以百分比为单位,则以元素本身的长宽为准),配合元素本身的top属性,可以做出垂直居中的效果。需要注意的是子元素必须加上position:relative,否则没有效果。..use-transform{width:200px;高度:200px;border:1pxsolid#000;}.use-transformdiv{position:relative;宽度:100px;高度:50px;顶部:50%;变换:翻译Y(-50%);background:#095;}绝对定位绝对定位就是CSS中的position:absolute,用绝对位置来指定,但是垂直居中的方式和我们正统的绝对位置不一样。两者都设置为0,然后一个margin:auto就可以实现垂直居中。但是需要注意的是,如果子元素设置为绝对定位,则父元素的位置必须指定为相对位置!而且绝对定位的元素会互相覆盖,所以如果内容元素很多的话,可能会出现一些问题。.use-absolute{位置:相对;宽度:200px;高度:150px;border:1pxsolid#000;}.use-absolutediv{position:absolute;宽度:100px;高度:50px;顶部:0;右:0;底部:0;左:0;保证金:自动;background:#f60;}使用Flexbox使用align-items或align-content属性,可以轻松实现垂直居中的效果。.use-flexbox{显示:flex;对齐项目:居中;证明内容:居中;宽度:200px;高度:150px;border:1pxsolid#000;}.use-flexboxdiv{width:100px;高度:50px;background:#099;}以上是垂直居中的一些方法。因为垂直居中经常用到display属性的修改,所以往往会对排版造成一些影响。比如不该用flexbox的地方用了flexbox,就不会在该用table的地方用table,不该用inline-block的地方用inline-block。反而后面需要自己写很多其他的定位样式来修正,有点颠倒了。因此,如何利用这些CSS垂直居中的方法,就要看大家的布局结构和灵活运用了!

猜你喜欢