1. 三列布局
1. 圣杯布局实现
1.1 效果图
三列布局,两边固定,中间自适应
1.2 实现代码
<!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>圣杯布局</title>
<style>
html,
body {
height: 100%;
overflow: hidden;
}
.container {
height: 100%;
min-width: 200px;
padding: 0 200px;
background-color: gray;
}
.left,
.right {
width: 200px;
min-height: 200px;
background-color: lightblue;
}
.center {
width: 100%;
min-height: 400px;
background-color: lightsalmon;
}
.left,
.center,
.right {
float: left;
}
.left {
margin-left: -100%;
position: relative;
left: -200px;
}
.right {
margin-right: -200px;
}
</style>
</head>
<body>
<div class="container">
<div class="center">center</div>
<div class="left">left</div>
<div class="right">right</div>
</div>
</body>
</html>
1.3 实现分析
主要使用浮动实现
知识点:float
,magin-left
,margin-right
,padding
,position:relative
思路分析:
- 父容器
.container
设置左右内边距padding
。 - 父容器左内边距区域、
content
内容区域及右内边距区域分别对应三列布局的左边列、中间列和右边列 - 定义三个子元素分别表示左、中和右三列,将若是按上述代码结构定义,则将第二个子元素放到父容器的左内边距区域,将最后一个子元素放到右内边距区域,中间列元素定义宽度为
100%
自动占满父容器content
区域,使用上述代码实现方式时,一定要注意中间列要设置做小宽度min-width
为左边列子元素的宽度,否则浏览器窗口变小然后容器自适应宽度跟着变小时,左边列会因为所在父容器宽度不够而换行显示,而打乱布局 - 相对定位
position:relative
不脱离文档流,虽然使用相对定位的元素使用left
等属性显示到其它地方去,但它在文档流中的位置不变
关键点:一定要设置父容器的最小宽度且其值不能小于左边列的往左偏移量,具体偏移方式使用margin-left
和position:relative
实现。否则若父容器宽度不够,由于使用了浮动,左边列元素及其它后面的元素都会被挤到中间列元素下面,从而打乱布局
2. 双飞翼布局实现
2.1 效果图
三列布局,两边固定,中间自适应
2.2 实现代码
<!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>双飞翼布局</title>
<style>
html,
body{
height: 100%;
min-width: 400px;
overflow: scroll;
}
.container{
background-color: lightgray;
width: 100%;
height: 100%;
}
.container .center{
background-color: lightsalmon;
margin: 0 200px;
min-height: 400px;
}
.left,
.right{
background-color: lightskyblue;
width: 200px;
min-height: 200px;
}
.container,
.left,
.right{
float: left;
}
.left{
margin-left: -100%;
}
.right{
margin-right: -200px;
position: relative;
right: 200px;
}
</style>
</head>
<body>
<div class="container">
<div class="center">center</div>
</div>
<div class="left">left</div>
<div class="right">right</div>
</body>
</html>
2.3 实现分析
主要使用浮动实现
知识点:float
,magin-left
,margin-right
,margin
,position:relative
思路:和圣杯布局思路差不多,都主要使用了浮动,只是html
标签结构有些许区别,再有就是圣杯使用内边距padding
,双飞翼使用外边距margin
关键点:需要给外层父容器设置最小宽度min-width
为左右外边距的和(即左边列和右边列宽度和),否则左边列在宽度不够时依然会换行显示,打乱布局
3. 弹性布局方式实现
3.1 效果图
三列布局,两边固定,中间自适应
3.2 实现代码
<!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>弹性布局实现</title>
<style>
html,
body{
height: 100%;
overflow: scroll;
}
.container{
width: 100%;
height: 100%;
background-color: lightgray;
display: flex;
justify-content: space-between;
}
.left,
.right{
flex: 0 0 200px;
}
.left{
background-color: lightgreen;
}
.center{
background-color: lightsalmon;
width: 100%;
min-height: 400px;
}
.right{
background-color: lightseagreen;
}
</style>
</head>
<body>
<div class="container">
<div class="left">left</div>
<div class="center">center</div>
<div class="right">right</div>
</div>
</body>
</html>
3.3 实现分析
主要使用弹性布局方式实现
知识点:display:flex
,flex:0 0 200px
思路:
- 项目对齐方式
justify-content: space-between
- 左右两列使用
flex: 0 0 200px
来固定位置 - 中间列宽度
100%
关键点:需要给外层父容器设置最小宽度min-width
为左右外边距的和(即左边列和右边列宽度和),否则左边列在宽度不够时依然会换行显示,打乱布局
4. 定位方式实现
4.1 效果图
三列布局,两边固定,中间自适应
4.2 实现代码
<!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>弹性布局实现</title>
<style>
html,
body{
height: 100%;
overflow: scroll;
}
.container{
height: 100%;
background-color: lightslategray;
position: relative;
}
.left,
.right{
width: 200px;
min-height: 200px;
position: absolute;
}
.left{
background-color: lightsteelblue;
left: 0;
top: 0;
}
.center{
background-color: lightcyan;
margin: 0 200px;
min-height: 400px;
}
.right{
background-color: lightblue;
right: 0;
top: 0;
}
</style>
</head>
<body>
<div class="container">
<div class="left">left</div>
<div class="center">center</div>
<div class="right">right</div>
</div>
</body>
</html>
4.3 实现分析
主要使用绝对定位方式实现
知识点:position
思路:左右两列的区域为中间列的左右外边距margin: 0 200px
5. 网格布局方式实现
5.1 效果图
5.2 实现代码
<!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>网格布局实现</title>
<style>
html,
body{
height: 100%;
overflow: scroll;
}
.container{
background-color: lightcyan;
height: 100%;
display: grid;
grid-template-rows: 400px;
grid-template-columns: 200px auto 200px;
}
.left{
background-color: lightgreen;
}
.center{
background-color: lightsalmon;
}
.right{
background-color: lightskyblue;
}
</style>
</head>
<body>
<div class="container">
<div class="left">left</div>
<div class="center">center</div>
<div class="right">right</div>
</div>
</body>
</html>
5.3 实现分析
网格布局(Grid)是最强大的 CSS 布局方案。