css之圣杯布局

昨天面試的時候被問到圣杯布局,之前知道怎么實(shí)現(xiàn)三欄布局,但是突然問到圣杯布局,當(dāng)時我就憑著感覺說了兩種方法,因?yàn)橹白约簺]有實(shí)現(xiàn)過,面試完之后趕緊寫了demo來驗(yàn)證一下。

圣杯布局是什么

  • 三列布局,中間寬度自適應(yīng),兩邊定寬;
  • 中間欄要在瀏覽器中優(yōu)先展示渲染;

是不是比三欄布局多了點(diǎn)要求呢,嘿嘿

實(shí)現(xiàn)

HTML代碼如下:

<div id="container">
    <div id="middle">middle</div>
    <div id="left">left</div>
    <div id="right">right</div>
</div>
實(shí)現(xiàn)一:使用浮動
  • 先給左右列固定寬度,然后給中間列的寬設(shè)為100%,都設(shè)置為向左浮動:
#middle {
    background-color: lightpink;
    height: 300px;
    width: 100%;
    float: left;
}

#left {
    background-color: red;
    height: 300px;
    width: 100px;
    float: left;
}

#right {
    background-color: aqua;
    height: 300px;
    width: 100px;
    float: left;
}

此時它的效果為:


  • 讓左右列與中間列顯示在一行
    #left設(shè)置margin-left: -100%;,給#right設(shè)置margin-left: -100px;,那么此時我的頁面顯示為:


但是有沒有發(fā)現(xiàn)我的middle這個字不見了,那是因?yàn)楸粔鹤×耍藭r我的左右列覆蓋到了中間列上面

  • 中間盒子自適應(yīng)
    那么想讓中間盒子自適應(yīng),就給我們的父元素加padding值:
#container {
    padding: 0 100px;
}

此時的效果為:


與上面的圖相比,兩邊多了空,那么此時我的middle還是沒有出現(xiàn),所以說明我的左右兩列還是壓著中間那列的,所以我們就應(yīng)該將左右兩列給加定位,然后讓他們分別向左右移動:

#left {
    position: relative;
    left: -100px;
}
#right {
    position: relative;
    right: -100px;
}

此時我們的圣杯布局就完成啦:


實(shí)現(xiàn)二:用flex布局

使用flex布局就簡單多了呢,代碼如下:

#middle {
    background-color: lightpink;
    height: 300px;
    display: flex;
    flex:1;/*簡寫,1,1,auto的意思*/
}

#left {
    background-color: red;
    height: 300px;
    flex: 0 0 100px;/*默認(rèn)為橫向的,所以這里的100px相當(dāng)于寬度*/
    order:-1;/*設(shè)置left的位置在middle之前*/
}

#right {
    background-color: aqua;
    height: 300px;
    flex: 0 0 100px;/*默認(rèn)為橫向的,所以這里的100px相當(dāng)于寬度*/
}

#container{
    display: flex;
    flex:1;/*簡寫,1,1,auto的意思*/
}

那么我們的圣杯布局也就完成啦:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容