CSS重难点之垂直居中

    技术2025-08-14  30

    文章目录

    1. 为何实现垂直居中难?2. 垂直居中的实现

    1. 为何实现垂直居中难?

    历史遗留问题

    起初,Web页面就是文档流的形式,它是不关注“页面高度”这个概念的,也没有“页”的概念。

    Web页面就像一卷纸,需要浏览更多内容,可以下拉页面。

    另外,实现垂直居中的属性,需要设计很多复杂的问题,如:

    同一容器内有浮动元素和相对定位元素时,中线如何界定

    同一元素即浮动又垂直居中改如何定位

    2. 垂直居中的实现

    CSS 元素可分为三类:inline、block、inline-block

    方案一:line-height 方法

    仅适用于单行文本,换行后失效

    需要父容器高度已知

    文本的line-height设置为父容器高度即可

    父容器设置 text-align: center; 表示容器内文本对齐方式水平居中

    #container { width: 500px; height: 200px; background: pink; text-align: center; } #line { background: white; line-height: 200px }

    方案二:position定位 + transform:translate(x,y)

    适用于多行文本(前提是父容器高度足够高)

    适用于块级元素

    适用于父容器尺寸未知情况

    父容器相对定位,子元素绝对定位

    translate() 参数为百分数,表示位移距离为元素本身尺寸的百分比 relative(相对定位):定位原点是元素本身所在位置; absolute(绝对定位):定位原点是离自己这一级元素最近的一级position设置为absolute或者relative的父元素的左上角为原点的 <!DOCTYPE html> <html> <head> <meta chaset="utf-8"> <title>inline 元素垂直居中</title> <style> #container { width: 500px; height: 200px; background: pink; position: relative; } #line { background: white; position: absolute; top: 50%; transform: translateY(-50%); } </style> </head> <body> <div id="container"> <span id="line">我是 inline 元素</span> </div> </body> </html>

    补充:position定位 + calc() 指定子元素宽高实现水平垂直居中

    calc() 参数为百分数,表示的是相对父元素的尺寸

    适用于父容器尺寸未知的情况

    #container { width: 500px; height: 200px; background: pink; position: relative; } #line, #id1 { background: red; position: absolute; left: 40px; top:20px; height: calc(100% - 40px); width: calc(100% - 80px); }

    方案三:display: table

    适用于多行文本

    适用于块级元素

    父容器无法设置背景色

    子元素设置 display: table-cell; vertical-align: middle;表示单元格垂直 居中对齐

    子元素增加 text-align: center 可实现单元格水平居中对齐

    #container { width: 500px; height: 500px; border: 2px solid pink; display: table; } #line { display: table-cell; vertical-align: middle; text-align: cente }

    方案四:display: flex

    适用于多行文本

    适用于块级元素

    父容器设置 align-items: center;表示内部元素垂直居中对齐

    父容器设置 justify-content: center; 可以实现内部元素水平居中对齐

    #container { width: 500px; height: 500px; border: 2px solid pink; display: flex; align-items: center; justify-content: center } #line { background: pink; }

    方案五:display: grid

    Processed: 0.011, SQL: 9