在學(xué)習(xí)前端的過程中,發(fā)現(xiàn)元素和文本的水平居中和垂直居中叮阅,是經(jīng)常會(huì)出現(xiàn)的問題刁品,在實(shí)際工作中也會(huì)經(jīng)常碰到。居中的技巧有很多浩姥,原以為自己掌握了這些技巧就行了挑随,但在編寫代碼的過程中,發(fā)現(xiàn)有時(shí)候技巧管用勒叠,有時(shí)候不管用兜挨,于是就將每個(gè)知道的方案都試一遍,找到合適的眯分。這種情況究其原因是對居中的認(rèn)識不夠深入拌汇,只是停留在實(shí)現(xiàn)需求的水平上。為了更好的加深對居中的理解弊决,搜集和閱讀相關(guān)資料噪舀,并將所得總結(jié)在此。
居中是什么
居中故名思意就是將物體放置在其容器的中間飘诗,在css中居中就是指元素与倡、文本、圖片等相對其容器或父元素或?yàn)g覽器窗口能夠居中顯示昆稿。而根據(jù)顯示方式的不同纺座,又分為水平居中,垂直居中,水平垂直居中。下面就分情況對居中進(jìn)行討論浪规。
水平居中
水平居中我們常見的一種解決方案就是設(shè)置text-align:center
衬衬,然而我們會(huì)發(fā)現(xiàn)這種方式有時(shí)候有效,有時(shí)候卻沒有效果。這是因?yàn)槲覀冊谑褂孟嚓P(guān)方法的時(shí)候并沒有對塊級元素和行內(nèi)元素進(jìn)行區(qū)分,不同類型的元素其居中方法是不同的:
當(dāng)元素為行內(nèi)元素時(shí)(如文本,鏈接)
當(dāng)需要居中的元素為行內(nèi)元素時(shí)掸掸,你可以通過在其父元素(必須是塊級元素)設(shè)置如下css樣式:
.parent {
text-align:center;
}
示例代碼
這種方法對display設(shè)置為inline、inline-block、inline-table扰付、inline-flex的元素都有效堤撵。
塊級元素居中
對于一個(gè)塊級元素你可以通過設(shè)置其margin屬性,來達(dá)到水平居中的效果羽莺。你可以將其margin-left和margin-right設(shè)置為auto:
.center{
margin:0 auto;
}
這樣瀏覽器就會(huì)根據(jù)元素的寬度自動(dòng)為元素左右兩邊設(shè)定等寬的margin实昨,來達(dá)到水平居中的效果。這里需要注意的是元素需要設(shè)定width屬性盐固,否則元素的寬度會(huì)自動(dòng)充滿父元素荒给,就不存在相對父元素水平居中一說了。
示例代碼
這里需要注意的是這種方法對設(shè)置float屬性的塊級元素是沒有效果的刁卜,浮動(dòng)元素的居中這里有一個(gè)解決方案志电,但是該方法的布局比較混亂,子元素脫出父元素蛔趴,并不推薦挑辆。
另外有一個(gè)tricks,能夠?qū)崿F(xiàn)如下圖中
當(dāng)有多個(gè)塊級元素時(shí)
當(dāng)你需要對多個(gè)塊級元素進(jìn)行居中顯示時(shí),如果塊級元素如下垂直排列:
margin:0 auto;
就可以輕松實(shí)現(xiàn)魁亦。但如果如下排列:
那么就可以使用
display:inline-block
將多個(gè)塊元素單行顯示,同時(shí)由于inline的緣故羔挡,可以在父元素設(shè)置text-align:center
將多個(gè)塊元素居中吉挣,當(dāng)然也可以將元素設(shè)置為display:flex; justify-content: center;
達(dá)到居中效果。詳細(xì)代碼示例
垂直居中
垂直居中相比于水平居中婉弹,就復(fù)雜一些,還是分塊級與行內(nèi)進(jìn)行討論终吼。
inline或inline-block元素
單行垂直居中的情況
當(dāng)父元素沒有設(shè)定寬度镀赌,而是根據(jù)內(nèi)容自適應(yīng)時(shí),簡單的設(shè)置padding就可以達(dá)到垂直居中的效果际跪,如:
css:
.p{ border: 1px solid yellow;padding: 80px;}
.p a{
background-color: black;
color: white;
border: 2px solid red;
padding: 30px; /*相同的上下內(nèi)距實(shí)現(xiàn)垂直居中*/
}
html:
<div class="p">
<a href="#">asldkjflkadfk</a>
</div>
在某些情況下設(shè)置padding并不能滿足需求商佛,而你又需要將一段單行顯示的文本居中,這時(shí)你可以將line-height和height屬性設(shè)置為等高來達(dá)到目的:
html:
<main><div>I'm a centered line.</div></main>
css:
main {
background: white;
margin: 20px 0;
padding: 40px;
}
main div {
background: black;
color: white;
height: 100px; /*行高與line-height相同*/
line-height: 100px;
padding: 20px;
width: 50%;
white-space: nowrap;
}
示例代碼
關(guān)于line-height姆打,有許多需要了解和注意的地方良姆,想詳細(xì)了解為什么這么這種方法可以實(shí)現(xiàn)垂直居中,可以參見這篇文章
多行垂直居中
設(shè)置padding同樣可以使多行文本居中幔戏,但有時(shí)當(dāng)文本出現(xiàn)在表格單元格里或其他情況也會(huì)使該方法無效玛追。這時(shí)會(huì)用到vertical-align屬性,
示例代碼
更多關(guān)于vertical—align的信息,可以點(diǎn)擊這里和這篇
需要指出的是只有一個(gè)元素屬于inline或是inline-block(table-cell也可以理解為inline-block水平)水平痊剖,其身上的vertical-align屬性才會(huì)起作用
如果table—like不行韩玩,也許你可以試一下flex-parent, 一個(gè)flex-child可以很輕易的在flex-parent里垂直居中:
.flex-center-vertically {
display: flex;
justify-content: center;
flex-direction: column;
height: 400px;
}
示例代碼
需要注意的是父容器必須有一個(gè)固定的高度。
如果上述2中方法都不可行陆馁,你就需要借助偽元素找颓,也就是在父容器里添加一個(gè)高度占滿整個(gè)父元素的偽元素,文本就居中顯示在里面叮贩。
.ghost-center {
position: relative;
}
.ghost-center::before {
content: " ";
display: inline-block;
height: 100%;
width: 1%;
vertical-align: middle;
}
.ghost-center p {
display: inline-block;
vertical-align: middle;
}
塊級元素垂直居中
當(dāng)你知道元素的高度時(shí)
如果你知道元素的高度击狮,那么你可以這樣實(shí)現(xiàn)垂直居中:
.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; */ /*這里可以使用transform:translate(-50%)實(shí)現(xiàn)同樣的效果*/
}
上述代碼是通過定位的方式,來實(shí)現(xiàn)垂直居中益老,子元素參照父元素進(jìn)行絕對定位彪蓬,相對于父元素的上邊緣向下移動(dòng)50%(父元素高度的50%),然后通過margin-top元素將子元素向上拉自身的50%杨箭,達(dá)到最終的居中寞焙。
完整示例代碼
當(dāng)元素的高度未知時(shí)
當(dāng)元素高度未知時(shí)可以如下,本質(zhì)原理與上述相似:
.parent {
position: relative;
}
.child {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
使用flexbox
使用flexbox無疑是種簡單有效的解決方案:
.parent {
display: flex;
flex-direction: column;
justify-content: center;
}
既水平居中又垂直居中
你可以將上述方法進(jìn)行合理的組合互婿,來達(dá)到水平垂直居中捣郊,總結(jié)一下,可分為如下三種情況:
元素是否具有固定的寬高
在通過將元素定位50%/50%后慈参,再設(shè)置一個(gè)高度和寬度一半大小的負(fù)值給 margin呛牲,能夠很好的居中,并且支持大多數(shù)瀏覽器:
.parent {
position: relative;
}
.child {
width: 300px;
height: 100px;
padding: 20px;
position: absolute;
top: 50%;
left: 50%;
margin: -70px 0 0 -170px;
}
當(dāng)寬高未知時(shí)
當(dāng)你不知道寬高時(shí)驮配,你可以使用transform屬性娘扩,設(shè)置translate(-50%)
,這里的50%是相對與元素本身的寬高壮锻。
.parent {
position: relative;
}
.child {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
使用flexbox
想要水平垂直居中琐旁,你需要設(shè)置兩個(gè)居中屬性
.parent {
display: flex;
justify-content: center;
align-items: center;
}
原文鏈接:
https://css-tricks.com/centering-css-complete-guide/
相關(guān)文章:
https://css-tricks.com/float-center/
居中代碼生成工具:http://howtocenterincss.com/