一、如何实现
圣杯布局 和双飞翼布局基本上是一样的,都是两边定宽,中间自适应的三栏布局,其中,中间栏放到 HTML 结构最前面保证最先渲染提升性能。解决方案大体相同,都是三栏全部 float:left 浮动
区别:解决中间栏 div 的内容不被遮挡上,圣杯布局的中间栏添加相对定位,并配合 left 和 right 属性,效果上表现为三栏是单独分开的;双飞翼布局是在中间栏的 div 中嵌套一个 div,内容写在嵌套的 div 里,然后对嵌套的 div 设置 margin-left 和 margin-right,中间栏还是100%的宽度,只不过中间栏的内容通过 margin 的值显示在中间
二、作用和区别
**
不同在于解决”中间栏 div 内容不被遮挡“问题的思路不一样:
圣杯布局,为了中间 div 内容不被遮挡,将中间 div 设置了左右 padding-left 和 padding-right 后,将左右两个 div 用相对布局 position: relative 并分别配合 right 和 left 属性,以便左右两栏 div 移动后不遮挡中间 div。
双飞翼布局,为了中间 div 内容不被遮挡,直接在中间 div 内部创建子 div 用于放置内容,在该子 div 里用margin-left 和 margin-right 为左右两栏 div 留出位置。
多了1个 div,少用大致4个 css 属性(圣杯布局中间 divpadding-left 和 padding-right 这2个属性,加上左右两个 div 用相对布局 position: relative 及对应的 right 和 left 共4个属性,一共6个;而双飞翼布局子 div 里用margin-left 和 margin-right 共2个属性,6-2=4),个人感觉比圣杯布局思路更直接和简洁一点。
简单说起来就是”双飞翼布局比圣杯布局多创建了一个 div,但不用相对布局了“,而不是你题目中说的”去掉relative “就是双飞翼布局“。
1. 圣杯布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
body,html{
height: 100%;
}
footer,header{
height:15%;
background: gold;
}
section{
height: 70%;
padding:0 200px;
min-width: 500px;
}
.left,.right{
width:200px;
height:100%;
position: relative;
}
.left{
background: red;
float: left;
margin-left:-100%;
left: -200px;
}
.right{
background: blue;
float: left;
margin-left:-200px;
right: 200px;
}
.middle{
width:100%;
height: 100%;
background: purple;
float: left;
}
</style>
</head>
<body>
<header></header>
<section>
<div class="middle">middile</div>
<div class="left">left</div>
<div class="right">right</div>
</section>
<footer></footer>
</body>
</html>
2. 双飞翼布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
<style>
left, .main, .right {
float: left;
min-height: 130px;
text-align: center;
}
.left {
margin-left: -100%;
background: green;
width: 200px;
}
.right {
margin-left: -300px;
background-color: red;
width: 300px;
}
.main {
background-color: blue;
width: 100%;
}
.content{
margin: 0 300px 0 200px;
}
</style>
</style>
</head>
<body>
<div class="container">
<div class="main">
<div class="content">main</div>
</div>
<div class="left">left</div>
<div class="right">right</div>
</div>
</body>
</html>