目錄
前言
居中元素寬高已知
1、absolute + margin auto
2、absolute + 負 margin
3、absolute + calc
居中元素寬高未知
1、absolute + transform
2、line-height + vertical-align
3、table 表格元素(不推薦)
4、css-table(display:table-cell)
5、flex 布局(推薦)
6、flex + margin auto
7、grid 網格布局(一)
8、grid 網格布局(二)
場景推薦
前言
無論是實際開發中,還是求職面試中,css 垂直居中往往都是一個繞不開的話題,其中有許多面試者在遭受多次打擊之后,卻沒有一個很好的反擊點,剛好結合自己的經歷與痛處,來給大家一個錘爆面試官大佬們的機會,
垂直居中主要分為了兩種型別:居中元素寬高已知 和 居中元素寬高未知,那么我們就結合這兩種型別來一一舉例,
居中元素寬高已知
1、absolute + margin auto
注意:父元素與當前元素的寬高已知
.parent{
position: relative;
width: 500px;
height: 500px;
border: 1px solid blue;
}
.child{
background: green;
width: 200px;
height: 200px;
/* 核心代碼 */
position:absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
}
2、absolute + 負 margin
注意:負 margin 是基于自身的高度和寬度來進行位移的(設定為自身的 -1/2)
.parent{
position:relative;
width: 500px;
height: 500px;
border: 1px solid blue;
}
.child{
background: green;
width: 200px;
height: 200px;
/* 核心代碼 */
position:absolute;
top: 50%;
left: 50%;
margin-top: -100px;
margin-left: -100px;
}
3、absolute + calc
注意:使用 CSS3 的一個計算函式來進行計算(相當于負 margin 的簡化版)
.parent{
position:relative;
width: 500px;
height: 500px;
border: 1px solid blue;
}
.child{
background: green;
width: 200px;
height: 200px;
/* 核心代碼 */
position:absolute;
top: calc(50% - 100px);
left: calc(50% - 100px);
}
居中元素寬高未知
1、absolute + transform
注意:transform 的 translate 屬性值如果是一個百分比,那么這個百分比是基于自身的寬高進行計算
.parent{
position: relative;
width: 500px;
height: 500px;
border: 1px solid blue;
}
.child{
background: green;
/* 核心代碼 */
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
2、line-height + vertical-align
把當前元素設定為行內元素,然后通過設定父元素的 text-align: center來實作水平居中;同時通過設定當前元素的 vertical-align: middle來實作垂直居中;最后設定當前元素的 line-height: initial來繼承父元素的line-height
.parent{
width: 500px;
border: 1px solid blue;
/* 核心代碼 */
line-height: 500px;
text-align: center;
}
.child{
background: green;
/* 核心代碼 */
display: inline-block;
vertical-align: middle;
line-height: initial;
}
3、table 表格元素(不推薦)
通過經典的table來進行布局(不推薦)
<table>
<tbody>
<tr>
<td class="parent">
<div class="child"></div>
</td>
</tr>
</tbody>
</table>
<style>
.parent{
width: 500px;
height: 500px;
border: 1px solid blue;
/* 核心代碼 */
text-align: center;
}
.child{
background: green;
/* 核心代碼 */
display: inline-block;
}
</style>
4、css-table(display:table-cell)
不寫 table 元素,也可以使用 table 的特性,需使用 css-table(display:table-cell)
.parent{
width: 500px;
height: 500px;
border: 1px solid blue;
/* 核心代碼 */
display: table-cell;
text-align: center;
vertical-align: middle;
}
.child{
background: green;
/* 核心代碼 */
display: inline-block;
}
5、flex 布局(推薦)
.parent{
width: 500px;
height: 500px;
border: 1px solid blue;
/* 核心代碼 */
display: flex;
/* 水平居中 */
justify-content: center;
/* 垂直居中 */
align-items: center;
}
.child{
background: green;
}
justify-content:設定或檢索彈性盒子元素在主軸(橫軸)方向上的對齊方式;
align-items:設定或檢索彈性盒子元素在側軸(縱軸)方向上的對齊方式,
更多細節請參考本人對flex布局的詳細介紹
Css 彈性布局(Flex)詳細介紹(Flex 屬性詳解、場景分析)_前端不釋卷leo的博客-CSDN博客_flex布局前言我們知道,網頁展示就好比一個個盒子堆疊在一起,通過調整盒子的大小、位置、樣式等,形成了各式各樣的頁面,當我們在開發一個頁面的時候,我們常規的做法可能是:搭建框架、劃磁區域、定制排版、調整位置、嵌入內容、微調與增添樣式,今天所介紹的是基礎且關鍵的一環--布局排版,其中,展開布局中常用的技術:Flex布局,Flex布局是什么?Flex 是 Flexible Box 的縮寫,意為"彈性布局",用來為盒狀模型提供最大的靈活性,任何一個容器都可以指定為 Flex 布局,.box {https://blog.csdn.net/qq_41809113/article/details/121869338?spm=1001.2014.3001.5502
6、flex + margin auto
.parent{
width: 500px;
height: 500px;
border: 1px solid blue;
/* 核心代碼 */
display: flex;
}
.child{
background: green;
/* 核心代碼 */
margin: auto;
}
7、grid 網格布局(一)
注意:由于grid布局實在是太超前,導致了兼容性不是那么理想
.parent{
width: 500px;
height: 500px;
border: 1px solid blue;
/* 核心代碼 */
display: grid;
justify-content: center;
align-items: center;
}
.child{
background: green;
}
仔細觀察,以上樣式與flex相似,且主要在父元素設定,
8、grid 網格布局(二)
跟第7點不同,以下主要在子元素設定
.parent{
width: 500px;
height: 500px;
border: 1px solid blue;
/* 核心代碼 */
display: grid;
}
.child{
background: green;
/* 核心代碼 */
justify-self: center;
align-self: center;
}

場景推薦
PC 端有兼容性要求并且寬高固定,推薦使用 absolute + margin: auto 方法實作;
PC 端有兼容性要求并且寬高不固定,推薦使用 css-table(display:table-cell)方式實作;
PC 端無兼容性要求 ,推薦使用 flex ,如果不考慮 IE 的話,grid 也是個不錯的選擇;
移動端 ,推薦使用 flex ,grid 也可作為備選,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/402763.html
標籤:其他
