css三列布局--兩邊固定中間自適應(yīng)和中間固定兩邊自適應(yīng)

三列布局
本篇講三列布局大诸,面試惩背В考題贯卦,自己總結(jié)的,如有什么問(wèn)題焙贷,歡迎指出撵割!我會(huì)用紅色標(biāo)注出主要作用部分,都是最精簡(jiǎn)的寫(xiě)法辙芍,啡彬,沒(méi)有多余的修飾。

布局方式一:兩邊固定中間自適應(yīng)
1.flex布局
思路:將父元素box設(shè)為display:flex;可將box設(shè)置為彈性盒模型進(jìn)行布局(如果對(duì)flex不了解故硅,可點(diǎn)擊打開(kāi)鏈接學(xué)習(xí))

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            #box{
                width:100%;
                height:100px;
                display:flex;
                margin:10px;
            }
            #left,#right{
                width:200px;
                height:100px;
                margin:10px;
                background-color:#999;
            }
            #center{
                flex:1;
                height:100px;
                margin:10px;/*左右margin不會(huì)疊加*/
                background-color:#f00;
            }
        </style>
    </head>
    <body>
        <div id="box">
            <div id="left">left</div>
            <div id="center">center</div>
            <div id="right">right</div>
        </div>
    </body>
</html>

2.利用浮動(dòng)(float)
讓左右元素浮動(dòng)庶灿,缺點(diǎn)是中間元素必須置于二者之后,不然right元素會(huì)進(jìn)入下一行

<!DOCTYPE html>  
<html>  
    <head>  
        <meta charset="UTF-8">  
        <title></title>  
        <style type="text/css">
            .left,.right{
                width:200px;
                height:200px;
                background-color:#999;
            }
            .left{
                float:left;
            }
            .right{
                float:right;
            }
            .center{
                margin:0 200px;
                height:300px;
                background-color:#f00;
            }
        </style>  
    </head>  
    <body>  
        <!--該布局法的好處是受外界影響小吃衅,但是不足是 三個(gè)元素的順序往踢,center一定要放在最后,這是               
                和絕對(duì)定位不一樣的地方徘层,center占據(jù)文檔流位置峻呕,所以一定要放在最后,左右兩個(gè)元素位置沒(méi)有關(guān)系趣效。
                當(dāng)瀏覽器窗口很小的時(shí)候瘦癌,右邊元素會(huì)被擊倒下一行。-->
        <div class="left">left</div>
        <div class="right">right</div>
        <div class="center">center</div>
        
    </body>  
</html>  

3.利用絕對(duì)定位(position)
center居中并利用margin為左右兩邊留出位置跷敬,左右絕對(duì)定位

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>css三列布局</title>
        <style type="text/css">     
            /*左右固定讯私,中間自適應(yīng)  利用絕對(duì)定位*/
            .container{
                width: 100%;
                height: 100%;
                position: relative;
            }
            .left{
                position: absolute;
                left: 0;
                top: 0;
                width: 400px;
                height: 200px;
                background-color: black;
                color:#fff;
            }
            .center{
                /*width: auto;*/   /*如果沒(méi)有這一句,那么西傀,center這個(gè)div的文字就不會(huì)自動(dòng)換行*/
                margin: 0 400px;
                height: 400px;
                background-color: yellow;
            }
            .right{
                position: absolute;
                top: 0;
                right: 0;
                width: 400px;
                height: 300px;
                background-color: red;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <div class="left">left</div>
            <div class="center">center</div>
            <div class="right">right</div>
        </div>
    </body>
</html>

4.對(duì)中間的寬度進(jìn)行calc計(jì)算
三個(gè)元素都向左浮動(dòng)妄帘,左右定寬,中間的對(duì)其進(jìn)行計(jì)算池凄,讓100%寬度減去左右寬度,即為中間寬度鬼廓。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .container{
                overflow: hidden;
            }
            .left,.right{
                float: left;
                width: 100px;
                background:red;
            }
            .center{
                float: left; 
                width:calc(100% - 200px);
                background:yellow;
            }
        </style>
    </head>
    <body>
        <div class="container">
        <div class="left">left</div>
            <div class="center">center</div>
            <div class="right">right</div>
        </div>
    </body>
</html>

5.雙飛翼布局(重點(diǎn)來(lái)了)
目的:為了優(yōu)先顯示中間主要部分肿仑,瀏覽器渲染引擎在構(gòu)建和渲染渲染樹(shù)是異步的(誰(shuí)先構(gòu)建好誰(shuí)先顯示),故在編寫(xiě)時(shí)碎税,先構(gòu)建中間main部分尤慰,但由于布局原因,將left置于center左邊雷蹂,故而出現(xiàn)了雙飛翼布局伟端。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            body {min-width: 550px;}
            .col {float: left;}         
            #main {
                width: 100%;
                height: 200px;
                background-color: #ccc;
            }           
            #main-wrap {
                margin: 0 190px;/*這是圣杯和雙飛翼最明顯的區(qū)別,在main內(nèi)部使用的是margin匪煌,而圣杯是直接在container部分使用padding*/        
            }
                        #left,#right {
                width: 190px;
                height: 200px;
                background-color: #0000FF;
            }   
            #left{
                margin-left: -100%;
            }       
            #right {
                margin-left: -190px;
                background-color: #FF0000;
            }
        </style>
    </head>
    <body>
        <div id="container">
            <div id="main" class="col">
                <div id="main-wrap"> #main </div>
            </div>
            <div id="left" class="col">#left</div>
            <div id="right" class="col">#right</div>
        </div>
    </body>
</html>
這種布局的好處是:兩邊(left和right)不會(huì)蓋住中間(center)部分责蝠,left和right蓋住的是wrap元素的兩邊党巾,即main-wrap的margin部分。

6.圣杯布局(也是重點(diǎn))
優(yōu)先渲染主要部分,此部分參考了木羽zwwill

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css"> 
        .wrapper {
            padding: 0 100px; 
            overflow:hidden;
        }
        .col {
            position: relative; 
            float: left;
        }
        .main {
            width: 100%;
            height: 200px;
            background:yellow;
        }
        .left,.right {
            width: 100px; 
            height: 200px; 
            background:red;
        }
        .left{
            margin-left: -100%;
            left: -100px;
        }
        .right {
            margin-left: -100px; 
            right: -100px;
        }
        
        </style>
    </head>
    <body>
        <section class="wrapper">
            <section class="col main">main</section>
            <aside class="col left">left</aside>
            <aside class="col right">right</aside>
        </section>
    </body>
</html>
圣杯布局的缺點(diǎn):正常情況下是沒(méi)有問(wèn)題的霜医,但是特殊情況下就會(huì)暴露此方案的弊端齿拂,如果將瀏覽器無(wú)線放大時(shí),「圣杯」將會(huì)「破碎」掉肴敛。如圖署海,當(dāng)main部分的寬小于left部分時(shí)就會(huì)發(fā)生布局混亂。

圣杯布局和雙飛翼的區(qū)別:(按我自己理解)

圣杯布局是整體使用了一個(gè)container(上例的wrapper)医男,將三列放入其中砸狞,left和right占據(jù)的是wrapper的padding-left和 padding-right(上例第八行padding:0 100px;)。

雙飛翼布局是在center部分多加了一個(gè)節(jié)點(diǎn)元素镀梭,left和right部分的位置在main-wrap的margin(magin-left和margin-right)部分刀森。
<div id="main" class="col">
    <div id="main-wrap"> #main </div>
</div>

布局方式二:兩邊自適應(yīng)中間固定
1.css3布局
目前沒(méi)有瀏覽器支持 box-flex 屬性。Firefox 支持替代的 -moz-box-flex 屬性丰辣。Safari撒强、Opera 以及 Chrome 支持替代的 -webkit-box-flex 屬性。

box-flex 屬性規(guī)定框的子元素是否可伸縮其尺寸笙什。提示:可伸縮元素能夠隨著框的縮小或擴(kuò)大而縮寫(xiě)或放大飘哨。只要框中有多余的空間,可伸縮元素就會(huì)擴(kuò)展來(lái)填充這些空間琐凭。
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            div[class=me] { 
                display: -webkit-box;
            }
            div div { 
                background: red; 
                height: 100px;
            }
            div div:nth-child(1) {
                -webkit-box-flex:1;
            }
            div div:nth-child(2) { 
                width: 800px; 
                background: #ccc;
            }
            div div:nth-child(3) {
                -webkit-box-flex:1;
            }
        </style>
    </head>
    <body>
        <div class="me">
            <div>left</div>
            <div>center</div>
            <div>right</div>
        </div>
    </body>
</html>

2.flex布局

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            *{
                margin:0;
                padding:0;
            }
            .wrap{
                display:flex;
                flex-direction:row;
                margin-top:20px;
            }
            .center{
                width:800px;
                text-align:center;
                background:#ccc;
            }
            .left,.right{
                /*flex-grow 屬性用于設(shè)置或檢索彈性盒的擴(kuò)展比率芽隆。*/
                            flex-grow: 1;
                            line-height: 30px;
                            background:red;
                    }
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="left">left</div>
            <div class="center">center</div>
            <div class="right">right</div>
        </div>
    </body>
</html>
利用flex-grow進(jìn)行布局,詳見(jiàn)flex-grow屬性

3.左右利用calc()函數(shù)計(jì)算

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            #container{
                height:200px;
                width: 100%;
            }
            
            #left,#right{
                float:left;
                background-color:#ccc;
                height:100%;
                width: calc(50% - 500px);
            }
            #center{
                float:left;
                background-color:yellow;
                height:100%;
                width:1000px;
            }
        </style>
    </head>
    <body>
        <div id="container">
            <div id="left">left</div>
            <div id="center">center</div>
            <div id="right">right</div>
        </div>
    </body>
</html>

兩邊自適應(yīng)中間固定暫時(shí)整理到這三種方法统屈。

作者:DOM曼珠沙華
來(lái)源:CSDN
原文:https://blog.csdn.net/a18792627168/article/details/79686746
版權(quán)聲明:本文為博主原創(chuàng)文章胚吁,轉(zhuǎn)載請(qǐng)附上博文鏈接!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愁憔,一起剝皮案震驚了整個(gè)濱河市腕扶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吨掌,老刑警劉巖半抱,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異膜宋,居然都是意外死亡窿侈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)秋茫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)史简,“玉大人,你說(shuō)我怎么就攤上這事肛著≡脖” “怎么了跺讯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)衙傀。 經(jīng)常有香客問(wèn)我抬吟,道長(zhǎng),這世上最難降的妖魔是什么统抬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任火本,我火速辦了婚禮,結(jié)果婚禮上聪建,老公的妹妹穿的比我還像新娘钙畔。我一直安慰自己,他們只是感情好金麸,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布擎析。 她就那樣靜靜地躺著,像睡著了一般挥下。 火紅的嫁衣襯著肌膚如雪揍魂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天棚瘟,我揣著相機(jī)與錄音现斋,去河邊找鬼。 笑死偎蘸,一個(gè)胖子當(dāng)著我的面吹牛庄蹋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播迷雪,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼限书,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了章咧?” 一聲冷哼從身側(cè)響起倦西,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赁严,沒(méi)想到半個(gè)月后扰柠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡误澳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秦躯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忆谓。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晶伦,死狀恐怖设褐,靈堂內(nèi)的尸體忽然破棺而出乡革,到底是詐尸還是另有隱情迫皱,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布昙沦,位于F島的核電站琢唾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏盾饮。R本人自食惡果不足惜采桃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丘损。 院中可真熱鬧普办,春花似錦、人聲如沸徘钥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)呈础。三九已至舆驶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間而钞,已是汗流浹背沙廉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留笨忌,地道東北人蓝仲。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像官疲,于是被迫代替她去往敵國(guó)和親袱结。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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