超經典面試題:用多種方法實現聖盃佈局和雙飛翼佈局

0. 開始正文之前的自我吐槽

聖盃佈局和雙飛翼佈局一直是前端面試的高頻考點,然而本人對佈局和css這方面實在不擅長==,每次被面試官問到css相關的問題,都含含糊糊;到了後面自己閒麻煩直接說"我不太懂css!"。然而總被強硬的懟回來,“你不會css你還是前端嗎!”

然而程序員的世界中“懂”的意思不是等於“精通”嗎?=。=

好了正文開始。。

1. 聖盃佈局

1.簡單介紹

聖盃佈局

聖盃佈局要求:

1. header和footer佔屏幕全部高度,高度固定
2. 中間的contaier部分是一個三欄佈局
3. left和right寬度固定,middle自適應填滿整個區域;高度爲三欄中最大的高度;

2. 三種實現

a. 浮動

先給出dom結構

<body>
        <header>header</header>
        <div class="container">
            <div class="middle">middle</div>
            <div class="left">left</div>
            <div class="right">right</div>
        </div>
        <footer>footer</footer>
</body>

header和footer就直接定高,width設爲100%就好;container也設爲100%;left和right定寬;middle寬度100%;讓container下的div都向左浮動。

header,footer{
    height:100px;
    width:100%; 
    background-color: antiquewhite;
}
.container{
    height:200px;
}
.container>div{
    float: left;
}

.left{
    width:200px;
    height:200px;
    background-color: burlywood;
}

.right{
    width:300px;
    height:200px;
    background-color: burlywood;
}

.middle{
    width:100%;
    height:200px;
    background-color: #b0f9c2;
}

這時我們的佈局如下:

demo

因爲middle先渲染的且寬度爲百分百,所以left和right被擠到了下面;爲了讓他們都在一行顯示,讓left左外邊距向左偏移整行的寬度;讓right的左外邊距向左偏移right自身的寬度。代碼如下:

.left{
    ...
     margin-left: -100%;
}
.right{
    ...
    margin-left: -300px;
}

demo

這樣看是不是順眼了些?然而middle裏的內容被left覆蓋了。。我們需要給container部分設置左右padding,向中間擠壓,然後將left和right設置成相對定位,將其固定到正確位置。

.container{
   ...
    padding-left:200px;
    padding-right:300px;
}

設置padding,向中間擠壓

將div.left和div.right設置相對定位。並給container設置高度,其子級div高度爲百分百。

.container>div{
    ...
    height:100%;
    position: relative;
}

.left{
    ...
    left:-200px;
}

.right{
   ...
    right:-300px;
}

最後的效果圖

這種方法是兼容性最好的寫法,然而代碼略顯複雜。

b.flex佈局

dom結構:因爲不用設置浮動了,container的三個子div按順序排布就好。

 <body>
        <header>header</header>
        <div class="container">
            <div class="left">left</div>
            <div class="middle">middle</div>
            <div class="right">right</div>
        </div>
        <footer>footer</footer>
    </body>

flex佈局非常簡單,只需在container中設置flex即可。

.container{
    display: flex;
    flex-direction: row;
}

c.css grid

dom結構:

<body>
        <header>header</header>
            <div class="left">left</div>
            <div class="middle">middle</div>
            <div class="right">right</div>
        <footer>footer</footer>
</body>
body{
    display:grid;
}
header{
    grid-row:1;
    grid-column:1/5;
    background-color: antiquewhite;
}
footer{
    grid-row:3;
    grid-column:1/5;
    background-color: antiquewhite;
}

.left{
    grid-row:2;
    grid-column:1/2;
    background-color: burlywood;
}

.right{
    grid-row:2;
    grid-column:4/5;
    background-color: burlywood;
}

.middle{
    grid-row:2;
    grid-column:2/4;
    background-color: #b0f9c2;
} 

demo

使用grid佈局可以減少容器div;也比較容易理解;在2018年初絕大數瀏覽器已經支持css grid。

2.雙飛翼佈局

雙飛翼佈局和聖盃佈局幾乎一樣,區別在於處理middle中被遮擋的部分。雙飛翼是在middle中再放一個div用來顯示內容,爲其設置margin。

dom結構如下:

<body>
        <header>header</header>
        <div class="container">
            <div class="middle">
                <div class="main">middle</div>
            </div>
            <div class="left">left</div>
            <div class="right">right</div>
        </div>
        <footer>footer</footer>
    </body>

其他css和上一節第一個方法一樣,區別在於這裏middle中多了一個div main,用多了一個div的方式代替使用相對佈局。

.container{
    width:100%;
    height:200px;
}
.container>div{
    float: left;
    height:200px;
}
.left{
    width:200px;
    background-color: burlywood;
    margin-left: -100%;
}

.right{
    width:300px;
    background-color: burlywood;
    margin-left: -300px;
}

.middle{
    width:100%;
    background-color: #b0f9c2;
}

.main{
    margin:0 300px 0 200px;
}

3.參考資料

  1. 聖盃佈局和雙飛翼佈局(前端面試必看)
  2. 三種方式實現聖盃佈局
  3. 聖盃佈局和雙飛翼佈局的作用和區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章