三種方式實現(xiàn)圣杯布局

上一篇寫了雙飛翼布局,這篇我就寫下他的兄弟圣杯布局吧~
圣杯布局也是實現(xiàn)三欄布局的方法,左右定寬,中間自適應,中間內容優(yōu)先加載。
最原始的圣杯布局是通過負邊距、左浮動、相對定位、內邊距實現(xiàn)的,然后我在實踐中也發(fā)現(xiàn)了另外兩種實現(xiàn)方式,分別是通過怪異盒模型和flex布局

HTML

HTML結構都是相同的,我先放在這里

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

CSS

我們先看下最祖先的方式吧
通過負邊距、左浮動、相對定位、內邊距實現(xiàn)
1.首先給main一個100%寬度,left和right分別給一個固定的寬度,三者高度和父盒子一樣高,都實現(xiàn)左浮動
效果如下,由于main寬度已經(jīng)撐滿了整個父盒子,left和right被擠到父盒子下面



所以我們要讓left和right上去
2.使用負邊距,給left添加margin-left:-100%(向左移動一個父盒子的寬度),給right添加一個負right寬度的左邊距(向左邊移動一個right盒子的寬度)
可以看到left和right成功移動到我們想到的位置了



但有個問題main盒子的內容被left和right擋住了,所以我們要讓main盒子的內容在left和right之間顯示
3.給container一個左右的padding試下

left和right還是陰魂不散,main還是被擋住了
4.給left和right來個相對定位,讓left向左移動,rght向右移動試試吧

嗯,是的,就是醬紫的滴,應該沒有什么大問題了,收工收工~

完整的CSS
 /* 使用浮動、負邊距、內邊距、相對定位實現(xiàn) */
    .container {
      height: 300px;
      background-color: black;
      overflow: hidden;
      padding: 0 200px;
      min-width: 800px;
    }

    .main {
      width: 100%;
      height: 300px;
      background-color: blue;
      float: left;
    }

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

    }

    .right {
      width: 300px;
      height: 300px;
      background-color: red;
      float: left;
      margin-left: -300px;
      position: relative;
      right: -300px;
    }
其他兩種方式
怪異盒模型

使用怪異盒模型的區(qū)別就是這里不需要用定位,在mian上加padding替代container上的padding,然后將mian修改為怪異盒模型 box-sizing: border-box,我試了下效果是一樣滴

    /* 使用浮動、負邊距、內邊距、怪異盒模型實現(xiàn) */
    .container {
      height: 300px;
      background-color: black;
      overflow: hidden;
      min-width: 800px;
    }

    .main {
      width: 100%;
      height: 300px;
      background-color: blue;
      float: left;
      padding: 0 300px 0 200px;
      box-sizing: border-box;
    }

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

    .right {
      width: 300px;
      height: 300px;
      background-color: red;
      float: left;
      margin-left: -300px;
    }
flex

這個不得了了,什么浮動、內邊距、外邊距、怪異盒模型統(tǒng)統(tǒng)都不要??,一個flex搞定,給父盒子一個display:flex,left和right給固定的寬度,main來個flex:1自適應,給left盒子一個order:-1,讓他排在最左邊,畢竟html結構我們是不能改變滴。

    /* 使用彈性盒模型實現(xiàn)圣杯模型 */
    .container {
      height: 300px;
      background-color: black;
      overflow: hidden;
      min-width: 800px;
      display: flex;
    }

    .main {
      flex: 1;
      height: 300px;
      background-color: blue;
    }

    .left {
      width: 200px;
      height: 300px;
      background-color: pink;
      order: -1;
    }

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

OKK,bye~

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

友情鏈接更多精彩內容