三栏布局(双飞翼、圣杯)

圣杯布局和双飞翼布局是前端工程师需要日常掌握的重要布局方式。两者的功能相同,都是为了实现一个两侧宽度固定,中间宽度自适应的三栏布局

圣杯布局与双飞翼布局

圣杯布局来源于文章In Search of the Holy Grail,而双飞翼布局来源于淘宝UED。虽然两者的实现方法略有差异,不过都遵循了以下要点:

  • 两侧宽度固定,中间宽度自适应
  • 中间部分在DOM结构上优先,以便先行渲染
  • 允许三列中的任意一列成为最高列
  • 只需要使用一个额外的<div>标签

圣杯布局

1. DOM结构

<body>
  <div id="header"></div>
  <div id="container">
    <div id="center" class="column"></div>
    <div id="left" class="column"></div>
    <div id="right" class="column"></div>
  </div>
  <div id="footer"></div>
</body>

2. CSS代码

* {
    margin: 0;
    padding: 0;
 }
body {
    min-width: 750px;
    text-align: center;
 }
#container {
    padding-left: 200px;
    padding-right: 150px;
 }
#container .column {
    float: left;
    min-height: 150px;
 }
#center {
    width: 100%;
    background: green;
 }
#left {
    width: 200px;
    margin-left: -100%;
    position: relative;
    right: 200px;
    background: orange;
 }
#right {
    width: 150px;
    margin-right: -150px;
    background: deepskyblue;
 }
#header{
    background: #dcdcdc;
    padding: 20px;
 }
#footer {
    clear: both;
    background: #dcdcdc;
 }

Tips:在#center中,包含了一条声明width: 100%,这是中间栏能够做到自适应的关键。可能会有朋友认为不需要设置这条声明,因为觉得center在不设置宽度的情况下会默认将宽度设置为父元素(container)的100%宽度。但需要注意到,center是浮动元素,由于浮动具有包裹性,在不显式设置宽度的情况下会自动“收缩”到内容的尺寸大小。如果去掉width: 100%,则当中间栏不包含或者包含较少内容时,整个布局会“崩掉”,而达不到这样的效果

中间栏仅包含较少内容

双飞翼布局

1. DOM结构

<body>
  <div id="header"></div>
  <div id="container" class="column">
    <div id="center"></div>
  </div>
  <div id="left" class="column"></div>
  <div id="right" class="column"></div>
  <div id="footer"></div>
<body>

双飞翼布局的DOM结构与圣杯布局的区别是用container仅包裹住center,另外将.column类从center移至container上。

2. CSS代码

* {
  margin: 0;
  padding: 0;
 }
body {
  min-width: 550px;
 }
#container {
  width: 100%;
 }
 .column {
  float: left;
  min-height: 150px;
 }
#center {
  margin-left: 200px;
  margin-right: 150px;
  background: red;
 }
#left {
  width: 200px;
  margin-left: -100%;
  background: yellow;
 }
#right {
  width: 150px;
  margin-left: -150px;
  background: blue;
 }
#header {
  background: #dcdcdc;
  padding: 20px;
  }
#footer {
  clear: both;
  padding: 40px;
  background: #dcdcdc;
 }

flex布局实现

1. DOM结构

<body>
  <div id="header"></div>
  <div id="container">
    <div id="center"></div>
    <div id="left"></div>
    <div id="right"></div>
  </div>
  <div id="footer"></div>
</body>

与圣杯布局的DOM结构一样,但实现方法更简单

2. CSS代码

*{
  margin: 0;
  padding: 0;
 }
body{
  min-width: 550px;
 }
#container {
  display: flex;
 }
#container>div{
  min-height: 150px;
 }
#center {
  flex: 1;
  background: red;
  height: 100%;
 }
/*order属性:定义对象的排列顺序,越小越靠前,默认为0*/
#left {
  flex: 0 0 200px;
  order: -1;
  background: green;
  height: 100%;
 }
#right {
  flex: 0 0 150px;
  background: blue;
  height: 100%;
 }

原文作者:感谢!!! @放羊的小桃桃

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。