css三列布局--两边固定中间自适应和中间固定两边自适应

三列布局
本篇讲三列布局,面试常考题,自己总结的,如有什么问题,欢迎指出!我会用红色标注出主要作用部分,都是最精简的写法,,没有多余的修饰。

布局方式一:两边固定中间自适应
1.flex布局
思路:将父元素box设为display:flex;可将box设置为弹性盒模型进行布局(如果对flex不了解,可点击打开链接学习)

<!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不会叠加*/
                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.利用浮动(float)
让左右元素浮动,缺点是中间元素必须置于二者之后,不然right元素会进入下一行

<!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>  
        <!--该布局法的好处是受外界影响小,但是不足是 三个元素的顺序,center一定要放在最后,这是               
                和绝对定位不一样的地方,center占据文档流位置,所以一定要放在最后,左右两个元素位置没有关系。
                当浏览器窗口很小的时候,右边元素会被击倒下一行。-->
        <div class="left">left</div>
        <div class="right">right</div>
        <div class="center">center</div>
        
    </body>  
</html>  

3.利用绝对定位(position)
center居中并利用margin为左右两边留出位置,左右绝对定位

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>css三列布局</title>
        <style type="text/css">     
            /*左右固定,中间自适应  利用绝对定位*/
            .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;*/   /*如果没有这一句,那么,center这个div的文字就不会自动换行*/
                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.对中间的宽度进行calc计算
三个元素都向左浮动,左右定宽,中间的对其进行计算,让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.双飞翼布局(重点来了)
目的:为了优先显示中间主要部分,浏览器渲染引擎在构建和渲染渲染树是异步的(谁先构建好谁先显示),故在编写时,先构建中间main部分,但由于布局原因,将left置于center左边,故而出现了双飞翼布局。

<!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;/*这是圣杯和双飞翼最明显的区别,在main内部使用的是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)不会盖住中间(center)部分,left和right盖住的是wrap元素的两边,即main-wrap的margin部分。

6.圣杯布局(也是重点)
优先渲染主要部分,此部分参考了木羽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>
圣杯布局的缺点:正常情况下是没有问题的,但是特殊情况下就会暴露此方案的弊端,如果将浏览器无线放大时,「圣杯」将会「破碎」掉。如图,当main部分的宽小于left部分时就会发生布局混乱。

圣杯布局和双飞翼的区别:(按我自己理解)

圣杯布局是整体使用了一个container(上例的wrapper),将三列放入其中,left和right占据的是wrapper的padding-left和 padding-right(上例第八行padding:0 100px;)。

双飞翼布局是在center部分多加了一个节点元素,left和right部分的位置在main-wrap的margin(magin-left和margin-right)部分。
<div id="main" class="col">
    <div id="main-wrap"> #main </div>
</div>

布局方式二:两边自适应中间固定
1.css3布局
目前没有浏览器支持 box-flex 属性。Firefox 支持替代的 -moz-box-flex 属性。Safari、Opera 以及 Chrome 支持替代的 -webkit-box-flex 属性。

box-flex 属性规定框的子元素是否可伸缩其尺寸。提示:可伸缩元素能够随着框的缩小或扩大而缩写或放大。只要框中有多余的空间,可伸缩元素就会扩展来填充这些空间。
<!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 属性用于设置或检索弹性盒的扩展比率。*/
                            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进行布局,详见flex-grow属性

3.左右利用calc()函数计算

<!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>

两边自适应中间固定暂时整理到这三种方法。

作者:DOM曼珠沙华
来源:CSDN
原文:https://blog.csdn.net/a18792627168/article/details/79686746
版权声明:本文为博主原创文章,转载请附上博文链接!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容