1. 程式人生 > >經典佈局之聖盃佈局&雙飛翼佈局

經典佈局之聖盃佈局&雙飛翼佈局

前言

所謂經典,說白了就是古老的東西,但是又是很有用的東西。大多數前端頁面仔包括本菜(不!我可是勵志成為前端工程師的男人,頁面仔太刺耳)都或多或少了解的聖盃佈局和雙飛翼佈局。

本文只對這兩種佈局進行簡單的探討(畢竟本菜真的好菜啊)

不管怎樣,寫作的好處自然很多,可以鞏固自己的知識,弘揚程式猿一貫的樂於分享的精神,也望日後能有溫故而知新的效果。

概述

雖然兩種佈局名稱不一樣,但聖盃佈局和雙飛翼佈局效果是一致的,都是三列布局,都是中間寬度自適應,左右寬度為定值的佈局,且都是讓瀏覽器將中間區塊優先渲染。

效果圖如下:
圖1

兩種佈局採用的策略

1. 聖盃佈局:

html結構

<div id="container">
    <div class="center">center</div>
    <div class="left">left</div>
    <div class="right">right</div>
</div>

1.1 父容器container設定左右margin 以容納左右兩列,container的width不設定,自適應
1.2 三列都設定左浮動,left塊設定width為100%,佔滿父容器寬度;
1.3 然後利用浮動元素設定margin為一定負值時會跳到上一行的特性(注意:如果前面的元素不是浮動元素,負margin是不會起到跳到上一行的效果的),將左邊列的margin-left設定為-100%,也就是父容器的寬度,即center那列的寬度,將right塊的margin-left設定為負的right塊的寬度,比如right塊的寬度為100px,則設定margin-left為-100px;
1.4 設定左邊列和右邊列position為relative,並設定左邊列的left為負的左邊容器留白的寬度,設定右邊列的right為容器右邊留白的寬度

2. 雙飛翼佈局

html結構

<div id="container2">
    <div class="center2">
        <div class="wrap">center2</div>
    </div>
    <div class="left2">left2</div>
    <div class="right2">right2</div>
</div>

2.1 設定container2的width為100%
2.2 設定center2、left2和right2左浮動,center的width為100%;
2.3 設定left2 的margin-left為-100%,right2的margin-left為right2的寬度的負數
2.4 設定wrap 的左右margin分別為left2和right2的寬度,適當留出一點間隙,width不設定為自適應

完整實現程式碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>聖盃佈局雙飛翼佈局</title>
    <style>
        *{
            margin: 0;
            padding:0;
        }
        body{
            text-align: center;
        }

        /*聖盃佈局*/
        #container{
            padding:0 210px;
            overflow: hidden;
            font-size: 30px;
        }
        .left,
        .center,
        .right{
            float: left;
        }
        .center{
            width:100%;
            height: 50px;
            background: blue;
        }
        .left{
            position:relative;
            left: -210px;
            width:200px;
            height: 100px;
            margin-left: -100%;
            background: red;
        }
        .right{
            position: relative;
            right: -210px;
            width: 200px;
            height: 100px;
            margin-left: -200px;
            background: green;
        }

        /*雙飛翼佈局*/
        #container2{
            width:100%;

        }
        .left2,
        .right2,
        .center2{
            float: left;
        }
        .center2{
            width:100%;
            /*height: 200px;*/

        }
        .center2 .wrap{
            height: 200px;
            margin-left: 210px;
            margin-right: 210px;
            background: #392;
        }
        .left2{
            width:200px;
            height: 100px;
            background: red;
            margin-left: -100%;
        }
        .right2{
            width:200px;
            height: 100px;
            background: blue;
            margin-left: -200px;
        }
    </style>
</head>
<body>
    <h2>聖盃佈局</h2>
    <div id="container">
        <div class="center">center</div>
        <div class="left">left</div>
        <div class="right">right</div>
    </div>

    <br><br>
    <h2>雙飛翼佈局</h2>
    <div id="container2">
        <div class="center2">
            <div class="wrap">center2</div>
        </div>
        <div class="left2">left2</div>
        <div class="right2">right2</div>
    </div>
</body>
</html>

效果:
圖2

討論兩種佈局的區別

從html上看,雙飛翼佈局多了一個標籤
從css上看,明顯地雙飛翼佈局的css程式碼更少

而且,聖盃佈局暴露出一個問題:
圖3

這個圖為瀏覽器視窗縮小到一定大小的時候,聖盃佈局出現排版錯亂的現象,原因是聖盃佈局的中間那塊寬度是自適應的,瀏覽器縮小到中間的那塊寬度小於左右兩塊時,左邊的那塊margin-left不足以跑到上一行,因此出現了排版錯亂的現象。解決的辦法為container 設定min-width為左右兩塊的寬度較大者。但是,這樣看來,明顯是使用雙飛翼佈局更優。本人推薦用雙飛翼佈局的方式。