向左走,向右走:兩種不同的圣杯布局實(shí)現(xiàn)

圣杯布局是一種比較經(jīng)典的布局方案。目前各大商城首頁(yè)都采取該布局方案瑞筐。目前有兩種實(shí)現(xiàn)方式比較流行,分別是傳統(tǒng)的css+div的布局方案以及由css3的flex特性實(shí)現(xiàn)的更簡(jiǎn)潔的布局方案腊瑟。兩種方案各有優(yōu)缺點(diǎn)聚假,那么,讓我們看看具體的實(shí)現(xiàn)吧闰非。

傳統(tǒng)的css+div實(shí)現(xiàn)方式

傳統(tǒng)模式的基本原理為:利用容器元素的padding偏移和子元素的浮動(dòng)和margin偏移特性實(shí)現(xiàn)圣杯布局膘格。代碼如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #container {
            padding-left: 200px;/*設(shè)置容器內(nèi)邊距的左側(cè)偏移量,為左側(cè)邊欄騰出顯示空間财松,大小和左側(cè)邊欄寬度一致瘪贱。*/
            padding-right: 150px;/*設(shè)置容器內(nèi)邊距的右側(cè)偏移量,為右側(cè)邊欄騰出顯示空間辆毡,大小和左側(cè)邊欄寬度一致菜秦。*/
        }

        #container .column {
            float: left;/*容器的所有子元素都進(jìn)行左浮動(dòng)*/
            height: 400px;
        }
        #header {
            background-color: grey;
        }

        #center {
            width: 100%;/*主內(nèi)容區(qū),為相對(duì)大小舶掖,會(huì)根據(jù)屏幕寬度自動(dòng)調(diào)整自身大小*/
            background-color: green;
        }

        #left {
            width: 200px;
            margin-left: -100%;/*浮動(dòng)之后球昨,向左偏移整個(gè)父容器寬度的長(zhǎng)度,這樣使left能夠越過(guò)center眨攘,排在center前面*/
            position: relative;
            right: 200px;/*相對(duì)父容器右移自身長(zhǎng)度主慰,占據(jù)父容器騰出的左側(cè)邊欄空間*/
            background-color: red;
        }

        #right {
            width: 150px;
            margin-right: -150px;/*向左移動(dòng)自身長(zhǎng)度,占據(jù)父容器騰出的右側(cè)邊欄空間*/
            background-color: yellow;
        }

        #footer {
            clear: both;/*清除浮動(dòng)影響*/
            background-color: grey;
        }
    </style>
</head>

<body>
    <div id="header">header</div>
    <div id="container">
        <div id="center" class="column">content</div>
        <div id="left" class="column">left</div>
        <div id="right" class="column">right</div>
    </div>
    <div id="footer">footer</div>

</body>

</html>

關(guān)于圣杯布局有以下細(xì)節(jié)需要注意:center元素必須排在left和right之前鲫售。原因在于center元素為主內(nèi)容區(qū)共螺。由于通常的商城首頁(yè)需要加載的內(nèi)容都比較多,我們希望在網(wǎng)絡(luò)較為極端的情況下情竹,優(yōu)先顯示主內(nèi)容區(qū)藐不。

基于Flex彈性布局的圣杯布局

彈性布局由于其特性,在實(shí)現(xiàn)圣杯布局是非常簡(jiǎn)單鲤妥,代碼可讀性更好佳吞。代碼如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #container {
            display: flex;/*設(shè)置彈性布局容器*/
        }
        #header, #footer {
            background-color: grey;
        }

        #center {
            flex: 1;/*設(shè)置彈性伸縮比,1表示1:1的伸縮比*/
            background-color: red;
            height: 400px;
        }

        #left {
            flex: 0 0 300px;/*前兩個(gè)參數(shù)設(shè)置元素為不能伸縮棉安,后一個(gè)參數(shù)設(shè)置一個(gè)固定的初始值*/
            order: -1;/*元素排序向左移動(dòng)一位底扳,排在center前面*/
            height: 400px;
            background-color: yellow;
        }

        #right {
            flex: 0 0 200px;/*前兩個(gè)參數(shù)設(shè)置元素為不能伸縮,后一個(gè)參數(shù)設(shè)置一個(gè)固定的初始值*/
            height: 400px;
            background-color: green;
        }
    </style>
</head>

<body>
    <div id="header">header</div>
    <div id="container">
        <div id="center">center</div>
        <div id="left">left</div>
        <div id="right">right</div>
    </div>
    <div id="footer">footer</div>

</body>

</html>

以上的注釋行是關(guān)鍵代碼贡耽。需要注意的細(xì)節(jié)是衷模,left元素的oder:-1屬性實(shí)現(xiàn)元素排序往左移動(dòng)一位鹊汛,以達(dá)到元素在center渲染完之后渲染,卻顯示在center元素之前的效果阱冶。該效果在極端網(wǎng)絡(luò)條件下就能體現(xiàn)出來(lái)刁憋。

兩種方式的優(yōu)缺點(diǎn)

可以看到,傳統(tǒng)的圣杯布局采用的是css+div的布局方式木蹬,在實(shí)現(xiàn)細(xì)節(jié)上主要利于padding至耻,margin,float等一些偏移屬性镊叁。這些屬性是非常常規(guī)的屬性尘颓,在各瀏覽器的表現(xiàn)都非常一致,因此這種方式的兼容性非常好晦譬。在不同內(nèi)核的瀏覽器之間疤苹,以及桌面和移動(dòng)設(shè)備的表現(xiàn)上都非常一致。即使在IE6敛腌,IE5這樣的古老瀏覽器上也能完美的呈現(xiàn)效果卧土。缺點(diǎn)是代碼可讀性不太好,它采用了一些不太常規(guī)的偏移操作像樊,容易讓人產(chǎn)生困惑尤莺。
flex的實(shí)現(xiàn)方式可讀性好,代碼簡(jiǎn)單凶硅。但是缝裁,flex是css3.0的新特性扫皱。對(duì)于移動(dòng)端來(lái)說(shuō)足绅,各大瀏覽器基本都支持css3.0,但是桌面環(huán)境就比較復(fù)雜韩脑。仍然有一些老項(xiàng)目運(yùn)行在IE6上氢妈,這樣就會(huì)造成兼容性問(wèn)題。那么比較推薦的做法是:如果項(xiàng)目只針對(duì)移動(dòng)端段多,就采用flex布局首量,如果桌面端和移動(dòng)端都要兼顧,就采用傳統(tǒng)布局进苍。由于彈性布局是css的新特性加缘,下面我們來(lái)看一下彈性布局給我們提供了哪些操作空間。

彈性布局

彈性布局依賴(lài)主軸和交叉觉啊。我們一般地可以將主軸和交叉軸比作x軸和y軸拣宏,但如果項(xiàng)目需要,我們也可以將主軸設(shè)置為縱軸杠人,這樣主軸就相當(dāng)于y軸勋乾,而交叉軸就相當(dāng)于x軸了宋下。或許另一種比喻更為恰當(dāng)辑莫,將主軸視為布局軸学歧,交叉軸視為對(duì)齊軸。即主軸表示元素的排列方向各吨,交叉軸表示元素的對(duì)齊方向枝笨。關(guān)于彈性布局,它包括容器屬性和項(xiàng)目屬性揭蜒,一共12個(gè)屬性伺帘。其中容器屬性作用于容器中的所有項(xiàng)目,起到一個(gè)整體布局的作用忌锯,項(xiàng)目屬性作用于容器中具體的子元素伪嫁,起到一個(gè)細(xì)節(jié)調(diào)整的作用。掌握這些屬性的用法偶垮,就掌握了彈性布局张咳。
容器屬性如下:

flex-direction  /*設(shè)置主軸方向,可以設(shè)置橫向和縱向似舵,默認(rèn)為橫向*/
flex-wrap       /*設(shè)置當(dāng)主軸方向空間不足時(shí)脚猾,是否換行*/
flex-flow       /*flex-direction,flex-wrap的簡(jiǎn)寫(xiě)形式*/
justify-content/*設(shè)置主軸對(duì)齊方式砚哗,取值范圍:flex-start | flex-end | center | space-between | space-around*/
align-items     /*交叉軸對(duì)齊方式龙助,取值范圍:flex-start | flex-end | center | baseline | stretch*/
align-content   /*主軸間的對(duì)齊方式,取值范圍:lex-start | flex-end | center | baseline | stretch*/

項(xiàng)目屬性如下:

order       //元素在容器中的排列順序蛛芥,越小越靠前提鸟,默認(rèn)為0
flex-grow   //元素在容器中的放大比例,在沒(méi)有剩余空間或設(shè)置為的情況下仅淑,不放大称勋。默認(rèn)值為0
flex-shrink //元素在容器中的縮小比例,當(dāng)空間不足時(shí)涯竟,元素將等比縮小赡鲜,默認(rèn)為1,如果設(shè)置為0庐船,則不縮小
flex-basis  //設(shè)置一個(gè)固定空間银酬,瀏覽器根據(jù)固定空間可以計(jì)算出剩余空間,默認(rèn)值為auto
flex        //flex-grow筐钟,flex-shrink揩瞪,flex-basis的簡(jiǎn)寫(xiě)模式
align-self  //單獨(dú)定義自身的對(duì)齊方式,覆蓋容器的align-items屬性

好了盗棵,就到這里吧壮韭,希望你有所收獲北发。晚安。喷屋。琳拨。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市屯曹,隨后出現(xiàn)的幾起案子狱庇,更是在濱河造成了極大的恐慌,老刑警劉巖恶耽,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件密任,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡偷俭,警方通過(guò)查閱死者的電腦和手機(jī)浪讳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)涌萤,“玉大人淹遵,你說(shuō)我怎么就攤上這事「合” “怎么了透揣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)川抡。 經(jīng)常有香客問(wèn)我辐真,道長(zhǎng),這世上最難降的妖魔是什么崖堤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任侍咱,我火速辦了婚禮,結(jié)果婚禮上倘感,老公的妹妹穿的比我還像新娘放坏。我一直安慰自己咙咽,他們只是感情好老玛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著钧敞,像睡著了一般蜡豹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溉苛,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天镜廉,我揣著相機(jī)與錄音,去河邊找鬼愚战。 笑死娇唯,一個(gè)胖子當(dāng)著我的面吹牛齐遵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播塔插,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梗摇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了想许?” 一聲冷哼從身側(cè)響起伶授,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎流纹,沒(méi)想到半個(gè)月后糜烹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漱凝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年疮蹦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茸炒。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挚币,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扣典,到底是詐尸還是另有隱情妆毕,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布贮尖,位于F島的核電站笛粘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏湿硝。R本人自食惡果不足惜薪前,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望关斜。 院中可真熱鬧示括,春花似錦、人聲如沸痢畜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)丁稀。三九已至吼拥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間线衫,已是汗流浹背凿可。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留授账,地道東北人枯跑。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓惨驶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親敛助。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敞咧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353