CSS 布局

常见布局示意图

单列布局

  • 定宽
width: 1000px; 或 max-width: 1000px;
  • 水平居中
margin-left: auto; margin-right: auto;
  • 内部元素水平居中
.parent { text-align: center; }
.child { display: inline-block; }

// IE6不支持inline-block
.child { *display: inline; *zoom: 1; }  

第一列第2个例子(通栏)

    <style type="text/css">
    * {
        padding: 0;
        margin: 0;
    }

    body {
        /* 
        若 .layout 设置宽度 width: 960px;,当窗口宽度小于 960px 时,
        header、footer的背景色会出现bug

        给 body 设置 min-width 去掉滚动背景色 bug 

        若 .layout 设置宽度 max-width: 960px;,那就不需要了
        */
        /*min-width: 960px;*/
    }

    .layout {
        /* 注意 max-width 和 width 的区别,若使用 width,当窗口宽度小于 960px时,会出现横向滚动条 */
        /*width: 960px; */
        max-width: 960px;
        margin: 0 auto;
        border: 1px solid black;
    }

    #header {
        height: 100px;
        background: teal;
        text-align: center;
        font-size: 0;
    }

    #header > .layout {
        padding: 10px;
    }

    #header .btn {
        display: inline-block;
        padding: 5px 8px;
        border: 1px solid #ccc;
        border-right: none;
        color: #fff;
        text-decoration: none;
        font-size: 15px;
    }

    #header .btn:first-child {
        border-radius: 5px 0 0 5px;
    }

    #header .btn:last-child {
        border-right: 1px solid #ccc;
        border-radius: 0 5px 5px 0;
    }

    #content {
        position: relative;
        height: 500px;
        background: lightcoral;
    }

    #footer {
        height: 80px;
        background: lightgreen;
    }
    </style>
</head>
<body>
<header id="header">
    <div class="layout">
        <a href="#" class="btn">HTML</a>
        <a href="#" class="btn">CSS</a>
        <a href="#" class="btn">JavaScript</a>
    </div>
</header>
<main id="content" class="layout">内容</main>
<footer id="footer">
    <div class="layout">尾部</div>
</footer>
</body>

第一列第5个例子

    <style type="text/css">
    * {
        padding: 0;
        margin: 0;
    }

    .parent {
        /* 或者我们采用 flex  */
        /*display: flex;*/
        /*justify-content: center;*/

        max-width: 600px;
        margin: 0 auto;
        padding: 10px 0;
        border: 1px solid red;
        text-align: center;
        font-size: 0;
    }

    .child {
        /* 
        inline-block 要少用,一般作为父元素的唯一子元素才考虑,
        因为存在底部间距问题,需要在父元素内设置字体大小为 0

        这里 display: inline-block; 形成BFC,可以包含浮动元素
        */
        display: inline-block;
        border: 1px solid green;
        font-size: 15px;
    }

    .child > span {
        float: left;
        border: 1px solid blue;
    }
    </style>
</head>
<body>
<div class="parent">
    <div class="child">
        <span>确定</span>
        <span>取消</span>
    </div>
</div>
</body>

利用 inline-block 做到绝对居中(了解就行)

   <style type="text/css">
    * {
        padding: 0;
        margin: 0;
    }

    .wrapper {
        width: 600px;
        height: 600px;
        margin: 0 auto;
        border: 1px solid red;
        /* 利用 左右两个 span 和 text-align: center; 做到水平居中 */
        text-align: center;
    }

    .wrapper > span {
        /* 利用 span 的高度 100% 和 vertical-align: middle; 做到垂直居中 */
        display: inline-block;
        height: 100%;
        border: 1px solid pink;
        vertical-align: middle;
    }

    /* span 元素 我们用 ::before、::after 来代替;*/
    .wrapper:before,
    .wrapper:after 
    {
        content: "";
        display: inline-block;
        height: 100%;
        vertical-align: middle;
    }

    .wrapper > main {
        display: inline-block;
        width: 200px;
        background-color: #ccc;
        vertical-align: middle;
    }

    </style>
</head>
<body>
<div class="wrapper clearfix">
    <!-- <span>12345</span> -->
    <main>main main main main main main main main main main main main</main>
    <!-- <span>12345</span> -->
</div>
</body>

双列布局

  • 一列固定宽度,另外一列自适应高度
  • 浮动元素/定位元素 + 普通元素 margin

第二列第1个例子

    <style type="text/css">
    * {
        padding: 0;
        margin: 0;
    }

   .clearfix:after {
        content: "";
        display: block;
        clear: both;
    }

    .content {
        /* 2、采用定位的方式 */
        /*position: relative;*/

        /* 3、采用flex的方式 */
        /*display: flex;*/

        max-width: 800px;
        margin: 0 auto;
        background-color: pink;
    }

    .content > .aside {
        /* 1、采用浮动的方式 */
        float: left;

        /* 如果侧栏在右边呢?注意:页面元素的渲染顺序 */
        /*float: right;*/

        /*position: absolute;*/
        /*left: 0;*/
        /*right: 0;*/

        width: 200px;
        height: 400px;
        background: teal;      
    }

    .content > .main {
       margin-left: 210px;
       /*margin-right: 210px;*/

       /*margin-left: 10px;*/
       /*flex-grow: 1;*/

       height: 600px;
       background: orange;
    }
    </style>
</head>
<body>
<div class="content clearfix">
    <aside class="aside">aside</aside>
    <main class="main">content</main>
</div>
</body>

第二列第2个例子

   <style type="text/css">
    * {
        padding: 0;
        margin: 0;
    }

    .card {
        max-width: 400px;
        margin: 0 auto;
        border: 1px solid green;

        position: relative;

        /*display: flex;*/
    }

    .card > .avator {
        /*float: left;*/

        /* 
        注意:如果 .text 内容撑起的高度小于 .avator 的高度怎么办呢? 
        所以 要考虑到多方面的情况,可以给 .text 设置最小高度
        */
        /* 除了 float,我们也可以使用 定位 的方式来做 */
        position: absolute;
        left: 0;
        right: 0;

        /* 用 flex 的方式来做 */
        /* 
        这里 .avator 会被压缩空间,通过设置其 min-width 恢复正常 
        或者给 .text 设置一个宽度 和 flex-grow: 1; 使其占据剩余空间
        */
        
        width: 40px;
        height: 40px;
        border-radius: 50%;
        border: 1px solid black;
        background-color: #ccc;
    }

    .card > .text {
        margin-left: 52px;

        /*margin-left: 10px;*/
        /*width: 100px;*/
        /*flex-grow: 1;*/

        min-height: 42px;
        border: 1px solid red;
    }

    </style>
</head>
<body>
<div class="card">
    <div class="avator"></div>
    <div class="text">
        减肥的空间就看到
        反馈的风景卡及阿奎
        反馈的风景卡及阿奎罗分可了解对方
        景卡及阿奎罗分可了解对方卡拉胶的风
        景卡及阿奎罗分可了解对方卡拉胶的风
        景卡及阿奎罗分可了解对方卡拉胶的风
        <div style="text-align: right; padding: 0 5px;">
            <button style="padding: 1px 7px; border: 1px solid">赞</button>
        </div>
    </div>
</div>
</body>

三列布局

  • 两侧两列固定宽度,中间列自适应宽度

第三列第1个例子

    <style type="text/css">
    * {
        padding: 0;
        margin: 0;
    }

   .clearfix:after {
        content: "";
        display: block;
        clear: both;
    }

    .wrapper {
        /* 2、采用定位的方式 */
        /*position: relative;*/

        /* 3、采用 flex 的方式 */
        /*display: flex;*/

        max-width: 800px;
        margin: 0 auto;
        background-color: pink;
    }

    .wrapper > .menu {
        /* 1、采用浮动的方式 */
        float: left;

        /*position: absolute;*/
        /*top: 0;*/
        /*left: 0;*/

        /*order: 1;*/

        width: 150px;
        height: 400px;
        background-color: lightgreen;
    }

    .wrapper > .aside {
        float: right;

        /*position: absolute;*/
        /*top: 0;*/
        /*right: 0;*/

        /*order: 3;*/

        width: 200px;
        height: 300px;
        background: teal;      
    }

    .wrapper > .main {
       margin-left: 160px;
       margin-right: 210px;

       /*flex-grow: 1;*/
       /*order: 2;*/
       /*margin: 0 10px;*/

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

推荐阅读更多精彩内容

  • 前言 温馨提示:本文较长,图片较多,本来是想写一篇 CSS 布局方式的,但是奈何 CSS 布局方式种类太多并且实现...
    sunshine小小倩阅读 3,118评论 0 59
  • 按照是否相应浏览器宽度变化划分: 固定宽度布局:body的width是一个固定值,当浏览器的窗口缩小时,底部出现滚...
    lingfighting阅读 568评论 0 0
  • CSS布局 布局是CSS中一个重要部分,本文总结了CSS布局中的常用技巧,包括常用的水平居中、垂直居中方法,以及单...
    web前端学习阅读 1,590评论 1 38
  • 目录 常用居中垂直居中水平居中垂直水平居中 单列布局 双列&三列布局 常用居中 垂直居中 单行文本垂直居中 图片垂...
    听城阅读 426评论 1 2
  • 不知道写啥,关心的有啥呢,最关心的 注意力无法集中这件事 在单位每天八个小时,很多时间自己想看手机里面的文章被打断...
    三不主义阅读 129评论 1 1