摘要:為了更好的加深對(duì)居中的理解,搜集和閱讀相關(guān)資料,發(fā)現(xiàn)不錯(cuò)的文章將其整理出來。
在學(xué)習(xí)前端的過程中,發(fā)現(xiàn)元素和文本的水平居中和垂直居中,是經(jīng)常會(huì)出現(xiàn)的問題,在實(shí)際工作中也會(huì)經(jīng)常碰到。居中的技巧有很多,但在編寫代碼的過程中,發(fā)現(xiàn)有時(shí)候技巧管用,有時(shí)候不管用,于是就將每個(gè)知道的方案都試一遍,找到合適的。這種情況究其原因是對(duì)居中的認(rèn)識(shí)不夠深入,只是停留在實(shí)現(xiàn)需求的水平上。為了更好的加深對(duì)居中的理解,搜集和閱讀相關(guān)資料,發(fā)現(xiàn)不錯(cuò)的文章將其整理出來。原文參考:https://css-tricks.com/center...
居中是什么居中故名思意就是將物體放置在其容器的中間,在css中居中就是指元素、文本、圖片等相對(duì)其容器或父元素或?yàn)g覽器窗口能夠居中顯示。而根據(jù)顯示方式的不同,又分為水平居中,垂直居中,水平垂直居中。下面就分情況對(duì)居中進(jìn)行討論。
水平居中水平居中我們常見的一種解決方案就是設(shè)置text-align:center,然而我們會(huì)發(fā)現(xiàn)這種方式有時(shí)候有效,有時(shí)候卻沒有效果。這是因?yàn)槲覀冊(cè)谑褂孟嚓P(guān)方法的時(shí)候并沒有對(duì)塊級(jí)元素和行內(nèi)元素進(jìn)行區(qū)分,不同類型的元素其居中方法是不同的:
當(dāng)元素為行內(nèi)元素時(shí)(如文本,鏈接)當(dāng)需要居中的元素為行內(nèi)元素時(shí),你可以通過在其父元素(必須是塊級(jí)元素)設(shè)置如下css樣式:
.parent { text-align:center; }
示例代碼
這種方法對(duì)display設(shè)置為inline、inline-block、inline-table、inline-flex的元素都有效。
對(duì)于一個(gè)塊級(jí)元素你可以通過設(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)充滿父元素,就不存在相對(duì)父元素水平居中一說了。
示例代碼
這里需要注意的是這種方法對(duì)設(shè)置float屬性的塊級(jí)元素是沒有效果的,浮動(dòng)元素的居中這里有一個(gè)解決方案,但是該方法的布局比較混亂,子元素脫出父元素,并不推薦。
另外有一個(gè)tricks,能夠?qū)崿F(xiàn)如下圖中
文字環(huán)繞圖片居中的效果,具體參見這篇文章。
當(dāng)有多個(gè)塊級(jí)元素時(shí)當(dāng)你需要對(duì)多個(gè)塊級(jí)元素進(jìn)行居中顯示時(shí),如果塊級(jí)元素如下垂直排列:
,那么簡單的設(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ù)雜一些,還是分塊級(jí)與行內(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:
在某些情況下設(shè)置padding并不能滿足需求,而你又需要將一段單行顯示的文本居中,這時(shí)你可以將line-height和height屬性設(shè)置為等高來達(dá)到目的:
html: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; } I"m a centered line.
示例代碼
關(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; }
完整示例
塊級(jí)元素垂直居中 當(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)行絕對(duì)定位,相對(duì)于父元素的上邊緣向下移動(dòng)50%(父元素高度的50%),然后通過margin-top元素將子元素向上拉自身的50%,達(dá)到最終的居中。
完整示例代碼
當(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%是相對(duì)與元素本身的寬高。
.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; }
完整代碼
相關(guān)文章:
https://css-tricks.com/float-...
http://www.zhangxinxu.com/wor...
居中代碼生成工具:http://howtocenterincss.com/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/111553.html
摘要:布局方式布局的傳統(tǒng)解決方案,基于盒狀模型,依賴屬性屬性屬性。它對(duì)于那些特殊布局非常不方便,比如,垂直居中就不容易實(shí)現(xiàn)。關(guān)于布局,當(dāng)然肯定還有更多的更好的方法。 接觸前端開發(fā)也有半年了,每當(dāng)需要將一個(gè)空白的紙,畫成一個(gè)頁面的時(shí)候,總會(huì)出現(xiàn)不知所措的幾秒鐘。除了因?yàn)閷?duì)css中的各種屬性的不熟練之外,更難為人的是怎么簡練的將這些屬性排列組合起來。其實(shí)靜下心來,仔細(xì)想一想,無非就是整體-->局...
摘要:高度模型淺識(shí)為的簡寫,簡稱為塊級(jí)格式化上下文,為瀏覽器渲染某一區(qū)域的機(jī)制,中只有和中還增加了和。并非所有的布局都會(huì)在開發(fā)中使用,但是其中也會(huì)涉及一些知識(shí)點(diǎn)。然而在不同的純制作各種圖形純制作各種圖形多圖預(yù)警 一勞永逸的搞定 flex 布局 尋根溯源話布局 一切都始于這樣一個(gè)問題:怎樣通過 CSS 簡單而優(yōu)雅的實(shí)現(xiàn)水平、垂直同時(shí)居中。記得剛開始學(xué)習(xí) CSS 的時(shí)候,看到 float 屬性不...
摘要:居中在前端布局上很常見,也很常用,也是最基本的技巧。居中效果在方向控制上基本可以分解成水平居中,垂直居中和水平垂直居中。針對(duì)調(diào)整的元素不同,具體的處理方式上有些差異。這里我們先不講絕對(duì)定位下的居中,絕對(duì)定位下的居中方法很多,變化也多?! 【又性谇岸瞬季稚虾艹R?,也很常用,也是最基本的技巧。居中效果在方向控制上基本可以分解成水平居中,垂直居中和水平垂直居中。 針對(duì)調(diào)整的元素不同,具體的處理...
摘要:黃金檔未垂直對(duì)齊同一行的一組為的使用了或者是時(shí),如果某個(gè)的內(nèi)部標(biāo)簽中填充一些文字等內(nèi)容,可能就會(huì)出現(xiàn)垂直不對(duì)齊的情況。解決方法倒不難的應(yīng)用會(huì)被其他一些屬性破壞,例如和,所以與或是屬性最好不要同用。 工作上,除了Django和一些并不復(fù)雜的腳本以外,其余時(shí)間寫了大量的CSS和jQuery,現(xiàn)在回頭看之前的一些代碼,寫得十分丑陋又低效,其中的CSS就有很大改進(jìn)空間。正如多數(shù)人的認(rèn)知一樣,H...
閱讀 3257·2023-04-25 20:35
閱讀 3616·2019-08-30 15:54
閱讀 1995·2019-08-30 15:43
閱讀 2185·2019-08-29 15:14
閱讀 1892·2019-08-29 11:17
閱讀 3383·2019-08-26 13:36
閱讀 700·2019-08-26 10:15
閱讀 2838·2019-08-23 15:41