css多行垂直水平居中--table布局大法

======= SEO專用

  • table-cell
  • 定高水平垂直居中
  • 不定高水平垂直居中
  • 單行定高水平垂直居中
  • 單行不定高水平垂直居中
  • 多行定高水平垂直居中
  • 多行不定高水平垂直居中
  • 多列等高布局
  • 左邊定寬右邊自適應(yīng)布局
  • 左邊右邊定寬中間自適應(yīng)三列布局
    =======

最近開發(fā)遇到一些布局上的問題,由于不確定因素比較多,比如不定寬高毅人、單行多行的情況需要顯示的樣式基本相同润绵。這樣的情況會(huì)比較復(fù)雜茎刚,后來找到display:table-cell這個(gè)布局神器蚁袭,這些問題也就不是問題了。比如以下這種情況:

單行|多行|定寬高|不定寬高水平垂直居中.png

基于這樣的需求枝秤,我們通常都是每一種情況需要單獨(dú)的寫一份hack樣式嗽交,這樣寫起來很麻煩卿嘲。我們多么希望寫一份樣式,不管你里面的節(jié)點(diǎn)如何變夫壁,定不定寬高拾枣,多行與否都能表現(xiàn)一致。針對(duì)水平|垂直居中的情況盒让,我找到了table-cell布局的方式梅肤,基本能解決。下面會(huì)總結(jié)一下table-cell的布局原理以及列舉一些日常布局所遇到的情況邑茄。

1姨蝴、table的一些特性與表現(xiàn)形式

雖然table布局因?yàn)樗囊恍┓钦Z義化、布局代碼冗余撩扒,以及不好維護(hù)改版等缺點(diǎn)被趕出了布局界似扔。但是在css不給力時(shí)期,table布局也曾風(fēng)靡一時(shí)搓谆,就算現(xiàn)在看來table的一些布局的特性也是非常給力的,而幸好css也吸取了table布局一些好的特性為己用豪墅。讓我們可以使用更少泉手、更語義化的標(biāo)簽來模擬table布局,可以跳過table布局的缺點(diǎn)又實(shí)現(xiàn)我們想要的效果偶器,所以我們首先需要了解table的一些特性以及對(duì)應(yīng)的css屬性斩萌。
我們?cè)诓痪又惺褂玫降囊簿褪莟able、tr屏轰、td的一些特性颊郎,所以我們只需要了解這三個(gè)標(biāo)簽的特性就足夠了。

  • table標(biāo)簽(display:table)
  1. table可設(shè)置寬高霎苗、margin姆吭、border、padding等屬性唁盏。屬性值的單位可以使用px内狸,百分比值检眯。
  2. table的寬度默認(rèn)由內(nèi)容的寬高撐開,如果table設(shè)置了寬度昆淡,寬度默認(rèn)被它里面的td平均分锰瘸,如果給某一個(gè)td設(shè)置寬度,那么table剩余的寬度會(huì)被其他的td平均分(有點(diǎn)類似flex布局)
  3. 給table設(shè)置的高度起到的作用只是min-height的作用昂灵,當(dāng)內(nèi)容的高度高于設(shè)置的高度時(shí)避凝,table的高度會(huì)被撐高。
  • tr標(biāo)簽(display:table-row)
  1. 給tr設(shè)置高度只起到min-height的作用眨补,默認(rèn)會(huì)平分table的高度管削。
  2. tr中的td默認(rèn)高度會(huì)繼承tr的高度,若給任一td設(shè)置了高度渤涌,其他td的高度也同樣變高佩谣。適合多列等高布局
  3. 設(shè)置寬度、margin实蓬、都不起作用
  • td標(biāo)簽(display:table-cell)
  1. td默認(rèn)繼承table的高度茸俭,且平分table的寬度
  2. 若table(display:table)不存在,給td設(shè)置的寬高不能用百分比只能用準(zhǔn)確的數(shù)值
  3. 給td設(shè)置vertical-align: middle; td元素里面(除float安皱、position:absolute)所有的塊級(jí)调鬓、非塊級(jí)元素都會(huì)相對(duì)于td垂直居中
  4. 給td設(shè)置text-align: center; td元素里面所有非block元素(除float、position:absolute)都會(huì)相對(duì)于td水平居中酌伊,雖然block元素不居中腾窝,但其中的文字或inline元素會(huì)水平居中

了解了table的一些屬性,當(dāng)我們遇到一些水平垂直居中的布局時(shí)居砖,就會(huì)變得so easy了虹脯。

2、圖片定高|不定高水平垂直居中

圖片本身就是inline-block元素奏候,那么我們只要給它的父級(jí)元素加個(gè)display:table-cell就好了

.box{
    height: 200px;
    width: 200px;
    display: table-cell;
    text-align: center;
    border: 1px solid #ccc;
    vertical-align: middle;
}
<div class="box">
    ![](https://ss1.baidu.com/70cFfyinKgQFm2e88IuM_a/forum/pic/item/242dd42a2834349b406751a3ceea15ce36d3beb6.jpg)
</div>

圖片定高|不定高水平垂直居中

就是那么簡單循集。demo

3、多行定高|不定高|定寬|不定寬水平垂直居中

我們平時(shí)常見的就是單行水平垂直居中蔗草,其實(shí)就是簡單的text-align:center; 然后再是line-height:xx 就搞定了咒彤。但是多行的就相對(duì)于復(fù)雜點(diǎn)。但是使用了table-cell之后咒精,就變得很簡單了

單個(gè)標(biāo)簽多行文字垂直居中

當(dāng)然镶柱,里面也可以是多個(gè)標(biāo)簽形成的多行,然后進(jìn)行水平垂直居中

多標(biāo)簽水平垂直居中

demo1 demo2
其實(shí)實(shí)現(xiàn)的原理還是使用table-cell模叙,先把外層box設(shè)置為table-cell歇拆,再把里面的元素設(shè)置為inline|inline-block(不定寬高|元素居中)或者block(寬度100%|文字居中)那么就可以控制里面的元素水平垂直居中了。基于這樣的布局方式查吊,你就可以把什么定高|不定高|定寬|不定寬|多行|單行的水平垂直居中都搞定了谐区。

4、左右浮動(dòng)元素垂直居中

由于display:table-cell對(duì)浮動(dòng)元素是不起作用的逻卖,當(dāng)我們需要兩個(gè)元素一個(gè)左浮動(dòng)一個(gè)右浮動(dòng)宋列,并且這連個(gè)元素還居中的時(shí)候。上面的方法就不起作用了评也。那我們可以換個(gè)法子炼杖,既然display:table-cell;的垂直居中不能直接對(duì)浮動(dòng)元素起作用,那就來個(gè)間接的嘛盗迟。給兩個(gè)浮動(dòng)的元素外面一個(gè)display:inline-block;的元素坤邪,并且清除浮動(dòng)。然后讓display:table-cell的垂直居中對(duì)inline-block元素起作用就好了罚缕。demo

Paste_Image.png

如果你的需求還需要在兩個(gè)浮動(dòng)的元素中再添加水平垂直居中的話艇纺,那么同樣的道理,只需要在這兩個(gè)元素中構(gòu)造符合table-cell布局的結(jié)構(gòu)就好了邮弹。

5黔衡、一行多列水平垂直居中

經(jīng)常會(huì)有這樣的需求,一列里面可能會(huì)有1腌乡、2盟劫、3個(gè)子元素,不管幾個(gè)都是要居中的与纽。有了table-cell就可以輕松解決了侣签。
實(shí)現(xiàn)原理也基本是把外層box設(shè)置為display:table-cell;然后設(shè)置居中。里面的元素item設(shè)置成inline或者line-block;就可以了急迂,不管里面的item的個(gè)數(shù)多少影所,都會(huì)居中的,包括item是圖片也會(huì)這樣僚碎。demo

Paste_Image.png
6型檀、多列等高布局

有這樣的需求,一行有三個(gè)item听盖,三個(gè)item的高度不定,但是這一行的三個(gè)item最終的高度以最高的那個(gè)為準(zhǔn)裂七。按照以前的做法要不就是砍掉需求皆看,必須定高。實(shí)在不行就是等加載完之后用js計(jì)算三個(gè)item的高度背零,然后把最高的高度給其他item設(shè)置高度腰吟。這樣有點(diǎn)惡心,并且會(huì)出現(xiàn)抖動(dòng)。有了table-cell之后毛雇,這個(gè)就不成問題了嫉称,因?yàn)樵谝粋€(gè)tr中,里面的td必須是等高的灵疮,而不管里面內(nèi)容的高度织阅。demo

Paste_Image.png
Paste_Image.png

認(rèn)證看代碼你會(huì)發(fā)現(xiàn)跟我們平時(shí)的定高布局布局不一樣,每行外面必須得有一個(gè)ul來保證里面item的等高震捣,并且里面還需要使用多余的li來控制間距荔棉。這樣做的原因是因?yàn)閠r里面的元素不會(huì)自動(dòng)換行,所以必須手動(dòng)換行蒿赢,給外面加個(gè)ul润樱,(說好的tr呢?)是這樣的羡棵,被設(shè)置為display:table-cell的元素會(huì)跟相鄰的兄弟元素共同生成一個(gè)虛擬的table壹若、tr把自己包起來,誰叫td只能包在table里面呢皂冰。但是你直接寫td標(biāo)簽是不會(huì)產(chǎn)生這樣的效果的店展。而使用多余的li來控制間距是因?yàn)閠able-cell元素不認(rèn)識(shí)margin,所以只能這樣做了灼擂。
在生成機(jī)構(gòu)的時(shí)候就需要判斷什么時(shí)候該換行了壁查,而不是像以前一樣在一個(gè)ul里面生成全部的li了

7、左邊定寬右邊自適應(yīng)

demo

Paste_Image.png

8剔应、左邊右邊定寬中間自適應(yīng)三列布局

demo

Paste_Image.png

總結(jié):
使用table-cell還可以實(shí)現(xiàn)很多的布局睡腿,需要自己去發(fā)揮想象【總結(jié)下來也就需要記住幾點(diǎn)席怪,設(shè)置了display:table-cell的元素具有以下特性。

  1. text-align纤控、vertical-align等對(duì)齊屬性起作用挂捻,margin不起作用。寬高百分比值不起作用船万。
  2. 會(huì)生成虛擬的table刻撒、tr把自己包裹住,如果有相鄰的兄弟元素也被設(shè)置了table-cell,則會(huì)跟兄弟元素一起生成虛擬的table耿导、tr把自己包裹住声怔,并一行等高顯示
  3. 多個(gè)table-cell元素會(huì)占滿被設(shè)置了display: table的元素的寬度,如果一個(gè)元素被設(shè)置了寬度舱呻,那么其他剩余的table-cell元素會(huì)占滿剩下的寬度醋火。當(dāng)然,如果只有一個(gè)table-cell元素,就算設(shè)置了寬度也會(huì)占滿table元素的寬度芥驳。
  4. 對(duì)設(shè)置了float柿冲、absolute的元素不起作用。且IE6兆旬、7不支持

這就是所謂的table布局大法假抄。

display: inline-block

  • inline-block元素把自己變成特殊的inline元素,對(duì)于相鄰的元素來說表現(xiàn)出inline的特點(diǎn)爵憎,允許空格慨亲。對(duì)于內(nèi)部元素來說表現(xiàn)出block元素的特點(diǎn),可以設(shè)置高度和寬度宝鼓。
  • 空格是兩個(gè)標(biāo)簽中存在換行符or制表符or空格符(其實(shí)就是縮進(jìn))的原因生產(chǎn)的刑棵,只需要給設(shè)置了inline-block屬性的父元素設(shè)置font-size:0,就可以使標(biāo)簽中的空格失去寬度
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市愚铡,隨后出現(xiàn)的幾起案子蛉签,更是在濱河造成了極大的恐慌,老刑警劉巖沥寥,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碍舍,死亡現(xiàn)場離奇詭異,居然都是意外死亡邑雅,警方通過查閱死者的電腦和手機(jī)片橡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淮野,“玉大人捧书,你說我怎么就攤上這事≈栊牵” “怎么了经瓷?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洞难。 經(jīng)常有香客問我舆吮,道長,這世上最難降的妖魔是什么队贱? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任色冀,我火速辦了婚禮,結(jié)果婚禮上柱嫌,老公的妹妹穿的比我還像新娘呐伞。我一直安慰自己,他們只是感情好慎式,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般瘪吏。 火紅的嫁衣襯著肌膚如雪癣防。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天掌眠,我揣著相機(jī)與錄音蕾盯,去河邊找鬼。 笑死蓝丙,一個(gè)胖子當(dāng)著我的面吹牛级遭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渺尘,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼挫鸽,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了鸥跟?” 一聲冷哼從身側(cè)響起丢郊,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎医咨,沒想到半個(gè)月后枫匾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拟淮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年干茉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片很泊。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡角虫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撑蚌,到底是詐尸還是另有隱情上遥,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布争涌,位于F島的核電站粉楚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏亮垫。R本人自食惡果不足惜模软,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饮潦。 院中可真熱鬧燃异,春花似錦、人聲如沸继蜡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仅颇,卻和暖如春单默,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忘瓦。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工搁廓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耕皮。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓境蜕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凌停。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粱年,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,760評(píng)論 1 92
  • 收聽音頻,戳鏈接,舊號(hào)itclan已暫停使用,歡迎關(guān)注微信itclanCoder公眾號(hào)可收聽更多音頻 前言 關(guān)于網(wǎng)...
    itclanCoder閱讀 8,188評(píng)論 3 30
  • 本文主要是起筆記的作用苦锨,內(nèi)容來自慕課網(wǎng). 認(rèn)識(shí)CSS樣式 CSS全稱為“層疊樣式表 (Cascading Styl...
    0o凍僵的企鵝o0閱讀 2,652評(píng)論 0 30
  • 一 外部式css樣式 (也可稱為外聯(lián)式)就是把css代碼寫一個(gè)單獨(dú)的外部文件中逼泣,這個(gè)css樣式文件以“.css...
    KunMitnic閱讀 944評(píng)論 0 1
  • - (void)createGif { UIImageView* animatedImageView = [[UI...
    survivorsfyh閱讀 1,006評(píng)論 0 0