1. 程式人生 > >理解聖杯布局和雙飛翼布局

理解聖杯布局和雙飛翼布局

oct 實現原理 charset ctype n) col str ood containe

一、共性和差異

首先兩個布局是有共性的:

  1. 實現效果一致:都是三欄布局,左右兩列寬度固定,中間列寬度自適應。中間列放重要的內容,因此在DOM結構中位置靠前優先渲染。
  2. 實現原理一致:都是將一個with:100%的浮動塊和另外兩個定寬浮動塊通過負外邊距和相對定位的方法實現最終布局,因此涉及到的方法包括:浮動負外邊距相對定位

其次同樣的實現效果之所以有兩個名字,本質上是因為實現思路不一樣,導致DOM結構不一樣

二、實現思路

  1. 聖杯布局來源於In Search of the Holy Grail這篇文章,作者在寫DOM結構的思路是先寫一個框架:
<header>header</header>
<div id="container"></div>
<footer>footer</footer>

技術分享圖片
上邊一個header,下邊一個footer,中間一個容器,三個列的結構都寫在這個容器裏。
此時可以用這個container容器的左右內邊距(padding)確定中間列的位置,並給左右兩列留出空間。但是由於左右兩列也包含在這個container容器中,所以他們也跟著被推到了中間,就像這樣:
技術分享圖片
因此在使用負外邊距的方法將三個浮動塊放到一行之後,還需要用相對定位將左右兩個塊放到最終位置。

  1. 雙飛翼布局的思路是一個改良聖杯布局的過程,既然中間列需要布局,那就直接給它加個父元素,讓這個父元素的width:100%,使用中間列的左右外邊距(margin)確定位置,並留出左右空間,DOM結構如下:
<div id="container">
    <div id="middle" class="basic">middle</div>
</div>
<div id="left" class="basic">left</div>
<div id="right" class="basic">right</div>

在這樣的結構下,左右兩列沒有跟著被推到中間,因此只需要使用負外邊距就可以實現最終布局。

三、完整代碼

  1. 聖杯布局:
    DOM結構:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>聖杯布局</title>
        <link rel="stylesheet" href="holygrail.css">
    </head>
    <body>
        <header class="basic">header</header>
            <div id="container">
                <div id="middle" class="basic">middle</div>
                <div id="left" class="basic">left</div>
                <div id="right" class="basic">right</div>
            </div>
        <footer class="basic">footer</footer>
    </body>
</html>

CSS樣式:

body {
    margin: 0;
}

.basic {
    height: 50px;
    text-align: center;
    line-height: 50px;
}

header {
    background-color: aquamarine;
    
}

footer {
    background-color: burlywood;
    clear: left;
}

#container {
    padding: 0 300px 0 200px;
}

#middle {
    background-color: chartreuse;
    width: 100%;
    float: left;
}

#left {
    background-color: hotpink;
    width: 200px;
    float: left;
    margin-left: -100%;
    position: relative;
    right: 200px;
}

#right {
    background-color: silver;
    width: 300px;
    float: left;
    margin-right: -300px;
}
  1. 雙飛翼布局:
    DOM結構:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>雙飛翼布局</title>
        <link rel="stylesheet" href="flying-wing.css">
    </head>
    <body>
        <header class="basic">header</header>
            <div id="container">
                <div id="middle" class="basic">middle</div>
            </div>
            <div id="left" class="basic">left</div>
            <div id="right" class="basic">right</div>
        <footer class="basic">footer</footer>
    </body>
</html>

CSS樣式:

body {
    margin: 0;
}

.basic {
    height: 50px;
    text-align: center;
    line-height: 50px;
}

header {
    background-color: aquamarine;
}

footer {
    background-color: burlywood;
    clear: left;
}

#container {
    width: 100%;
    float: left;
}

#middle {
    background-color: chartreuse;
    margin: 0 300px 0 200px;
}

#left {
    background-color: hotpink;
    width: 200px;
    float: left;
    margin-left: -100%;
}

#right {
    background-color: silver;
    width: 300px;
    float: left;
    margin-left: -300px;
}

理解聖杯布局和雙飛翼布局