關(guān)于圣杯布局的思考

經(jīng)常會(huì)遇到這樣一個(gè)場(chǎng)景:

寫一個(gè)兩側(cè)寬度固定金刁,中間寬度自適應(yīng)的三欄布局。

image

圣杯布局

<html>
 <head>
      <style>
            * {
                margin: 0;
                padding: 0;
            }
            body{
                min-width: 620px;  /* 格外注意:頁面的最小寬度 */
            }
            .middle,
            .left,
            .right {
                position: relative;
                float: left;
                height: 100%;
            }
            .container {
                padding: 0 220px 0 200px;
                overflow: hidden;
            }
            .left {
             /* 關(guān)鍵代碼:這里使用負(fù)外邊距(nagetive margin)將left放置到之前預(yù)留出的位置上 */
                margin-left: -100%;
                left: -200px;
                width: 200px;
                background: #002496;
            }
            .right {
                margin-left: -220px; /* 關(guān)鍵代碼 */
                right: -220px;
                width: 220px;
                background: #ed2738;
            }
            .middle {
                width: 100%;
                background: #c0c0d4;
                word-break: break-all;
            }
        </style>
    </head>
    <body>
        <div class='container'>
            <div class='middle'>middle</div>
            <div class='left'>left</div>
            <div class='right'>right</div>
        </div>
    </body>
    
</html>

雙飛翼布局

基于圣杯布局進(jìn)行的優(yōu)化版本:雙飛翼布局

<html>
 <head>
      <style>
            * {
                margin: 0;
                padding: 0;
            }
            body{
                min-width: 620px; /* 頁面的最小寬度 */
            }
            .middle,
            .left,
            .right {
                position: relative;
                float: left;
                height: 100%;
            }
            .container {
                overflow: hidden;
                /* 圣杯布局在container塊上加內(nèi)邊距(padding: 0 220px 0 200px;) */
            }
            .left {
                margin-left: -100%;
                width: 200px;
                background: #002496;
            }
            .right {
                margin-left: -220px;
                width: 220px;
                background: #ed2738;
            }
            .middle {
                width: 100%;
                background: #c0c0d4;
            }
            .contant{
                /* 雙飛翼布局將其改為contant塊上加外邊距(margin: 0 220px 0 200px;) */
                margin: 0 220px 0 200px;
            }
        </style>
    </head>
    <body>
        <div class='container'>
            <div class='middle'>
                <div class="contant">middle</div>
            </div>
            <div class='left'>left</div>
            <div class='right'>right</div>
        </div>
    </body>
    
</html>
  • 關(guān)于頁面最小寬度:

1、要想保證該布局效果正常顯示产捞,由于兩側(cè)都具有固定的寬度,所以需要給定頁面一個(gè)最小的寬度搂抒,但這并不只是簡(jiǎn)單的200+220=420px∏缶В回想之前l(fā)eft使用了position: relative衷笋,所以就意味著在center開始的區(qū)域,還存在著一個(gè)left的寬度辟宗。所以頁面的最小寬度應(yīng)該設(shè)置為200+200+220=620px;

2泊脐、由于雙飛翼布局沒有用到position:relative進(jìn)行定位,所以最小頁面寬度應(yīng)該為200+220=420px秕铛。

Flex布局

<html>
 <head>
      <style>
            * {
                margin: 0;
                padding: 0;
            }
            .container {
                display: flex;
                height: 100%;
            }
            .left {
                background: #002496;
                width: 200px;
            }
            .right {
                width: 200px;
                background: #ed2738;
            }
            .middle {
                background: #c0c0d4;
                flex: 1;
            }
        </style>
    </head>
    <body>
        <div class='container'>
            <div class='left'>left</div>
            <div class='middle'>middle</div>
            <div class='right'>right</div>
        </div>
    </body>
</html>

缺點(diǎn):
flex固有的兼容性問題缩挑,根據(jù)CanIUse的數(shù)據(jù)可以總結(jié)如下:

IE10部分支持2012,需要-ms-前綴

Android4.1/4.2-4.3部分支持2009 谨湘,需要-webkit-前綴

Safari7/7.1/8部分支持2012, 需要-webkit-前綴

IOS Safari7.0-7.1/8.1-8.3部分支持2012紧阔,需要-webkit-前綴

.box{
    display: -webkit-flex;  /* 新版本語法: Chrome 21+ */
    display: flex;          /* 新版本語法: Opera 12.1, Firefox 22+ */
    display: -webkit-box;   /* 老版本語法: Safari, iOS, Android browser, older WebKit browsers. */
    display: -moz-box;      /* 老版本語法: Firefox (buggy) */
    display: -ms-flexbox;   /* 混合版本語法: IE 10 */   
 
 }
 
.flex1 {            
    -webkit-flex: 1;        /* Chrome */  
    -ms-flex: 1             /* IE 10 */  
    flex: 1;                /* NEW, Spec - Opera 12.1, Firefox 20+ */
    -webkit-box-flex: 1     /* OLD - iOS 6-, Safari 3.1-6 */  
    -moz-box-flex: 1;       /* OLD - Firefox 19- */       
 }

Grid布局

Grid布局最簡(jiǎn)單了续担,兩句話搞定,但兼容性堪憂赤拒,(>= IE 10)

<html>
 <head>
      <style>
            * {
                margin: 0;
                padding: 0;
            }
            .container {
                display: grid;
                grid-template-columns: 200px 1fr 200px;
                height: 100%;
            }
            .left {
                background: #002496;
            }
            .right {
            
                background: #ed2738;
            }
            .middle {
                background: #c0c0d4;
            }
        </style>
    </head>
    <body>
        <div class='container'>
            <div class='left'>left</div>
            <div class='middle'>middle</div>
            <div class='right'>right</div>
        </div>
    </body>
</html>

面向移動(dòng)端的話,可以考慮引入grid了这敬,畢竟手機(jī)更新?lián)Q代快,瀏覽器兼容問題沒那么嚴(yán)重崔涂。
關(guān)于flex與grid布局的選擇,要結(jié)合起來用才能發(fā)揮他們各自的優(yōu)勢(shì)冷蚂,比如:

1、對(duì)于居中(特別是垂直居中)問題艺骂、還有元素的一維分布(一條線上如何分布),用flex再合適不過了钳恕。

2、如果涉及到二維(多行多列)確定的布局忧额,使用Grid。

3睦番、涉及到響應(yīng)式的頁面元素,使用flex + width百分比寬度簡(jiǎn)直太好用托嚣,因?yàn)閒lex天生的流式布局恬涧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子厦瓢,更是在濱河造成了極大的恐慌,老刑警劉巖煮仇,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異刨仑,居然都是意外死亡郑诺,警方通過查閱死者的電腦和手機(jī)辙诞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門轻抱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人祈搜,你說我怎么就攤上這事∪菅啵” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵捧杉,是天一觀的道長(zhǎng)秘血。 經(jīng)常有香客問我,道長(zhǎng)灰粮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任熔脂,我火速辦了婚禮,結(jié)果婚禮上霞揉,老公的妹妹穿的比我還像新娘。我一直安慰自己适秩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布秽荞。 她就那樣靜靜地躺著抚官,像睡著了一般悍及。 火紅的嫁衣襯著肌膚如雪蕉斜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天垒棋,我揣著相機(jī)與錄音余指,去河邊找鬼。 笑死酵镜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的淮韭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼蜡吧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了昔善?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤君仆,失蹤者是張志新(化名)和其女友劉穎牲距,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牍鞠,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年萤晴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了龄广。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖净宵,靈堂內(nèi)的尸體忽然破棺而出裹纳,到底是詐尸還是另有隱情,我是刑警寧澤剃氧,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站阻星,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏妥箕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一坎吻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘦真,春花似錦、人聲如沸诸尽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至往产,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仿村,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工蔼囊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衣迷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓壶谒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親汗菜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挑社,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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