视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
详解CSS的三列式圣杯布局方案完全解析
2020-11-27 18:52:44 责编:小采
文档
圣杯布局效果优美且对浏览器兼容性要求非常低,是一种非常给力的三列式页面布局方案,接下来就来看看对CSS的三列式"圣杯布局"方案完全解析:

圣杯布局源自 Matthew Levine 在06年的一篇文章,其DOM结构如下:

<p class="container">
 <p class="main"></p>
 <p class="sub"></p>
 <p class="extra"></p>
</p>

流程解说
接下来,让我们一步一步地实现圣杯布局;

1、 首先分别浮动main、sub、extra三列, 然后利用负外边距把sub列和extra列定位到左右两边。这时的CSS代码如下:

.main { 
 float: left; 
 width: 100%; 
 height: 300px; 
 background-color: rgba(255, 0, 0, .5); 
} 
.sub { 
 float: left; 
 width: 200px; 
 height: 300px; 
 margin-left: -100%; 
 background-color: rgba(0, 255, 0, .5); 
} 
.extra { 
 float: left; 
 width: 180px; 
 height: 300px; 
 margin-left: -180px; 
 background-color: rgba(0, 0, 255, .5); 
}

2、 完成上步后,sub和extra列已经到了正确的位置,但是sub和extra列却覆盖了main的两边,对于这个问题,圣杯布局的解决办法是给容器container添加左、右内边距,从而让main列定位到正确的位置。

.container { 
 padding-left: 210px; 
 padding-right: 190px; 
}

3、 完成第二步后又出现了新问题:sub、extra列也受到容器左右内边距的影响位置发生了移动。为了解决这个问题,圣杯布局使用相对定位使sub、extra列回到正确的位置。新添加代码如下:

.sub { 
 position: relative; 
 left: -210px; 
} 
.extra { 
 position: relative; 
 rightright: -190px; 
}

4、 当浏览器缩小到一定程度时,这个布局可能会被破坏,可以在body上添加min-width属性解决。最终的圣杯布局CSS代码如下:

body { 
 min-width: 600px; /* 2*sub + extra */
} 
.container { 
 padding-left: 210px; 
 padding-right: 190px; 
} 
.main { 
 float: left; 
 width: 100%; 
 height: 300px; 
 background-color: rgba(255, 0, 0, .5); 
} 
.sub { 
 position: relative; 
 left: -210px; 
 float: left; 
 width: 200px; 
 height: 300px; 
 margin-left: -100%; 
 background-color: rgba(0, 255, 0, .5); 
} 
.extra { 
 position: relative; 
 rightright: -190px; 
 float: left; 
 width: 180px; 
 height: 300px; 
 margin-left: -180px; 
 background-color: rgba(0, 0, 255, .5); 
}

完整实例

效果如下:

CSS 和 DOM 代码如下:

<!DOCTYPE html> 
<html> 
<head> 
 <meta charset="utf-8"> 
 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 
 <title>圣杯布局</title> 

 <style type="text/css"> 
 body {background-color: #ffffff; font-size:14px;} 
 #hd, #ft {padding:20px 3px; background-color: #cccccc; text-align: center;} 
 .bd-lft, .bd-rgt, .bd-3-lr, .bd-3-ll, .bd-3-rr {margin:10px 0; min-width:400px;} 
 .main {background-color: #03a9f4; color:#ffffff;} 
 .aside, .aside-1, .aside-2 {background-color: #00bcd4; color:#ffffff;} 
 p {margin:0; padding:20px; text-align: center;} 


 /* 左侧栏固定宽度,右侧自适应 */
 .bd-lft { 
 zoom:1; 
 overflow:hidden; 
 padding-left:210px; 
 } 
 .bd-lft .aside { 
 float:left; 
 width:200px; 
 margin-left:-100%; /*= -100%*/

 position:relative; 
 left:-210px; /* = -parantNode.paddingLeft */
 _left: 0; /*IE6 hack*/
 } 
 .bd-lft .main { 
 float:left; 
 width:100%; 
 } 


 /* 右侧栏固定宽度,左侧自适应 */
 .bd-rgt { 
 zoom:1; 
 overflow:hidden; 
 padding-right:210px; 
 } 
 .bd-rgt .aside { 
 float:left; 
 width:200px; 
 margin-left:-200px; /* = -this.width */

 position:relative; 
 rightright:-210px; /* = -parantNode.paddingRight */
 } 
 .bd-rgt .main { 
 float:left; 
 width:100%; 
 } 


 /* 左中右 三栏自适应 */
 .bd-3-lr { 
 zoom:1; 
 overflow:hidden; 
 padding-left:210px; 
 padding-right:210px; 
 } 
 .bd-3-lr .main { 
 float:left; 
 width:100%; 
 } 
 .bd-3-lr .aside-1 { 
 float: left; 
 width:200px; 
 margin-left: -100%; 

 position:relative; 
 left: -210px; 
 _left: 210px; /*IE6 hack*/
 } 
 .bd-3-lr .aside-2 { 
 float: left; 
 width:200px; 
 margin-left: -200px; 

 position:relative; 
 rightright: -210px; 
 } 

 /* 都在左边,右侧自适应 */
 .bd-3-ll { 
 zoom:1; 
 overflow:hidden; 
 padding-left:420px; 
 } 
 .bd-3-ll .main { 
 float:left; 
 width:100%; 
 } 
 .bd-3-ll .aside-1 { 
 float: left; 
 width:200px; 
 margin-left: -100%; 

 position:relative; 
 left: -420px; 
 _left: 0px; /*IE6 hack*/
 } 
 .bd-3-ll .aside-2 { 
 float: left; 
 width:200px; 
 margin-left: -100%; 

 position:relative; 
 left: -210px; 
 _left: 210px; /*IE6 hack*/
 } 

 /* 都在右边,左侧自适应 */
 .bd-3-rr { 
 zoom:1; 
 overflow:hidden; 
 padding-right:420px; 
 } 
 .bd-3-rr .main { 
 float:left; 
 width:100%; 
 } 
 .bd-3-rr .aside-1 { 
 float: left; 
 width:200px; 
 margin-left: -200px; 

 position:relative; 
 rightright: -210px; 
 } 
 .bd-3-rr .aside-2 { 
 float: left; 
 width:200px; 
 margin-left: -200px; 

 position:relative; 
 rightright: -420px; 
 } 


 </style> 

</head> 
<body> 

 <p id="hd">头部</p> 

 <p class="bd-lft"> 
 <p class="main"> 
 <p>主内容栏自适应宽度</p> 
 </p> 

 <p class="aside"> 
 <p>侧边栏固定宽度</p> 
 </p> 
 </p> 

 <p class="bd-rgt"> 
 <p class="main"> 
 <p>主内容栏自适应宽度</p> 
 </p> 

 <p class="aside"> 
 <p>侧边栏固定宽度</p> 
 </p> 
 </p> 

 <p class="bd-3-lr"> 
 <p class="main"> 
 <p>主内容栏自适应宽度</p> 
 </p> 

 <p class="aside-1"> 
 <p>侧边栏1固定宽度</p> 
 </p> 

 <p class="aside-2"> 
 <p>侧边栏2固定宽度</p> 
 </p> 
 </p> 

 <p class="bd-3-ll"> 
 <p class="main"> 
 <p>主内容栏自适应宽度</p> 
 </p> 

 <p class="aside-1"> 
 <p>侧边栏1固定宽度</p> 
 </p> 

 <p class="aside-2"> 
 <p>侧边栏2固定宽度</p> 
 </p> 
 </p> 

 <p class="bd-3-rr"> 
 <p class="main"> 
 <p>主内容栏自适应宽度</p> 
 </p> 

 <p class="aside-1"> 
 <p>侧边栏1固定宽度</p> 
 </p> 

 <p class="aside-2"> 
 <p>侧边栏2固定宽度</p> 
 </p> 
 </p> 

 <p id="ft">底部</p> 

</body> 
</html>

圣杯布局的优点总结如下:
1.使主要内容列先加载。
2.允许任何列是最高的。
3.没有额外的p。
4.需要的hack很少。

下载本文
显示全文
专题