常見的布局實(shí)現(xiàn)

本章主要介紹常見的布局實(shí)現(xiàn)蠕蚜,包括:


[1] 兩列布局

[2] 三列布局

[3] 彈性 (Flex) 布局


[1] 兩列布局

  • 子列固定寬度(設(shè)置 absolute扣囊、float)乎折,主列自適應(yīng)屏幕(調(diào)整margin)。
  • absolute + margin侵歇、float + margin骂澄、float + 負(fù)margin 等方式。
<!DOCTYPE html>
<html>
<head>
    <title>兩列布局</title>
    <meta charset="utf-8">
    <style type="text/css">
        /* 方法1: absolute + margin 方式 */
        /* 優(yōu)點(diǎn): 可以優(yōu)先渲染主元素 main 中的內(nèi)容*/
        /* 缺點(diǎn): aside 列脫離了文檔流, 當(dāng) aside 列比 main 列高時(shí)會(huì)覆蓋后面的布局 */
        .container1 {   
            position: relative;   
            margin: 10px;
            border: 1px solid #000;
        }   
        .aside1 {   
            position: absolute;  
            top: 0;  /* 優(yōu)先渲染 main 中內(nèi)容時(shí)不可以省略惕虑,因?yàn)?main1 中的 margin-left 占據(jù)了 200px 的大小 */
            left: 0;
            width: 200px;   
            height: 100px;   
            background-color: rgba(255, 0, 0, .5);   
        }   
        .main1 {   
            height: 100px;   
            margin-left: 200px;    /* 左側(cè) 200px 被側(cè)邊欄覆蓋 */
            background-color: rgba(0, 255, 0, .5);   
        }  

        /* 方法2: float + margin 方式 */
        /* 優(yōu)點(diǎn)和缺點(diǎn)與方法 1 前者相反 */
        .container2 {   
            position: relative;   
            margin: 10px;
            border: 1px solid #000;
        }   
        .aside2 {   
            float: left; 
            width: 200px;   
            height: 100px;   
            background-color: rgba(255, 0, 0, .5);   
        }   
        .main2 {   
            height: 100px;   
            margin-left: 200px;    /* 左側(cè) 200px 被側(cè)邊欄覆蓋 */
            background-color: rgba(0, 255, 0, .5);   
        }  
        /*  方法3: float + 負(fù)margin 方式 (即雙飛翼布局) */
        /*  浮動(dòng) container 和 aside 列, 通過 負(fù)margin 正確定位 aside 列
         *  container 寬度值設(shè)為 100%
         *  main 列的 margin-left 消除被 aside 覆蓋的部分
         *  aside 不包括在 container 中
         */
        /*  優(yōu)點(diǎn): 解決了 float + margin 不能優(yōu)先渲染 main 中的內(nèi)容 */
        .container3 {   
            float: left;   /* 浮動(dòng) */
            width: 100%;
            border: 1px solid #000;
        }   
        .aside3 {   
            float: left;  
            margin-left: -100%;  /* 調(diào)整到合適位置 */
            width: 200px;   
            height: 100px;   
            background-color: rgba(255, 0, 0, .5);   
        }   
        .main3 {   
            height: 100px;   
            margin-left: 200px;    /* 左側(cè) 200px 被側(cè)邊欄覆蓋 */
            background-color: rgba(0, 255, 0, .5);   
        }  
    </style>
</head>
<body>
    <!-- 能優(yōu)先渲染 main -->
    <div class="container1">  
        <div class="main1">主列</div>   <!-- 如果想要交換兩列, 需要將 .aside1 中的 left 改成 right, .main1 中的 margin-left 改成 margin-right -->
        <div class="aside1">子列</div>  
    </div> 
    <!-- 不能優(yōu)先渲染 main -->
    <div class="container2">  
        <div class="aside2">子列</div>  
        <div class="main2">主列</div>   <!-- 如果想要交換兩列, 需要將 .aside2 中的 float 改成 right, .main2 中的 margin-left 改成 margin-right -->
    </div>  
    <!-- 能優(yōu)先渲染 main, 注意: aside 不包括在 container 中-->
    <div class="container3">  
        <div class="main3">主列</div>   <!-- 如果想要交換兩列, 需要將 .aside3 中的 float 改成 right, .main3 中的 margin-left 改成 margin-right -->
    </div> 
    <div class="aside3">子列</div>  
</body>
</html>
兩列布局.png

[1] 三列布局

  • 兩側(cè)固定寬度(設(shè)置 absolute坟冲、float),主列自適應(yīng)屏幕(調(diào)整margin)溃蔫。
  • absolute + margin健提、float + marginfloat + 負(fù)margin 等方式伟叛。
<!DOCTYPE html>
<html>
<head>
    <title>三列布局</title>
    <meta charset="utf-8">
    <style type="text/css">
        /* 方法1: absolute + margin 方式 */
        /* 優(yōu)點(diǎn): 可以優(yōu)先渲染主元素 main 中的內(nèi)容*/
        /* 缺點(diǎn): leftSide 和 rightSide 列脫離了文檔流, 當(dāng) leftSide 和 rightSide 列比 main 列高時(shí)會(huì)覆蓋后面的布局 */
        .container1 {   
            position: relative;   
            margin: 10px;
            border: 1px solid #000;
        }   
        .leftSide1 {   
            position: absolute;  
            top: 0;   /* 優(yōu)先渲染 main 中內(nèi)容時(shí)不可以省略私痹,因?yàn)?main1 中的 margin 占據(jù)了 左、右的大小 */
            left: 0;
            width: 200px;   
            height: 100px;   
            background-color: rgba(255, 0, 0, .5);   
        }   
        .rightSide1 {   
            position: absolute;  
            top: 0;   /* 優(yōu)先渲染 main 中內(nèi)容時(shí)不可以省略统刮,因?yàn)?main1 中的 margin 占據(jù)了 左紊遵、右的大小 */
            right: 0;
            width: 300px;   
            height: 100px;   
            background-color: rgba(255, 0, 0, .5);   
        }   
        .main1 {   
            height: 100px;   
            margin: 0 300px 0 200px;    /* 左側(cè) 200px 被側(cè)邊欄覆蓋 */
            background-color: rgba(0, 255, 0, .5);   
        }  

        /* 方法2: float + margin 方式 */
        /* 優(yōu)點(diǎn)和缺點(diǎn)與方法 1 前者相反 */
        .container2 {   
            position: relative;   
            margin: 10px;
            border: 1px solid #000;
        }   
        .leftSide2 {   
            float: left; 
            width: 200px;   
            height: 100px;   
            background-color: rgba(255, 0, 0, .5);   
        }  
        .rightSide2 {   
            float: right; 
            width: 300px;   
            height: 100px;   
            background-color: rgba(255, 0, 0, .5);   
        }   
        .main2 {   
            height: 100px;   
            margin: 0 300px 0 200px;    /* 左側(cè) 200px 被側(cè)邊欄覆蓋 */
            background-color: rgba(0, 255, 0, .5);   
        }  

        /*  方法3: float + 負(fù)margin 方式 (即雙飛翼布局) */
        /*  浮動(dòng) container 和 side 列, 通過 負(fù)margin 正確定位 side 列
         *  container 寬度值設(shè)為 100%
         *  main 列的 margin-left 消除被 side 覆蓋的部分
         *     side 不包括在 container 中
         */
        /*  優(yōu)點(diǎn): 解決了 float + margin 不能優(yōu)先渲染 main 中的內(nèi)容 */
        .container3 {   
            float: left;   /* 浮動(dòng) */
            width: 100%;
            border: 1px solid #000;
        }   
        .leftSide3 {   
            float: left;  
            margin-left: -100%;  /* 調(diào)整到合適位置 */
            width: 200px;   
            height: 100px;   
            background-color: rgba(255, 0, 0, .5);   
        }   
        .rightSide3 {   
            float: right;  
            margin-left: -100%;  /* 調(diào)整到合適位置 */
            width: 300px;   
            height: 100px;   
            background-color: rgba(255, 0, 0, .5);   
        }   
        .main3 {   
            height: 100px;   
            margin: 0 300px 0 200px;  /* 左側(cè) 200px 被側(cè)邊欄覆蓋 */
            background-color: rgba(0, 255, 0, .5);   
        }  
    </style>
</head>
<body>
    <!-- 能優(yōu)先渲染 main -->
    <div class="container1">  
        <div class="main1">主列</div>  
        <div class="leftSide1">左列</div>  
        <div class="rightSide1">右列</div>  
    </div> 
    <!-- 不能優(yōu)先渲染 main -->
    <div class="container2">  
        <div class="leftSide2">左列</div>  
        <div class="rightSide2">右列</div>  
        <div class="main2">主列</div>   
    </div>  
    <!-- 能優(yōu)先渲染 main, 注意: side 不包括在 container 中-->
    <div class="container3">  
        <div class="main3">主列</div> 
    </div> 
    <div class="leftSide3">左列</div>  
    <div class="rightSide3">右列</div>  
</body>
</html>
三列布局.png

[3] 彈性 (Flex) 布局

  • 彈性布局:采用 Flex 布局的元素,稱為 Flex 容器(flex container)侥蒙,它的所有子元素自動(dòng)成為容器成員暗膜,稱為 Flex 項(xiàng)目(flex item)。
    • 用法:display:flex (不能與 float鞭衩、position 混用)学搜;
    • (父)容器屬性:flex-flow (包括 flex-directionflex-wrap)醋旦、justify-content(水平)恒水、align-items(垂直)、align-content饲齐;
    • (子)項(xiàng)目屬性:order钉凌、flex-growflex-shrink捂人、flex-basis御雕、flexalign-self滥搭。
接下來是幾個(gè)應(yīng)用 Flex 布局的例子:
  • 三列等寬布局
<style type="text/css"> 
    #main {
        width: 220px;
        border: 1px solid black;
        display: flex;  /* 使用彈性布局 */
    }
    #main div {
        flex: 1;  /* 所有彈性盒模型對(duì)象的子元素都有相同的長度, 忽略它們內(nèi)部的內(nèi)容 */
    }
</style>
</head>
<body>
<div id="main">
  <div style="background-color:coral;">紅色</div>
  <div style="background-color:lightblue;">藍(lán)色</div>  
  <div style="background-color:lightgreen;">帶有更多內(nèi)容的綠色 div</div>
</div>
</body>
三列等寬布局.png
  • 隨機(jī)變換盒子顏色
<style type="text/css"> 
    #main {
        width: 800px;
        height: 400px;
        border: 1px solid black;
        display: flex;  /* 使用彈性布局 */
        flex-flow: row wrap;  /* flex-direction (規(guī)定 Flex 項(xiàng)目按行分布) 和 flex-wrap (Flex 項(xiàng)目自動(dòng)換行) */
        justify-content: space-between;  /* 水平等距 */
        align-items: center;  /*  垂直居中 */
    }
    #main div {   /* 定義 Flex 項(xiàng)目 */
        width: 100px;
        height: 100px;
        margin: 2px;
    }
</style>
</head>
<body>
<div id="main">
    <!-- Js 生成的 Flex 項(xiàng)目 -->
</div>
<script>
    var color = ["#FFD700", "#FF4040", "#D1EEEE", "#CAFF70", "#C1CDCD", "#B03060", "#9ACD32", "#7CFC00", "#FF8C00"];
    for (var i=0; i < 13; i++) {
        var div = document.createElement('div');
        var pos = Math.floor(Math.random() * color.length);
        div.style.background = color[pos];
        var num = Math.floor(Math.random() * 100);  /* 生成一個(gè) [0, 100) 大小的整數(shù) */
        div.style.order = num;   /* Flex 項(xiàng)目按照從小到大的順序顯示 */
        div.innerHTML= num;
        document.getElementById('main').appendChild(div);
    }
</script>
</body>
隨機(jī)變換盒子顏色.png

更多關(guān)于 Flex 用法酸纲,可以參考文章
Flex 布局語法教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瑟匆,隨后出現(xiàn)的幾起案子闽坡,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疾嗅,死亡現(xiàn)場離奇詭異外厂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)代承,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門汁蝶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人论悴,你說我怎么就攤上這事掖棉。” “怎么了膀估?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵幔亥,是天一觀的道長。 經(jīng)常有香客問我玖像,道長紫谷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任捐寥,我火速辦了婚禮笤昨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘握恳。我一直安慰自己瞒窒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布乡洼。 她就那樣靜靜地躺著崇裁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪束昵。 梳的紋絲不亂的頭發(fā)上拔稳,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音锹雏,去河邊找鬼巴比。 笑死,一個(gè)胖子當(dāng)著我的面吹牛礁遵,可吹牛的內(nèi)容都是我干的轻绞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼佣耐,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼政勃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起兼砖,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤奸远,失蹤者是張志新(化名)和其女友劉穎既棺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懒叛,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡援制,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芍瑞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡褐墅,死狀恐怖拆檬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妥凳,我是刑警寧澤竟贯,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站逝钥,受9級(jí)特大地震影響屑那,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艘款,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一持际、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哗咆,春花似錦蜘欲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至年碘,卻和暖如春澈歉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屿衅。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國打工埃难, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人傲诵。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓凯砍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拴竹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悟衩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,754評(píng)論 1 92
  • H5移動(dòng)端知識(shí)點(diǎn)總結(jié) 閱讀目錄 移動(dòng)開發(fā)基本知識(shí)點(diǎn) calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,507評(píng)論 0 26
  • 移動(dòng)開發(fā)基本知識(shí)點(diǎn) 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,472評(píng)論 0 6
  • 前言 溫馨提示:本文較長栓拜,圖片較多座泳,本來是想寫一篇 CSS 布局方式的惠昔,但是奈何 CSS 布局方式種類太多并且實(shí)現(xiàn)...
    sunshine小小倩閱讀 3,139評(píng)論 0 59
  • 曾經(jīng)聽說 這個(gè)世上會(huì)有另一個(gè)自己 在某一個(gè)角落 用完全不一樣的方式活著 多么詭異啊 又怎么可能呢 我心里暗自嘲笑這...
    Linnnnnnxx閱讀 251評(píng)論 0 0