关于css页面左右,左中右,上中下布局的一些总结探讨

本次我们将探讨的布局是平时项目中常见的几种情况,具体描述如下:

三栏布局

1.左右宽度固定,中间自适应(推荐使用flex或者calc布局因为代码简单,问题少)
2.上下高度固定,中间自适应
3.中间宽度固定,左右自适应

两栏布局

1.左宽度固定,右自适应
2.右宽度固定,左自适应
3.上高度固定,下自适应
4.下高度固定,上自适应

一、左右宽度固定,中间自适应

这种左右宽度固定中间自适应的情况最多出现的地方就是移动端标题栏的自适应效果。如图:返回和更多按钮的宽度一般情况是固定的,标题框的宽度一般是自适应的。要做到这种效果,一般有三种方法①float布局②absolute绝对定位③flex布局。推荐使用第三种flex布局。


image.png

1.float布局
缺点 :浮动是脱离文档流的,有些时候需要清除浮动,需要很好的处理浮动
优点 :兼容性比较好

<style>
    * {
        padding: 0;
        margin: 0;
    }
    .left {
        background-color: blue;
        width: 300px;
        height: 200px;
        float: left;
    }
    .center {
        background-color: #ccc;
        height: 200px;
        margin: 0 300px;
    }
    .right {
        background-color: red;
        width: 300px;
        height: 200px;
        float: right;

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

2.position:absolute布局
缺点 :该布局脱离文档流,所以子元素也必须脱离文档流,因此可使用性比较差
优点 :快捷,比较不容易出问题

<style>
    * {
        padding: 0;
        margin: 0;
    }
    .section{
        position: relative;
        height: 300px;
        width: 100%;
        background-color: black;
    }
    .left {
        background-color: blue;
        width: 300px;
        height: 200px;
        position: absolute;
        top: 0;
        left: 0;

    }
    .center {
        background-color: #ccc;
        height: 200px;
        margin: 0 300px;
    }

    .right {
        background-color: red;
        width: 300px;
        height: 200px;
        position: absolute;
        top: 0;
        right: 0;

    }
</style>
<body>
    <section class="section">
        <div class="left">left</div>
        <div class="center">浮动 : center--center--center--</div>
        <div class="right">right</div>
    </section>
</body>
3.flex布局

思路:将父元素box设为display:flex;可将box设置为弹性盒模型进行布局(如果对flex不了解,可点击打开链接学习)

<style>
    * {
        padding: 0;
        margin: 0;
    }

    .section {
        height: 300px;
        width: 100%;
        background-color: black;
        display: flex;
        /* justify-content: space-between */
    }

    .left {
        background-color: blue;
        width: 300px;
        height: 200px;

    }

    .center {
        background-color: #ccc;
        height: 200px;
        flex: 1;
    }

    .right {
        background-color: red;
        width: 300px;
        height: 200px;
    }
</style>
<body>
    <section class="section">
        <div class="left">left</div>
        <div class="center">浮动 : center--center--center--</div>
        <div class="right">right</div>
    </section>
</body>
4.对中间的宽度进行calc计算

三个元素都向左浮动,左右定宽,中间的对其进行计算,让100%宽度减去左右宽度,即为中间宽度。

<style>
    * {
        padding: 0;
        margin: 0;
    }

    .section {
        height: 300px;
        /* width: 100%; */
        background-color: black;
        /* overflow: hidden; */
    }

    .left {
        background-color: blue;
        width: 300px;
        height: 200px;
        float: left;

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

    .center {
        float: left;
        background-color: #ccc;
        height: 200px;
        width: calc(100% - 600px);
    }
</style>

<body>
    <section class="section">
        <div class="left">left</div>
        <div class="center">浮动 : center--center--center--</div>
        <div class="right">right</div>
    </section>
</body>
5.双飞翼布局

目的:为了优先显示中间主要部分,浏览器渲染引擎在构建和渲染渲染树是异步的(谁先构建好谁先显示),故在编写时,先构建中间main部分,但由于布局原因,将left置于center左边,故而出现了双飞翼布局。

 <style>
    * {
        padding: 0;
        margin: 0;
    }

    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>

<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>
6.圣杯布局
<style>
    * {
        padding: 0;
        margin: 0;
    }

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

<body>
    <section class="wrapper">
        <section class="col main">main</section>
        <aside class="col left">left</aside>
        <aside class="col right">right</aside>
    </section>
</body>

圣杯布局的缺点:正常情况下是没有问题的,但是特殊情况下就会暴露此方案的弊端,如果将浏览器无线放大时,「圣杯」将会「破碎」掉。如图,当main部分的宽小于left部分时就会发生布局混乱。
圣杯布局和双飞翼的区别:圣杯布局是整体使用了一个container(上例的wrapper),将三列放入其中,left和right占据的是wrapper的padding-left和 padding-right(上例第八行padding:0 100px;)。双飞翼布局是在center部分多加了一个节点元素,left和right部分的位置在main-wrap的margin(magin-left和margin-right)部分。

二、上下高度固定中间自适应

参考文件地址

1.absolute布局:

上中下都设置属性absolute,跟左中右布局差不多,但是要注意的要设置html和body的高度。center的要设置top和bottom的值,左中右设置margin就可以了

<style>
 * {
        padding: 0;
        margin: 0;
    }

    html,
    body {
        /* 一定要设置这个值不然撑不开 */
        height: 100%;
    }

    .section {
        height: 100%;
        width: 100%;
        background-color: black;
        position: relative;
    }

    .top {
        background-color: blue;
        width: 100%;
        height: 200px;
        position: absolute;
        top: 0;

    }

    .center {
        background-color: #ccc;
        width: 100%;
        position: absolute;
        top: 200px;
        bottom: 200px;
        overflow: auto;
    }

    .buttom {
        background-color: red;
        width: 100%;
        height: 200px;
        position: absolute;
        bottom: 0;
    }
</style>

<body>
    <section class="section">
        <div class="top">top</div>
        <div class="center">
            0987
        </div>
        <div class="buttom">buttom</div>
    </section>
</body>
2.flex布局

和左中右布局原理一样只是方向是竖直的。

<style>
    * {
        padding: 0;
        margin: 0;
    }

    html,
    body {
        /* 一定要设置这个值不然撑不开 */
        height: 100%;
    }

    .section {
        height: 100%;
        width: 100%;
        background-color: black;
        display: flex;
        flex-direction: column;
    }

    .top {
        background-color: blue;
        width: 100%;
        height: 200px;

    }

    .center {
        background-color: #ccc;
        /* height: 100%; */
        flex: 1;
        overflow: auto;
    }

    .buttom {
        background-color: red;
        width: 100%;
        height: 200px;
    }
</style>

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,727评论 1 92
  • 三栏是CSS布局中常见的一种布局模式,顾名思义,就是将网页内容以三列的形式呈现。通常,三栏布局中的左栏和右栏是固定...
    bmwz110阅读 865评论 0 6
  • 一、CSS入门 1、css选择器 选择器的作用是“用于确定(选定)要进行样式设定的标签(元素)”。 有若干种形式的...
    宠辱不惊丶岁月静好阅读 1,583评论 0 6
  • 1.固定宽度布局 一列水平居中布局一列的宽度固定为已知值,使用margin设置来达到水平居中效果。html代码: ...
    gugaga阅读 1,891评论 0 1
  • 我要做远方的忠诚的儿子 和物质的短暂情人 和所有以梦为马的诗人一样 我不得不和烈士和小丑走在同一道路上 《以梦为马...
    极译Gieey阅读 774评论 3 13