六维教程

CSS 传统布局实战

前两篇讲了文档流、浮动和定位,这篇把它们组合起来,做几个完整的页面布局,看看传统布局的路数。

两栏布局

两栏布局是经典中的经典,左侧固定宽度,右侧占满剩余空间。思路是左侧浮动,右侧用 margin-left 把左侧的宽度让出来。

<style>
  .layout {
    overflow: hidden;    /* 顺手清浮动 */
  }
  .side {
    float: left;
    width: 220px;
    background: #ecf0f1;
  }
  .main {
    margin-left: 220px;    /* 让出左侧的 220px */
    background: #fff;
  }
</style>
<div class="layout">
  <aside class="side">侧边栏,固定 220px</aside>
  <main class="main">主体内容,自适应剩余宽度</main>
</div>

有个细节要注意,main 的 margin-left 必须和侧栏宽度保持一致,改了一边就要同步改另一边。

三栏布局

三栏布局是两边固定、中间自适应。浮动元素只能向左或向右贴,中间的自适应柱子放不下,只能让它最后出场,左右两栏先落位,中间再靠 margin 把两边空间让出来。这是双飞翼思路的简化版。

<style>
  .layout {
    overflow: hidden;
  }
  .left {
    float: left;
    width: 200px;
    background: #f39c12;
  }
  .right {
    float: right;
    width: 200px;
    background: #3498db;
  }
  .center {
    margin: 0 200px;    /* 左右各让出 200px */
    background: #fff;
  }
</style>
<div class="layout">
  <aside class="left">左栏</aside>
  <aside class="right">右栏</aside>
  <main class="center">中间自适应</main>
</div>

注意 HTML 里 center 必须写在最后,写在前面的话,左右两个浮动元素会分别挤到它下面去。center 的 margin 值也要跟着左右栏宽度走。

完整页面结构

把前两篇的知识都串起来,搭一个完整页面,页头、导航、主体加侧边栏、页脚。

<style>
  body {
    margin: 0;
    font-family: sans-serif;
  }
  .header {
    background: #2c3e50;
    color: #fff;
    padding: 20px;
    text-align: center;
  }
  .nav {
    background: #34495e;
    text-align: center;
  }
  .nav a {
    display: inline-block;
    color: #fff;
    padding: 10px 24px;
    text-decoration: none;
  }
  .wrap {
    overflow: hidden;    /* 清除浮动 */
  }
  .aside {
    float: left;
    width: 220px;
    padding: 20px;
    background: #ecf0f1;
  }
  .content {
    margin-left: 220px;
    padding: 20px;
  }
  .footer {
    background: #2c3e50;
    color: #fff;
    padding: 10px;
    text-align: center;
  }
</style>

<div class="header">我的博客</div>
<div class="nav">
  <a href="#">首页</a>
  <a href="#">教程</a>
  <a href="#">归档</a>
</div>
<div class="wrap">
  <aside class="aside">侧边栏,放目录和标签</aside>
  <main class="content">主体内容区,文章正文都放这里</main>
</div>
<div class="footer">页脚</div>

页面主干就搭完了,把侧栏的 width 换成百分比,还能做出响应式效果,这是后话。

浮动布局的局限性

练完上面三个例子,float 布局的毛病也攒了一堆。一是高度塌陷,每层容器都要想办法清浮动,二是顺序受限,中间自适应的内容只能放最后写,HTML 顺序和视觉顺序对不上,三是垂直居中很难,要绕到绝对定位加负 margin 这种怪招,四是改版成本高,改一处宽度要连带改好几处 margin。正因为这些痛点,Flexbox 和 Grid 才应运而生。

小结

传统布局的核心思路就两条,浮动排横排,margin 让空间。这套老手艺现在依然能见到,尤其是兼容老项目的场景。下一篇开始讲 Flexbox,学完你会觉得豁然开朗,浮动那些别扭的地方它基本都解决了。

上一篇
CSS 表单样式
下一篇
CSS Flexbox 初识