[轉載]CSS居中完全指南
原載於CSS-Trick,本文著重提取文中的方法,不完全翻譯。如有需要,直接原文檢視。
人們經常抱怨在CSS中居中元素的問題,其實這個問題其實並不複雜,只是因為方法眾多,需要根據情況從眾多方法中選取一個出來。接下來,我們做一個‘決定樹’來幫我們把問題變的簡單一點。首先你需要居中:
水平
需要居中
inline
或者inline-*
元素(如文字或者連結)?需要居中
block
類的元素?需要居中多個
block
元素?
垂直
需要居中
inline
或者inline-*
元素(如文字或者連結)?需要居中
block
類的元素?
既水平又垂直
固定寬高
不固定寬高
使用
flexbox
水平居中
水平居中 inline
或者 inline-*
元素
你可以輕鬆的在一個 block
元素中水平居中一個 inline
元素,以下程式碼對 inline
,inline-block
,inline-table
和 inline-flex
等有效
.parent {
text-align: center;
}
水平居中 block
類的元素
在 block
元素被設定固定寬度的情況下,可以使用設定元素 margin-left
和 margin-right
的值為 auto
的方法實現水平居中。
.child {
width: 400px;
margin : 0 auto;
}
水平居中多個 block
類的元素
通過 inline-block
實現
.parent {
text-align: center;
}
.child {
display: inline-block;
text-align: left;
}
通過 flexbox
實現
.parent {
display: flex;
justify-content: center;
}
垂直居中
垂直居中 inline
或者 inline-*
元素
單行
inline/text
元素可以簡單的用設定相同的上下 padding
值達到垂直居中的目的。
.center {
pading-top: 30px;
padding-bottom: 30px;
}
如果因為某種原因不能使用 padding
的方法,你還可以設定 line-height
等於 height
來達到目的。
.center {
height: 100px;
line-height: 100px;
white-space: nowrap;
}
多行
相同的上下 padding
也可以適用於此種情況,如果不能生效,你可以嘗試將該元素的父元素的 dispaly
設定為 table
,同時該元素的 dispaly
設定為 table-cell
,然後設定 vertical-align
。
.parent {
display: table;
width: 200px;
height: 400px;
}
.child {
display: table-cell;
vertical-align: middle;
}
如果上述方法不能使用,你可以嘗試使用 flexbox
,一個單獨的 flexbox
子元素可以輕易的在其父元素中居中。謹記,這種方法需要父元素有固定的高度。
.parent {
display: flex;
justify-content: center;
flex-direction: column;
height: 400px;
}
如果上述兩種方式均不能使用,你可以使用“幽靈元素”技術,這種方法採用偽元素 ::before
撐開高度 ,文字垂直居中。
.parent {
position: relative;
}
.parent::before {
content: " ";
display: inline-block;
height: 100%;
width: 1%;
vertical-align: middle;
}
.child {
display: inline-block;
vertical-align: middle;
}
轉載說明,上面的程式碼是原文給的。但是這段程式碼會產生一些問題,我在另外一篇博文中闡釋了原因以及解決方案,請移步 CSS 幽靈元素方案垂直居中注意事項
垂直居中 block 類的元素
已知元素高度
.parent {
position: relative;
}
.child {
position: absolute;
top: 50%;
height: 100px;
margin-top: -50px; /* account for padding and border if not using box-sizing: border-box; */
}
未知元素高度
.parent {
position: relative;
}
.child {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
使用 flexbox
.parent {
display: flex;
flex-direction: column;
justify-content: center;
}
既水平又垂直
固定寬高
.parent {
position: relative;
}
.child {
width: 300px;
height: 100px;
padding: 20px;
position: absolute;
top: 50%;
left: 50%;
margin: -70px 0 0 -170px;
}
不固定寬高
.parent {
position: relative;
}
.child {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
使用 flexbox
.parent {
display: flex;
justify-content: center;
align-items: center;
}