CSS垂直居中的七个方法

设定行高(line-height)

适用于单行的行内元素 (inline、inline-block)![[Pasted image 20240407221649.png|297]]

下面是css代码演示

  body {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    /* 让body铺满整个视口 */
    margin: 0;
    /* 清除默认的body margin */
}
  
/* div0盒子会在页面垂直居中 */
  
/* 单行行内元素演示(因为多行的话第二行第三行会和第一行挤在一起,
就不是垂直居中了
例如单行的标题,或是已经设为inline-block属性的div,
若将line-height设成和高度一样的数值,则内容的行内元素就会被垂直居中,
因为是行高,
所以会在行内元素的上下都加上行高的 */
.div0 {
    width: 200px;
    height: 150px;
    border: 2px solid #444141;
    /* 设置line-height和align */
  
    line-height: 150px;
    /* 垂直 */
  
    text-align: center;
    /* 居中 */
  
}
  
.box {
    display: inline-block;
    /*设置内联样式 内联到父元素*/
    width: 30px;
    height: 30px;
    background-color: rgb(202, 248, 248);
}

补充知识点:![[Pasted image 20240408203402.png|650]]Flexbox布局水平居中、垂直居中、等分空间、响应式布局等

容器和项目:

主轴和交叉轴:

主轴和交叉轴对齐:

弹性容器的属性:

弹性项目的属性:

添加伪元素

多行的元素垂直居中vertical-align:父元素内的所有元素垂直位置互相挨在一起居中(排排坐,居中但不垂直,可以自己试试)如果有一个方块变成了高度100%,那么其他的方块就会真正的垂直居中![[Pasted image 20240407223048.png]]

.div1{
    width: 200px;
    height: 150px;
    border: 1px solid #000;
    text-align: center;
}
.pinkbox{
    width: 30px;
    height: 30px;
    background-color: pink;
    display: inline-block;
    vertical-align: middle;
}
.greenbox {
    width: 30px;
    height: 100%;
    background-color: rgb(175, 233, 175);
    display: inline-block;
    vertical-align: middle;
}
.yellowbox {
    width: 30px;
    height: 60px;
    background-color: rgb(249, 249, 182);
    display: inline-block;
    vertical-align: middle;
}

但是不能每次垂直居中都要写一个奇怪的div在里面充当100%柱子,所以添加伪元素:利用::before和::after添加div,让这个“伪”div的高度100%,就可以让其他的div都居中。div记得要把display设为inline-blockvertical-align:middle;是针对行内元素,div本身是block

.div1::before{
  content:'';
  width:0;
  height:100%;
  display:inline-block;
  position:relative;
  vertical-align:middle;
  background:#f00;
}

calc动态计算

如果div必须要是block,用calc动态计算,让要居中的div的top属性,与上方的距离是“50%的外框高度+ 50%的div高度”,就可以做到垂直居中,至于为什么不用margin-top,因为margin相对的是水平宽度(相对于父级盒子的),必须要用top才会正确。![[Pasted image 20240408142553.png|373]]![[051023d15da4230d8b68615e8cba490e.png|625]]

.div2 {
    width: 200px;
    height: 150px;
    border: 1px solid#000;
}
  
.blackbox {
    width: 30px;
    height: 30px;
    background-color: black;
    float: left;
    top: calc(50% - 15px);
    margin-left: calc(50% - 45px);
}
  
.redbox {
    width: 30px;
    height: 80px;
    background-color: red;
    float: left;
    top: calc(50% - 40px);
}
.gerybox{
    width: 30px;
    height: 40px;
    background-color: #444141;
    float: left;
    top: calc(50% - 20px);
}

补充知识点:==display属性==,控制元素如何在页面中显示

static:默认值。正常的文档流进行定位,即元素出现在其在HTML代码中的位置。top、right、bottom、left和z-index属性对static定位的元素无效。

relative:相对定位的元素相对于其正常位置进行定位。使用top、right、bottom或left属性,不会脱离文档流。

absolute:绝对定位的元素相对于最近的已定位祖先元素(即position不是static的祖先元素)如果没有已定位的祖先元素,那么它会相对于初始包含块进行定位,通常是浏览器窗口。会脱离文档流,这意味着它们不会影响其他元素的位置

fixed:固定定位的元素相对于浏览器窗口进行定位,即使页面滚动,它也始终会停留在同一的位置。固定定位的元素也会脱离文档流。

sticky:粘性定位可以被看作是相对定位和固定定位的混合。元素在跨越特定滚动阈值之前为相对定位,之后为固定定位。这常用于实现滚动到特定位置时元素固定在视口的效果。

inherit:元素继承其父元素的position属性值。

在使用position属性时,还应考虑z-index属性,它控制元素的堆叠顺序(哪个元素在另一个元素的上面或下面)。对于已定位的元素(即position不是static的元素),z-index属性有效。

表格

在表格这个HTML里面常用的DOM里,只需要下一行vertical-align:middle就可以。表格与单元格(table和table-cell)是 HTML(HyperText Markup Language)中的一个标签,它代表表格中的一个数据单元格(table data)。当display属性设置为table-cell时,它会使元素表现得像一个表格单元格。这意味着,尽管元素可能不是或其他表格相关元素,但它会遵循表格单元格的某些布局和行为规则。(二者差不多)

DOM是“文档对象模型”(Document Object Model)的缩写。是网页的编程接口,它将web页面和脚本或编程语言连接了起来。HTML:

<table>
    <tr>
        <td>
            <div>表格垂直居中div>
        td>
    tr>
table>
<div class="like-table">
    <div>假的表格垂直居中div>
div>

CSS:

.like-table{
    display:table-cell;
}
td,
.like-table{
    width:150px;
    height:100px;
    border:1px solid #000;
    vertical-align: middle;
}
td div,
.like-table div{
    width:100px;
    height:50px;
    margin:0 auto;
    color:#fff;
    font-size:12px;
    line-height: 50px;
    text-align: center;
    background:#c00;
}
.like-table div{
    background:#069;
}

transform

transform属性:平移:transform:translate(100px,- 50px)

![[Pasted image 20240408171509.png|198]]

.use-transform{
    width: 200px;
    height: 200px;
    border: 1px solid #000;
    position: relative;
}
.use-transform div{
    position: absolute;
    width: 100px;
    height: 50px;
    top: 50%;
    transform: translateY(-50%);
    background-color: rgb(200, 210, 219);
}
/*水平居中 横着在中间
垂直居中  竖着在中间
水平垂直居中  横竖都在中间*/

绝对定位

子绝父相

.use-absolute{
    position: relative;
    width:200px;
    height:150px;
    border:1px solid #000;
}
.use-absolute div{
    position: absolute;
    width:100px;
    height:50px;
    top:0;
    right:0;
    bottom:0;
    left:0;
    margin:auto;
    background:#f60;
}

用负margin