BFC两栏布局
- 页面实现两栏布局,左边区域设置为左浮动,右边区域不设置浮动效果
- 当右边区域高度超过左边区域高度时,会出现右边区域来到左边区域的下方
- 原因是右边区域不是BFC(块格式化上下文),把右边区域设置为BFC之后,即使右边区域高度高于左边区域,右边区域也不会到左边去
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>BFC两栏布局</title>
<style>
.left {
width: 300px;
height: 400px;
float: left;
background-color: red;
}
.main {
height: 600px;
background: yellow;
overflow: auto;
}
</style>
</head>
<body>
<div class="left"></div>
<div class="main"></div>
</body>
</html>
三栏表格布局
- 对父元素设置宽度为100%,设置display: table。子元素有三个元素,每个元素都设置display: tabel-cell
- 设置左右两个元素固定的宽度,则中间的会自动适应宽度,自动的缩小或者扩大,始终保持与其他两个元素相邻
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>三栏表格布局</title>
<style>
* {
padding: 0;
margin: 0;
}
.wrapper {
display: table;
width: 100%;
}
.left, .main, .right {
display: table-cell;
}
.left {
width: 250px;
background-color: aquamarine;
}
.right {
width: 300px;
background-color: bisque;
}
.main {
background-color: orange;
}
</style>
</head>
<body>
<div class="wrapper">
<aside class="left">
<p>1</p>
<p>2</p>
<p>3</p>
</aside>
<aside class="main"></aside>
<aside class="right"></aside>
</div>
</body>
</html>
三栏浮动布局
- 对左右两个元素分别设置左浮动与右浮动,中间元素宽度设置为100%,则中间的元素会自动适应宽度置于中间
- 但是,中间元素宽度高于左右两边的浮动元素,则中间元素的内容会向两边溢出
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>三栏浮动布局</title>
<style>
* {
padding: 0;
margin: 0;
}
.left, .main, .right {
min-height: 200px;
}
.left {
width: 250px;
float: left;
background-color: aquamarine;
}
.right {
width: 300px;
float: right;
background-color: bisque;
}
.main {
width: 100%;
background-color: orange;
}
</style>
</head>
<body>
<aside class="left"></aside>
<aside class="right"></aside>
<aside class="main"></aside>
</body>
</html>
三栏绝对定位布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>三栏绝对定位布局</title>
<style>
* {
padding: 0;
margin: 0;
}
aside {
min-height: 100px;
position: absolute;
}
aside.left {
width: 250px;
left: 0;
background-color: aquamarine;
}
aside.right {
width: 300px;
right: 0;
background-color: bisque;
}
.main {
min-width: 50px;
position: absolute;
left: 250px;
right: 300px;
background-color: orange;
}
</style>
</head>
<body>
<aside class="left"></aside>
<aside class="right"></aside>
<main class="main">
<h2>标题111</h2>
<h2>标题111</h2>
<h2>标题111</h2>
<h2>标题111</h2>
</main>
</body>
</html>
三栏网格布局
- 父元素使用grid布局,并且对列的宽度进行设置。页面共三栏,左右两栏固定宽度,中间的宽度根据两端的宽度自动调整
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>三栏网格布局</title>
<style>
* {
padding: 0;
margin: 0;
}
.wrapper {
width: 100%;
display: grid;
grid-template-columns: 300px 1fr 300px;
}
.left {
background-color: orange;
}
.right {
background-color: aquamarine;
}
.main {
background-color: antiquewhite;
}
</style>
</head>
<body>
<div class="wrapper">
<aside class="left"></aside>
<main class="main">
<h1>表格布局</h1>
<h1>表格布局</h1>
<h1>表格布局</h1>
<h1>表格布局</h1>
</main>
<aside class="right"></aside>
</div>
</body>
</html>
三栏flex布局
- 父元素使用flex布局,对于三个子元素来说,左右两端的子元素固定宽度,中间的元素使用flex: 1属性,来进行弹性布局,根据左右宽度调整自身宽度
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>三栏flex布局</title>
<style>
* {
padding: 0;
margin: 0;
}
.wrapper {
width: 100%;
display: flex;
}
.left, .main, .right {
min-height: 250px;
}
.left {
background-color: orange;
width: 300px;
}
.right {
background-color: aquamarine;
width: 300px;
}
.main {
background-color: antiquewhite;
flex: 1;
}
</style>
</head>
<body>
<div class="wrapper">
<aside class="left"></aside>
<main class="main">
<h1>表格布局</h1>
<h1>表格布局</h1>
<h1>表格布局</h1>
<h1>表格布局</h1>
</main>
<aside class="right"></aside>
</div>
</body>
</html>
圣杯布局
- 圣杯布局首先有三个div元素,分别是main,left,right,这三个元素依次放在wrapper中
- 首先对三个子元素设置相对定位于左浮动,对left与right设置宽度,main宽度为100%,这样的话main元素会占满整个wrapper元素,而left与right会被挤到下一行
- 为了让left与right能与main显示在同一行,对wrapper设置左右内边距,分别为left与right的宽度
- 但是设置内边距之后,wrapper整个宽度变小,left与right仍然在下一行。对left进行设置,设置left的左外边距为100%,这样left移动到与main的起点对齐,但是这样盖住了main的部分内容,于是需要将left向左移动,移动距离为之前设置的左内边距,使用left属性向左移动相对应的距离
- right也是同样的道理,设置左外边距为right本身的宽度,再向右移动相应的距离,使用属性right
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>圣杯布局</title>
<style>
.left, .main, .right {
min-height: 300px;
float: left;
position: relative;
}
.left {
width: 200px;
background-color: antiquewhite;
margin-left: -100%;
left: -200px;
}
.main {
background-color: aquamarine;
width: 100%;
}
.right {
width: 300px;
background-color: aqua;
margin-left: -300px;
right: -300px;
}
.wrapper {
padding-left: 200px;
padding-right: 300px;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="main">main</div>
<div class="left">left</div>
<div class="right">right</div>
</div>
</body>
</html>
双飞翼布局
- 双飞翼布局与圣杯布局很相似,都是三个元素main,left,right。不同的是不使用相对布局,并且main元素中多了一个子元素main_inner元素用来存放中心的内容
- 其余不变,只需要增加对main_inner添加左右外边距,分别为left与right的宽度
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>双飞翼布局</title>
<style>
.left, .main, .right {
min-height: 300px;
float: left;
}
.left {
width: 200px;
background-color: antiquewhite;
margin-left: -100%;
}
.main {
background-color: aquamarine;
width: 100%;
}
.right {
width: 300px;
background-color: aqua;
margin-left: -300px;
}
.main_inner {
margin-left: 200px;
margin-right: 300px;
}
</style>
</head>
<body>
<div class="main">
<div class="main_inner">main</div>
</div>
<div class="left">left</div>
<div class="right">right</div>
</body>
</html>