如何实现两栏布局,右侧自适应?三栏布局中间自适应呢?
1. 两栏布局与三栏布局
两栏布局实现效果就是将页面分割成左右宽度不等的两列,宽度较小的列设置为固定宽度,剩余宽度由另一列撑满,这种布局适用于内容上具有明显主次关系的网页。
三栏布局按照左中右的顺序进行排列,通常中间列最宽,左右两列次之。大家最常见的就是 GitHub。
2. 两栏布局的实现
方案一:float + margin-left
<style>
.box {
overflow: hidden; /* 添加 BFC */
}
.left {
float: left;
width: 200px;
background-color: gray;
height: 400px;
}
.right {
margin-left: 210px;
background-color: lightgray;
height: 200px;
}
</style>
<div class="box">
<div class="left">左边</div>
<div class="right">右边</div>
</div>
方案二:flex 弹性布局(推荐)
<style>
.box {
display: flex;
}
.left {
width: 100px;
}
.right {
flex: 1;
}
</style>
<div class="box">
<div class="left">左边</div>
<div class="right">右边</div>
</div>
注意:flex 容器的一个默认属性值 align-items: stretch,会让列等高。为了让这两个盒子高度自动,需要设置 align-items: flex-start。
3. 三栏布局的实现
常见方案:圣杯布局、双飞翼布局、flex、grid。
圣杯布局
左右固定,中间自适应:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
html, body {
height: 100%;
overflow: hidden;
}
.container {
height: 100%;
padding: 0 200px;
}
.left, .right {
width: 200px;
min-height: 200px;
background-color: lightblue;
}
.center {
width: 100%;
min-height: 400px;
background-color: pink;
}
.center, .left, .right {
float: left;
}
.left {
margin-left: -100%;
position: relative;
left: -200px;
}
.right {
margin-right: -200px;
}
</style>
</head>
<body>
<div class="container clearfix">
<div class="center"></div>
<div class="left"></div>
<div class="right"></div>
</div>
</body>
</html>
双飞翼布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
html, body {
width: 100%;
overflow: hidden;
}
.container {
width: 100%;
}
.container, .left, .right {
float: left;
}
.left, .right {
width: 200px;
min-height: 200px;
background-color: lightblue;
}
.center {
margin: 0 200px;
min-height: 400px;
background-color: pink;
}
.left {
margin-left: -100%;
}
.right {
margin-left: -200px;
}
</style>
</head>
<body class="clearfix">
<div class="container">
<div class="center"></div>
</div>
<div class="left"></div>
<div class="right"></div>
</body>
</html>
clearfix(清除浮动公共类)
.clearfix::after, .clearfix::before {
content: "";
display: block;
clear: both;
}
补充:现代项目里两栏 / 三栏布局大多使用 flex / grid 一行解决:
- 两栏:
display: flex;+flex: 1;- 三栏:
display: grid; grid-template-columns: 200px 1fr 200px;。 圣杯/双飞翼布局主要是面试用来考察 float + margin 负值技巧,实际生产中已基本不再使用。



