圣杯布局、双飞翼布局、弹性布局实现的两边定宽,中间不定宽
圣杯布局
<body>
<header>头部</header>
<div class="box clearfix">
<div class="center">中间</div>
<div class="left">左边</div>
<div class="right">右边</div>
</div>
<footer>底部</footer>
</body>
中间部分在HTML结构上优先。
第一步
三个盒子设置浮动,清除浮动效果
.left,
.right,
.center {
float: left;
}
第二步
左右盒子设置固定宽度,中间盒子设置为100%
.left,
.right {
width: 200px;
height: 200px;
background-color: orange;
}
.center {
height: 200px;
width: 100%;
background-color: skyblue;
}
第三步
左盒子设置margin-left:-100%,右盒子设置margin-left:-自身宽度;
.left {
position: relative;
margin-left: -100%;
}
.right {
position: relative;
margin-left: -200px;
}
为了解决左右盒子压盖中间盒子,应该让左盒子和右盒子再向外移动。但是因为中间盒子设置了100%,左右盒子再向外移动会出现滚动条。
第四步
在三个盒子的外面包裹一个大的盒子。设置大盒子的左右padding为左右盒子的宽度。
.box {
padding: 0 200px;
text-align: center;
min-width: 600px;
/* 为了避免采用默认内容盒尺寸进行转换计算 */
box-sizing: border-box;
}
第五步
左盒子通过相对定位向左移动自身宽度,右盒子通过相对定位向右移动自身宽度。
.left {
position: relative;
left: -200px;
margin-left: -100%;
}
.right {
position: relative;
right: -200px;
margin-left: -200px;
}
整体代码
<!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>
.clearfix::after {
content: '';
display: block;
clear: both;
}
.box {
padding: 0 200px;
text-align: center;
min-width: 600px;
/* 为了避免采用默认内容盒尺寸进行转换计算 */
box-sizing: border-box;
}
header,
footer {
height: 200px;
background: cadetblue;
}
.left,
.right {
width: 200px;
height: 200px;
background-color: orange;
}
.left,
.right,
.center {
float: left;
}
.center {
height: 200px;
width: 100%;
background-color: skyblue;
}
.left {
position: relative;
left: -200px;
margin-left: -100%;
}
.right {
position: relative;
right: -200px;
margin-left: -200px;
}
</style>
</head>
<body>
<header>头部</header>
<div class="box clearfix">
<div class="center">中间</div>
<div class="left">左边</div>
<div class="right">右边</div>
</div>
<footer>底部</footer>
</body>
</html>
双飞翼布局
<body>
<header>我是头部信息</header>
<div class="center">
<div class="box">
中
</div>
</div>
<div class="left">左</div>
<div class="right">右</div>
<footer style="clear: left;">我是底部信息</footer>
</body>
第一步
三个盒子设置浮动,并清除浮动效果
.center,
.left,
.right {
float: left;
}
这里的清除浮动是采用的方式
<footer style="clear: left;">我是底部信息</footer>
还可以采用伪元素
例子
.clearfix::after {
content: "";
display: block;
height: 0;
clear: both;
}
第二步
左右盒子设置固定宽度,中间盒子设置为100%
.left,
.right {
width: 200px;
}
.center {
width: 100%;
}
第三步
左盒子设置margin-left:-100%,右盒子设置margin-left:-自身宽度;
.left {
background-color: hotpink;
margin-left: -100%;
}
.right {
background-color: brown;
margin-left: -200px;
}
为了解决左右盒子压盖中间盒子,应该让左盒子和右盒子再向外移动。但是因为中间盒子设置了100%,左右盒子再向外移动会出现滚动条。
以上步骤与圣杯布局一样,效果一样,这里不再展示效果,可以参考上面效果
第四步
在中间盒子中再嵌套一个小盒子,将内容放入小盒子中,里面小盒子的margin去撑开。
.box {
margin: 0 200px;
}
整体代码
<!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>
* {
margin: 0;
padding: 0;
}
body {
font-size: 40px;
text-align: left;
line-height: 200px;
}
header,
footer {
height: 200px;
background-color: cadetblue;
}
.center,
.left,
.right {
float: left;
}
.left,
.right {
width: 200px;
}
.center {
width: 100%;
}
.center {
background-color: mediumslateblue;
}
.left {
background-color: hotpink;
margin-left: -100%;
}
.right {
background-color: brown;
margin-left: -200px;
}
.box {
margin: 0 200px;
}
.clearfix::after {
display: block;
content: "";
clear: both;
}
</style>
</head>
<body>
<header>我是头部信息</header>
<div class="center">
<div class="box">
中
</div>
</div>
<div class="left">左</div>
<div class="right">右</div>
<footer style="clear: left;">我是底部信息</footer>
</body>
</html>
圣杯布局与双飞翼布局的总结
- 圣杯布局是在外层嵌套一个大盒子,利用大盒子的padding+左右盒子的相对定位去实现。
- 双飞翼是在中间层嵌套一个小盒子,利用小盒子的margin去实现。
弹性盒子的实现方式
<body>
<header>我是头部信息</header>
<div class="box">
<div class="center">中</div>
<div class="left">左</div>
<div class="right">右</div>
</div>
<footer style="clear: left;">我是底部信息</footer>
</body>
第一步
父盒子设为弹性盒
.box {
display: flex;
}
第二步
左右盒子固定宽度
.left,
.right {
width: 200px;
background-color: brown;
}
第三步
中间盒子设置 flex-grow:1
.center {
flex-grow: 1;
background-color: lightgreen;
}
第四步
设置左盒子的order为-1;
order是主要用于弹性盒子中的排序,order越小盒子越靠前
.left {
order: -1;
}
整体代码
<!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>
* {
margin: 0;
padding: 0;
}
body {
font-size: 40px;
text-align: center;
line-height: 200px;
}
header,
footer {
height: 200px;
background-color: cadetblue;
}
.box {
display: flex;
}
.left,
.right {
width: 200px;
background-color: brown;
}
.left {
order: -1;
}
.center {
flex-grow: 1;
background-color: lightgreen;
}
</style>
</head>
<body>
<header>我是头部信息</header>
<div class="box">
<div class="center">中</div>
<div class="left">左</div>
<div class="right">右</div>
</div>
<footer style="clear: left;">我是底部信息</footer>
</body>
</html>