两栏布局

float + margin

实现步骤如下:

  1. 使用float左浮左边栏
  2. 右边栏使用margin-left,撑出内容块(避免与左边栏重叠)
  3. 触发父元素BFC,防止下方元素受float影响上浮
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div class="box">
<div class="left"></div>
<div class="right"></div>
</div>

<style>
.box{
overflow: hidden;
}
.left{
float: left;
width: 200px;
}
.right{
margin-left: 210px;
}
</style>

float + calc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<div class="box">
<div class="left"></div>
<div class="right"></div>
</div>

<style>
.box{
overflow: hidden;
}
.left{
float: left;
width: 200px;
}
.right{
float: right;
width: calc(100% - 200px)
}
</style>

flex

flex布局下,子元素默认是自动填满高度。
如果需要高度自动,则需要给.box设置align-items: flex-start

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div class="box">
<div class="left"></div>
<div class="right"></div>
</div>

<style>
.box{
display:flex;
}
.left{
width: 200px;
}
.right{
flex: 1; // 平铺满剩余的空间

}
</style>

三栏布局

圣杯布局

使用float和负margin,实现三栏布局。(外国人发明)

实现步骤如下:

  1. 设置三栏的宽度
  2. 全部左浮动,由于content的宽度是100%,所以left和right会被挤到下一行
  3. 给left和right设置负margin值,将left和right拉回,覆盖在content上
  4. 给三栏的父元素增加padding值
  5. 将left和right,定位到父元素的空白处(padding)
  6. 触发三栏父元素的BFC,自适应内部浮动元素的高度
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<div class="box">
<div class="content"></div>
<div class="left"></div>
<div class="right"></div>
</div>

<style>
.box{
padding: 0 300px 0 200px;
overflow: hidden;
}
.content, .left, .right{
float: left;
}
.content{
width: 100%;
}
.left{
width: 200px;
margin-left: -100%;
position: relative;
left: -200px;
}
.right{
width: 300px;
margin-left: -300px;
position: relative;
right: 300px;
}

</style>

双飞翼布局

双飞翼布局,是在圣杯布局上,做了父元素padding留白的优化。

  1. 给 content 加子元素
1
2
3
<div class="content">
<div class="inner"></div>
</div>
  1. 给inner设置margin值,将内容区挤到中间进行显示
1
2
3
4
5
6
<style>
.inner{
margin-left: 200px;
margin-right: 300px;
}
</style>

flex

注意点

使用flex的order属性,将元素进行优先排列,达到SEO和展示的平衡。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<div class="box">
<div class="content"></div>
<div class="left"></div>
<div class="right"></div>
</div>

<style>
.box{
display: flex;
}
.left{
width: 200px;
order: -1; /* 排序在最前 */
}
.right{
width: 300px;
}
.content{
flex: 1;
}
</style>

grid

注意点

使用grid-area属性,将元素进行优先排列,达到SEO和展示的平衡。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<div class="box">
<div class="content"></div>
<div class="left"></div>
<div class="right"></div>
</div>

<style>
.box{
display: grid;
grid-template-areas: "left content right";
grid-template-columns: 200px auto 300px;
}
.left{
grid-area: "left";
}
.right{
grid-area: "right";
}
.content{
grid-area: "content";
}
</style>

参考