圣杯布局
1.设置基本样式
![](https://i-blog.csdnimg.cn/blog_migrate/3a7c129886cd6f7f091228639d83cf41.png)
为了高度保持一致给left main right都加上min-height:130px。
![](https://i-blog.csdnimg.cn/blog_migrate/b5e6a222717cdff54d7df7feb8f24ac4.png)
2.圣杯布局是一种相对布局,首先设置父元素container的位置:
![](https://i-blog.csdnimg.cn/blog_migrate/9dd53b6e12b752b6217d276375ef6706.png)
实现效果是左右分别空出200px和300px区域,效果如图:
![](https://i-blog.csdnimg.cn/blog_migrate/fe30b1002760da1b5d6501c65d6b502b.png)
3.将主体部分的三个子元素都设置左浮动
![](https://i-blog.csdnimg.cn/blog_migrate/e505e814474ea1673de6f140e6476b79.png)
出现了如下情况,怎么办,别着急慢慢来:
![](https://i-blog.csdnimg.cn/blog_migrate/345bf66aec614ad83ff68a793006ae1c.png)
4.设置main宽度为width:100%,让其单独占满一行
![](https://i-blog.csdnimg.cn/blog_migrate/87c70a55ca629264265adf4eaa879a12.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7c53ea4002f7c70bf0ed5a08b38e60d9.png)
5.设置left和right 负的外边距
我们的目标是让left、main、right依次并排,但是上图中left和right都是位于下一行,这里的技巧就是使用负的margin-left:
负的margin-left会让元素沿文档流向左移动,如果负的数值比较大就会一直移动到上一行。关于负的margin的应用也是博大精深,这里肯定是不能详细介绍了。
设置left部分的margin-left为-100%,就会使left向左移动一整个行的宽度,由于left左边是父元素的边框,所以left继续跳到上一行左移,一直移动到上一行的开头,并覆盖了main部分(仔细观察下图,你会发现main里面的字“main”不见了,因为被left遮住了),left上移过后,right就会处于上一行的开头位置,这时再设置right部分margin-left为负的宽度,right就会左移到上一行的末尾。
![](https://i-blog.csdnimg.cn/blog_migrate/f915bbf9a840abfa6dce6bfa473d6e9e.png)
6.接下来只要把left和right分别移动到这两个留白就可以了。可以使用相对定位移动 left和right部分。
![](https://i-blog.csdnimg.cn/blog_migrate/875c762d917ce0fc4550ecbf064820ee.png)
![](https://i-blog.csdnimg.cn/blog_migrate/81eece663e86050465397733a39458f9.png)
至此,我们完成了三列中间自适应的布局,也就是传说中的圣杯布局:完整代码如下:
<!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"
>
<
meta
name=
"viewport"
content=
"width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scale=0"
/>
<
title
>Document
</
title
>
<
style
>
.box{
position:
relative;
float:
left
}
.container{
padding:
0
200px
0
300px
}
.left{
width:
300px;
height:
300px;
background:
red;
margin-left:
-100%;
left:
-300px;
}
.right{
width:
200px;
height:
300px;
background:
rgb(
40,
14,
185);
margin-left:
-200px;
right:
-200px;
}
.main{
width:
100%;
height:
300px;
background-color:
green
}
<
/
style
>
</
head
>
<
body
>
<
div
class=
"container"
>
<
div
class=
"main box"
></
div
>
<
div
class=
"left box"
></
div
>
<
div
class=
"right box"
></
div
>
</
div
>
</
body
>
</
html
>