深入理解聖盃佈局和雙飛翼佈局

前端小然子發表於2019-04-11

前言

最近我朋友在群裡發了一張圖,說為什麼main的寬度100%了,sub還是可以覆蓋它呢?看來是時候帶他回憶一波經典的聖盃佈局和雙飛翼佈局了。正好最近看到好多面試題都有提到。 /笑哭

群內連結如下圖:

深入理解聖盃佈局和雙飛翼佈局

字面意思

聖唄佈局和雙飛翼佈局從字面意思來看是這樣的:

一個像聖盃或者像展翅的禽類這樣的佈局

通俗的來說就是左右兩欄固定寬度,中間部分自適應的三欄佈局。

兩者本質

深入理解聖盃佈局和雙飛翼佈局

聖盃佈局

  1. 首先把left、middle、right都放出來
  2. 給它們三個設定上float: left, 脫離文件流;
  3. 一定記得給container設定上overflow: hidden; 可以形成BFC撐開文件
  4. left、right設定上各自的寬度
  5. middle設定width: 100%;

接下來比較重要了:

  1. 給left、middle、right設定position: relative;
  2. left設定 left: -leftWidth, right設定 right: -rightWidth;
  3. container設定padding: 0, rightWidth, 0, leftWidth;

我注意到聖盃佈局的left、middle、right都有position: relative;

設:

.left width:200px
.right width:220px
複製程式碼

那麼下面的這些屬性為什麼要存在?

.container上面的paddind
.left 的left: -200px;
.right 的right: -220px;
複製程式碼

因為不這樣設定 會遮擋middle的內容

可以自己嘗試一下下


聖盃佈局示例程式碼如下:

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

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>聖盃佈局</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    .header,
    .footer {
      height: 100px;
      line-height: 100px;
      background-color: green;
      text-align: center;
      font-size: 30px;
      font-weight: bolder;
    }

    .footer {
      background-color: goldenrod;
    }

    .container {
      padding: 0 220px 0 200px;
      overflow: hidden;
    }

    .left,
    .middle,
    .right {
      position: relative;
      float: left;
      min-height: 130px;
      word-break: break-all;
    }

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

    .right {
      margin-left: -220px;
      right: -220px;
      width: 220px;
      background-color: green;
    }

    .middle {
      width: 100%;
      background-color: blue;
    }
  </style>
</head>

<body>
  <div class="header">header</div>
  <div class="container">
    <div class="middle">
      <h4>middle</h4>
      <p>
        middlemiddlemiddlemiddlemiddlemiddlemiddlemiddle
        middlemiddlemiddlemiddlemiddlemiddlemiddlemiddle
        middlemiddlemiddlemiddlemiddlemiddlemiddlemiddle
        middlemiddlemiddlemiddlemiddlemiddlemiddlemiddle
        middlemiddlemiddlemiddlemiddlemiddlemiddlemiddle
        middlemiddlemiddlemiddlemiddle
      </p>
    </div>
    <div class="left">
      <h4>left</h4>
      <p>
        leftleftleftleftleftleftleftleftleftleftleftleft
        leftleftleftleftleftleftleftleftleftleftleftleft
        leftleftleftleftleftleftleftleftleftleftleftleft
      </p>
    </div>
    <div class="right">
      <h4>right</h4>
      <p>
        rightrightrightrightrightrightrightrightrightright
        rightrightrightrightrightrightrightrightrightright
        rightrightrightrightrightrightright
      </p>
    </div>
  </div>
  <div class="footer">footer</div>
</body>

</html>
複製程式碼

雙飛翼佈局

雙飛翼佈局和聖盃佈局很類似,不過是在middle的div裡又插入一個div,通過調整內部div的margin值,實現中間欄自適應,內容寫到內部div中。

這樣可以先做好主體部分,然後再將附屬部分放到合適的位置!

  1. 首先把left、middle、right都放出來, middle中增加inner
  2. 給它們三個設定上float: left, 脫離文件流;
  3. 一定記得給container設定上overflow: hidden; 可以形成BFC撐開文件
  4. left、right設定上各自的寬度
  5. middle設定width: 100%;

接下來與聖盃佈局不一樣的地方:

  1. left設定 margin-left: -100%, right設定 right: -rightWidth;
  2. container設定padding: 0, rightWidth, 0, leftWidth;
<!DOCTYPE html>
<html lang="zh">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>雙飛翼佈局</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    .header,
    .footer {
      height: 100px;
      line-height: 100px;
      background-color: green;
      text-align: center;
      font-size: 30px;
      font-weight: bolder;
    }

    .footer {
      background-color: goldenrod;
    }

    .container {
      overflow: hidden;
    }

    .left,
    .middle,
    .right {
      float: left;
      min-height: 130px;
      word-break: break-all;
    }

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

    .right {
      margin-left: -220px;
      width: 220px;
      background-color: green;
    }

    .middle {
      width: 100%;
      height: 100%;
      background-color: blue;
    }

    .inner {
      margin: 0 220px 0 200px;
      min-height: 130px;
      background: blue;
      word-break: break-all;
    }
  </style>
</head>

<body>
  <div class="header">header</div>
  <div class="container">
    <div class="middle">
      <div class="inner">
        <h4>middle</h4>
        <p>
          middlemiddlemiddlemiddlemiddlemiddlemiddlemiddle
          middlemiddlemiddlemiddlemiddlemiddlemiddlemiddle
          middlemiddlemiddlemiddlemiddlemiddlemiddlemiddle
          middlemiddlemiddlemiddlemiddlemiddlemiddlemiddle
          middlemiddlemiddlemiddlemiddlemiddlemiddlemiddle
          middlemiddlemiddlemiddlemiddle
        </p>
      </div>
    </div>
    <div class="left">
      <h4>left</h4>
      <p>
        leftleftleftleftleftleftleftleftleftleftleftleft
        leftleftleftleftleftleftleftleftleftleftleftleft
        leftleftleftleftleftleftleftleftleftleftleftleft
      </p>
    </div>
    <div class="right">
      <h4>right</h4>
      <p>
        rightrightrightrightrightrightrightrightrightright
        rightrightrightrightrightrightrightrightrightright
        rightrightrightrightrightrightright
      </p>
    </div>
  </div>
  <div class="footer">footer</div>
</body>

</html>
複製程式碼

總結

聖盃佈局在DOM結構上顯得更加直觀和自然;

雙飛翼佈局省去了很多css,而且由於不用使用定位,可以獲得比聖盃佈局更小最小寬度;

說到這裡需要注意一下 由於雙飛翼佈局會一直隨著瀏覽器可視區域寬度減小從而不斷擠壓中間部分寬度。

所以需要設定給頁面一個min-width > LeftWidth + RightWidth;


還有一件事就是他們在單獨部分內容擴充的時候,童鞋們可能發現了 底部會參差不齊。

在我的老師那裡知道了最簡單的解決辦法 / 笑哭

給left、middle、right設定上 padding-bottom: 9999px; margin-bottom: -9999px;

就讓他變得無限高,但是又給他送回去了。真的是讓我腦洞大開!!!

demo地址

聖盃佈局

雙飛翼佈局

相關文章