一、如何实现
圣杯布局 和双飞翼布局基本上是一样的,都是两边定宽,中间自适应的三栏布局,其中,中间栏放到 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>
