CSS經(jīng)典三欄布局方案

1. float布局

最簡單的三欄布局就是利用float進(jìn)行布局。首先來繪制左绪颖、右欄:

    <style>
      .left {
        float: left;
        width: 100px;
        height: 200px;
        background-color: red;
      }
    
      .right {
        float: right;
        width: 100px;
        height: 200px;
        background-color: yellow;
      }
    </style>
      
      <div class="container">
        <div class="left"></div>
        <div class="right"></div>
        <div class="main"></div>
      </div>

此時(shí)可以得到左右兩欄分布:

這里寫圖片描述

接下來再來看中間欄如何處理秽荤。我們知道對(duì)于float元素甜奄,其會(huì)脫離文檔流,其他盒子也會(huì)無視這個(gè)元素窃款。(但其他盒子內(nèi)的文本依然會(huì)為這個(gè)元素讓出位置课兄,環(huán)繞在周圍。)所以此時(shí)只需在container容器內(nèi)添加一個(gè)正常的div晨继,其會(huì)無視left和right烟阐,撐滿整個(gè)container,只需再加上margin為left right流出空間即可:

    <style>
      .left {
        float: left;
        width: 100px;
        height: 200px;
        background-color: red;
      }
    
      .right {
        float: right;
        width: 100px;
        height: 200px;
        background-color: yellow;
      }
    
      .main {
        background-color: green;
        height: 200px;
        margin-left: 120px;
        margin-right: 120px;
      }
    
      .container {
        border: 1px solid black;
      }
    
      <div class="container">
      <div class="left"></div>
      <div class="right"></div>
      <div class="main"></div>
      </div>
這里寫圖片描述
  • 優(yōu)勢(shì):簡單
  • 劣勢(shì):中間部分最后加載紊扬,內(nèi)容較多時(shí)影響體驗(yàn)

2. BFC 規(guī)則

BFC(塊格式化上下文)規(guī)則規(guī)定:BFC不會(huì)和浮動(dòng)元素重疊蜒茄。所以如果將main元素設(shè)定為BFC元素即可:

    <style>
      .left {
        float: left;
        width: 100px;
        height: 200px;
        background-color: red;
      }
    
      .right {
        float: right;
        width: 100px;
        height: 200px;
        background-color: yellow;
      }
    
      .main {
        background-color: green;
        height: 200px;
        overflow: hidden;
      }
    
      <div class="container">
        <div class="left"></div>
        <div class="right"></div>
        <div class="main"></div>
      </div>

3. 圣杯布局

圣杯布局的核心是左、中餐屎、右三欄都通過float進(jìn)行浮動(dòng)檀葛,然后通過負(fù)值margin進(jìn)行調(diào)整。

第一步腹缩,先來看下基本布局

    <style>
        .left {
            float: left;
            width: 100px;
            height: 200px;
            background-color: red;
        }

        .right {
            float: left;
            width: 100px;
            height: 200px;
            background-color: yellow;
        }

        .main {
            float: left;
            width: 100%;
            height: 200px;
            background-color: blue;
        }
    </style>
    <body>
        <div class="container">
            <div class="main"></div>
            <div class="left"></div>
            <div class="right"></div>
        </div>
    </body>
這里寫圖片描述

此時(shí)看到的效果是:左屿聋、右兩欄被擠到第二行。這是因?yàn)?code>main的寬度為100%藏鹊。接下來我們通過調(diào)整左润讥、右兩欄的margin來將左、中盘寡、右放在一行中:

        .left {
            float: left;
            width: 100px;
            height: 200px;
            margin-left: -100%;
            background-color: red;
        }

        .right {
            float: left;
            width: 100px;
            height: 200px;
            margin-left: -100px;
            background-color: yellow;
        }

第二步象对,將leftmargin-left設(shè)置為-100%,此時(shí)左欄會(huì)移動(dòng)到第一行的首部宴抚。然后再將rightmargin-left設(shè)置為其寬度的負(fù)值:-100px勒魔,則右欄也會(huì)移動(dòng)到和左、中欄一行中:

這里寫圖片描述

不過此時(shí)還沒有大功告成菇曲,我們?cè)囍?code>main中加入一些文字:

    <body>
        <div class="container">
            <div class="main">fjlskdjflkasjdfljasdljlsjdljsdjflksadj</div>
            <div class="left"></div>
            <div class="right"></div>
        </div>
    </body>
這里寫圖片描述

可以看到文字被壓住了冠绢,接下來就要解決這個(gè)問題。

第三步常潮,給container一個(gè)padding弟胀,該padding應(yīng)該正好等于左、右欄的寬度:

        .container {
            padding-left: 100px;
            padding-right: 100px;
        }

此時(shí)看到的結(jié)果是左喊式、中孵户、右三欄都整體收縮了,但文字依然被壓住了岔留。


這里寫圖片描述

第四步夏哭,給左、右兩欄加上相對(duì)布局献联,然后再通過設(shè)置left和right值向外移動(dòng):

        .left {
            float: left;
            width: 100px;
            height: 200px;
            margin-left: -100%;
            position: relative;
            left: -100px;
            background-color: red;
        }

        .right {
            float: left;
            width: 100px;
            height: 200px;
            margin-left: -100px;
            position: relative;
            right: -100px;
            background-color: yellow;
        }

到此為止竖配,大功告成:


這里寫圖片描述

4. 雙飛翼布局

雙飛翼布局的前兩步和圣杯布局一樣何址,只是處理中間欄部分內(nèi)容被遮擋問題的解決方案有所不同:

既然main部分的內(nèi)容會(huì)被遮擋,那么就在main內(nèi)部再加一個(gè)content进胯,通過設(shè)置其margin來避開遮擋用爪,問題也就可以解決了:

<!DOCTYPE html>
<html lang="en">
<head>
    <style>
        .main {
        float: left;
        width: 100%;
        }
        .content {
        height: 200px;
        margin-left: 110px;
        margin-right: 220px;
        background-color: green;
        }
        
        .main::after {
        display: block;
        content: '';
        font-size: 0;
        height: 0;
        clear: both;
        zoom: 1;
        }
    .left {
        float: left;
        height: 200px;
        width: 100px;
        margin-left: -100%;
        background-color: red;
    }
    .right {
        width: 200px;
        height: 200px;
        float: left;
        margin-left: -200px;
        background-color: blue;
    }   
    </style>
</head>
<body>
    <div class="main">
        <div class="content"></div>
    </div>
    <div class="left"></div>
    <div class="right"></div>
</body>
</html>

唯一需要注意的是,需要在main后面加一個(gè)元素來清除浮動(dòng)胁镐。

5. flex布局

flex布局是趨勢(shì)偎血,利用flex實(shí)現(xiàn)三欄布局也很簡單,不過需要注意瀏覽器兼容性:

        <style type="text/css">
            .container {
                display: flex;
                flex-direction: row;
            }
            .middle {
                height: 200px;
                background-color: red;
                flex-grow: 1;
            }

            .left {
                height: 200px;
                order: -1;
                margin-right: 20px;
                background-color: yellow;
                flex: 0 1 200px;
            }

            .right {
                height: 200px;
                margin-left: 20px;
                background-color: green;
                flex: 0 1 200px;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <div class="middle">fsdfjksdjflkasjdkfjsdkljfklsjadfkljaksdljfskljffjksldfjldsfdskjflsdjfkljsdlfjsldjfklsjdkflj</div>
            <div class="left"></div>
            <div class="right"></div>
        </div>
    </body>

有幾點(diǎn)需要注意一下:

  • main要首先加載就必須寫在第一位盯漂,但因?yàn)?code>left需要顯示在最左側(cè)烁巫,所以需要設(shè)置left的order為-1
  • flex屬性的完整寫法是:flex: flex-grow flex-shrink flex-basis 。這也是flex實(shí)現(xiàn)三欄布局的核心宠能,main設(shè)置flex-grow為1,說明多余空間全部給main磁餐,而空間不夠時(shí)违崇,僅縮小left right部分,同時(shí)因?yàn)橹付?code>left right部分的flex-basis诊霹,所以指定了兩者的寬度羞延,保證其顯示效果

6. 絕對(duì)定位

絕對(duì)定位的方式也比較簡單,而且可以優(yōu)先加載主體:

        <style type="text/css">
            .container {
            }
            .middle {
                position: absolute;
                left: 200px;
                right: 200px;
                height: 300px;
                background-color: yellow;
            }

            .left {
                position: absolute;
                left: 0px;
                width: 200px;
                height: 300px;
                background-color: red;
            }

            .right {
                position: absolute;
                right: 0px;
                width: 200px;
                background-color: green;
                height: 300px;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <div class="middle">fsdfjksdjflkasjdkfjsdkljfklsjadfkljaksdljfskljffjksldfjldsfdskjflsdjfkljsdlfjsldjfklsjdkflj</div>
            <div class="left"></div>
            <div class="right"></div>
        </div>
    </body>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脾还,一起剝皮案震驚了整個(gè)濱河市伴箩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鄙漏,老刑警劉巖嗤谚,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異怔蚌,居然都是意外死亡巩步,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門桦踊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來椅野,“玉大人,你說我怎么就攤上這事籍胯【股粒” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵杖狼,是天一觀的道長炼蛤。 經(jīng)常有香客問我,道長蝶涩,這世上最難降的妖魔是什么鲸湃? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任赠涮,我火速辦了婚禮,結(jié)果婚禮上暗挑,老公的妹妹穿的比我還像新娘笋除。我一直安慰自己,他們只是感情好炸裆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布垃它。 她就那樣靜靜地躺著,像睡著了一般烹看。 火紅的嫁衣襯著肌膚如雪国拇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天惯殊,我揣著相機(jī)與錄音酱吝,去河邊找鬼。 笑死土思,一個(gè)胖子當(dāng)著我的面吹牛务热,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播己儒,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼崎岂,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了闪湾?” 一聲冷哼從身側(cè)響起冲甘,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎途样,沒想到半個(gè)月后江醇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡何暇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年嫁审,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赖晶。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡律适,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出遏插,到底是詐尸還是另有隱情捂贿,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布胳嘲,位于F島的核電站厂僧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏了牛。R本人自食惡果不足惜颜屠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一辰妙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甫窟,春花似錦密浑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浇衬,卻和暖如春懒构,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耘擂。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國打工胆剧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人醉冤。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓秩霍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冤灾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354