Skip to content

单栏布局

常见单栏布局有以下情况:

  • header/content/footer等宽单栏布局
  • header/footer等宽,content略窄单栏布局

第一种情况:

<div class="header"> header </div>
<div class="content"> content </div>
<div class="footer"> footer </div>
<div class="header"> header </div>
<div class="content"> content </div>
<div class="footer"> footer </div>

css部分

.header{ 
    width:100%; // ①
    background:#c0c0c0; 
 }
.content{ 
    width:100%; // ①
    background:#f1f1f1;
  }
  .footer{
    width:100%; //①
    background:#000
  }
.header{ 
    width:100%; // ①
    background:#c0c0c0; 
 }
.content{ 
    width:100%; // ①
    background:#f1f1f1;
  }
  .footer{
    width:100%; //①
    background:#000
  }

上述设置的width自适应充满屏幕。 如果设置width为固定值或者设置最大宽度(max-width),当屏幕小于当前设置固定宽度(width)时,会出现滚动条; 而设置的最大宽度(max-width),则不会出现滚动条。

如果实现居中,解决办法是添加居中属性(margin: 0 auto)即可。

.header{
  max-width:800px;
  background:#c0c0c0;
  margin: 0 auto; // ①
}
// content, footer添加margin: 0 auto;属性
.header{
  max-width:800px;
  background:#c0c0c0;
  margin: 0 auto; // ①
}
// content, footer添加margin: 0 auto;属性

第二种情况:

<div class="header"> header </div>
<div class="content"> content </div>
<div class="footer"> footer </div>
<div class="header"> header </div>
<div class="content"> content </div>
<div class="footer"> footer </div>

css部分

.header{
  max-width: 800px;
  background: #c0c0c0;
  margin: 0 auto; // ①
}
.content{
  max-width: 700px;
  background:#f1f1f1;
  margin: 0 auto; // ①
}
.footer{
  max-width: 800px;
  background:#000;
  margin: 0 auto; // ①
}
.header{
  max-width: 800px;
  background: #c0c0c0;
  margin: 0 auto; // ①
}
.content{
  max-width: 700px;
  background:#f1f1f1;
  margin: 0 auto; // ①
}
.footer{
  max-width: 800px;
  background:#000;
  margin: 0 auto; // ①
}

注意:

如果header/footer内容宽度不设置,块级元素会充满整个屏幕; 如果header/content/footer内容区域中有设置同一个宽度,通过margin:0 auto居中。

<div class="header">
  <div class="container"> container </div>
</div>
<div class="content"> content </div>
<div class="footer"> footer </div>
<div class="header">
  <div class="container"> container </div>
</div>
<div class="content"> content </div>
<div class="footer"> footer </div>

css部分

.header{
  max-width: 800px;
  background:#c0c0c0;
  margin: 0 auto; // ①
}
.container{
  max-width:600px; //宽度
  background:#fff;
  margin: 0 auto; // ①
}
.content{
  max-width:600px;  // 宽度
  background:#f1f1f1;
  margin: 0 auto;  // ①
}
.footer{
  max-width:800px;
  background:#000; 
  margin: 0 auto; // ①
}
.header{
  max-width: 800px;
  background:#c0c0c0;
  margin: 0 auto; // ①
}
.container{
  max-width:600px; //宽度
  background:#fff;
  margin: 0 auto; // ①
}
.content{
  max-width:600px;  // 宽度
  background:#f1f1f1;
  margin: 0 auto;  // ①
}
.footer{
  max-width:800px;
  background:#000; 
  margin: 0 auto; // ①
}

两栏布局

指一边栏固定宽度,另一边栏充满剩余宽度。 常见两栏布局有以下情况:

  • 左栏固定宽度,右栏自适应
  • 左栏自适应,右栏固定宽度

第一种情况

<div class="left"> left </div>
<div class="right"> right </div>
<div class="left"> left </div>
<div class="right"> right </div>
.left{
  width:200px; //①
  float:left; // ①
  background:red;
}
.right{
  background:blue;
  margin-left:200px; // ②
}
.left{
  width:200px; //①
  float:left; // ①
  background:red;
}
.right{
  background:blue;
  margin-left:200px; // ②
}

使用flex

<div class="left"> left </div>
<div class="right"> right </div>
<div class="left"> left </div>
<div class="right"> right </div>
.body{
  display:flex; // ①
}
.left{
  width:200px; // ②
  background:red;
}
.right{
  flex:1; // ③
  background:blue;
}
.body{
  display:flex; // ①
}
.left{
  width:200px; // ②
  background:red;
}
.right{
  flex:1; // ③
  background:blue;
}

第二种情况:(注意DOM布局顺序)

<div class="right"> right </div>
<div class="left"> left </div>
<div class="right"> right </div>
<div class="left"> left </div>
.right{
  width:200px; // ①
  background:red;
  position:absolute; // ①
  top:0; // ①
  right:0; // ①
}
.left{
  background:blue;
  margin-right:200px; // ② 
}
.right{
  width:200px; // ①
  background:red;
  position:absolute; // ①
  top:0; // ①
  right:0; // ①
}
.left{
  background:blue;
  margin-right:200px; // ② 
}

使用margin-right属性留出重叠区域。

使用flex

<div class="left"> left </div>
<div class="right"> right </div>
<div class="left"> left </div>
<div class="right"> right </div>
.body{
  display: flex; // ①
}
.left{
  flex:1; // ②
  background:red;
}
.right{
  width:200px; // ③
  background:blue;
}
.body{
  display: flex; // ①
}
.left{
  flex:1; // ②
  background:red;
}
.right{
  width:200px; // ③
  background:blue;
}

如果是自适应两栏布局使用float + overflow

<div class="content">
  <div class="left"> left </div>
  <div class="right"> right </div>
</div>
<div class="content">
  <div class="left"> left </div>
  <div class="right"> right </div>
</div>
.content{
  overflow: hidden;
  zoom: 1;
}
.left{
  float: left;
  background:red;
}
.right{
  overflow: hidden;
  zoom: 1;
  background:blue;
}
.content{
  overflow: hidden;
  zoom: 1;
}
.left{
  float: left;
  background:red;
}
.right{
  overflow: hidden;
  zoom: 1;
  background:blue;
}

这种方式通过overflow触发BFC,这时zoom:1兼容IE6浏览器;如果侧边栏在右侧注意渲染顺序。

三栏布局

指两边栏固定宽度,中间栏自适应布局。

第一种圣杯 实现原理:

  • 三栏都设置左浮动,设置中间栏宽度为100%;

  • 这时左右两栏会掉下来,设置margin-left为负值,添加相对定位并设置left属性与right属性,与中间栏同一行;

  • 设置padding留出间距。

<div class="middle"> middle </div>
<div class="left"> left </div>
<div class="right"> right </div>
<div class="middle"> middle </div>
<div class="left"> left </div>
<div class="right"> right </div>
.middle{
  float:left; // ①
  width:100%; // ① 充满屏幕
  background:red;
}
.left{
  width:200px; // ② 设置一个宽度
  margin-left:-100%; // ② 添加float, 与middle同一行
  float:left; // ②
  position: relative; // ② 添加相对定位移并到左边
  left: -200px; // ②
  background:blue;
}
.right{
  width: 200px; // ③
  margin-left: -200px; // ③ 添加float, 与minddle同行
  float: left; // ③
  position: relative; // ③ 添加相对定位 并移到右边
  right:-200px; // ③
  background:yellow; 
}
.body{
  padding: 0 200px; // ④ 左右两边留出间隙
}
.middle{
  float:left; // ①
  width:100%; // ① 充满屏幕
  background:red;
}
.left{
  width:200px; // ② 设置一个宽度
  margin-left:-100%; // ② 添加float, 与middle同一行
  float:left; // ②
  position: relative; // ② 添加相对定位移并到左边
  left: -200px; // ②
  background:blue;
}
.right{
  width: 200px; // ③
  margin-left: -200px; // ③ 添加float, 与minddle同行
  float: left; // ③
  position: relative; // ③ 添加相对定位 并移到右边
  right:-200px; // ③
  background:yellow; 
}
.body{
  padding: 0 200px; // ④ 左右两边留出间隙
}

第二种双飞翼 实现原理:

  • 三栏左浮动,设置中间栏宽度为100%;

  • 这时左右两栏会掉下来,设置margin-left为负值并设置left属性与right属性,与中间栏同一行;

  • 在中间栏增加一个div,设置margin留出左右间距。

<div class="middle">
  <div class="container"> container </div>
</div>
<div class="left"> left </div>
<div class="right"> right </div>
<div class="middle">
  <div class="container"> container </div>
</div>
<div class="left"> left </div>
<div class="right"> right </div>
.middle{
  float:left; // ①
  width: 100%; // ①
  background: red;
}
.left{
  width: 200px; // ②
  margin-left: -100%; // ②
  background:blue;
}
.right {
  width:200px; // ③
  margin-left: -200px; // ③
  background: yellow;
}
.container{
  margin: 0 200px; // ④
}
.middle{
  float:left; // ①
  width: 100%; // ①
  background: red;
}
.left{
  width: 200px; // ②
  margin-left: -100%; // ②
  background:blue;
}
.right {
  width:200px; // ③
  margin-left: -200px; // ③
  background: yellow;
}
.container{
  margin: 0 200px; // ④
}

圣杯布局与双飞翼布局对比:

  • 圣杯布局是在父容器的左/右内边距配合两个从列相对定位。

  • 双飞翼布局是把主列嵌套在一个父级块中配合主列左/右外边距。

第三种flex

<div class="left"> left </div>
<div class="middle"> middle </div>
<div class="right"> right </div>
<div class="left"> left </div>
<div class="middle"> middle </div>
<div class="right"> right </div>
body{
  display: flex; // ①
}
.left {
  width:200px;
  background:red;
}
.middle {
  flex:1; // ②
  background:blue;
}
.right{
  width:200px;
  background:yellow;
}
body{
  display: flex; // ①
}
.left {
  width:200px;
  background:red;
}
.middle {
  flex:1; // ②
  background:blue;
}
.right{
  width:200px;
  background:yellow;
}

补充flex:1

flex是flex-grow,flex-shrink, flex-basis的缩写;默认值:0 1 auto。后两者属性可选。

flex-grow:属性定义了该空间的放大比例,默认值0;表示如果存在剩余空间,也不放大。

flex-skrink:属性定义了该空间的缩小比例,默认值1;表示如果空间不足,该空间将缩小。

flex-basis:属性定义在分配多余空间之前,占据的主轴空间。浏览器根据这个属性,计算主轴是否有剩余空间,默认值auto,表示该空间本来的大小。

flex:属性由两个值:auto(1 1 auto) 和 none(0 0 auto)。