CSS的三列式"圣杯布局"方案完全解析

过去的习惯,决定今天的你,所以,过去的懒惰,决定你今天的一败涂地。人来到这世界后,命运注定了他必须要拼搏,奋斗,坚持,勇敢地走下去,走出属于自己的道路,没有人能不劳而获。

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

XML/HTML Code复制内容到剪贴板
  1. <divclass="container">
  2. <divclass="main"></div>
  3. <divclass="sub"></div>
  4. <divclass="extra"></div>
  5. </div>

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

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

CSS Code复制内容到剪贴板
  1. .main{
  2. float:left;
  3. width:100%;
  4. height:300px;
  5. background-color:rgba(255,0,0,.5);
  6. }
  7. .sub{
  8. float:left;
  9. width:200px;
  10. height:300px;
  11. margin-left:-100%;
  12. background-color:rgba(0,255,0,.5);
  13. }
  14. .extra{
  15. float:left;
  16. width:180px;
  17. height:300px;
  18. margin-left:-180px;
  19. background-color:rgba(0,0,255,.5);
  20. }

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

CSS Code复制内容到剪贴板
  1. .container{
  2. padding-left:210px;
  3. padding-right:190px;
  4. }

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

CSS Code复制内容到剪贴板
  1. .sub{
  2. position:relative;
  3. left:-210px;
  4. }
  5. .extra{
  6. position:relative;
  7. rightright:-190px;
  8. }

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

CSS Code复制内容到剪贴板
  1. body{
  2. min-width:600px;/*2*sub+extra*/
  3. }
  4. .container{
  5. padding-left:210px;
  6. padding-right:190px;
  7. }
  8. .main{
  9. float:left;
  10. width:100%;
  11. height:300px;
  12. background-color:rgba(255,0,0,.5);
  13. }
  14. .sub{
  15. position:relative;
  16. left:-210px;
  17. float:left;
  18. width:200px;
  19. height:300px;
  20. margin-left:-100%;
  21. background-color:rgba(0,255,0,.5);
  22. }
  23. .extra{
  24. position:relative;
  25. rightright:-190px;
  26. float:left;
  27. width:180px;
  28. height:300px;
  29. margin-left:-180px;
  30. background-color:rgba(0,0,255,.5);
  31. }

点击查看在线demo

完整实例
效果如下:

CSS 和 DOM 代码如下:

CSS Code复制内容到剪贴板
  1. <!DOCTYPEhtml>
  2. <html>
  3. <head>
  4. <metacharset="utf-8">
  5. <metahttp-equiv="X-UA-Compatible"content="IE=edge,chrome=1">
  6. <title>圣杯布局</title>
  7. <styletype="text/css">
  8. body{background-color:#ffffff;font-size:14px;}
  9. #hd,#ft{padding:20px3px;background-color:#cccccc;text-align:center;}
  10. .bd-lft,.bd-rgt,.bd-3-lr,.bd-3-ll,.bd-3-rr{margin:10px0;min-width:400px;}
  11. .main{background-color:#03a9f4;color:#ffffff;}
  12. .aside,.aside-1,.aside-2{background-color:#00bcd4;color:#ffffff;}
  13. p{margin:0;padding:20px;text-align:center;}
  14. /*左侧栏固定宽度,右侧自适应*/
  15. .bd-lft{
  16. zoom:1;
  17. overflow:hidden;
  18. padding-left:210px;
  19. }
  20. .bd-lft.aside{
  21. float:left;
  22. width:200px;
  23. margin-left:-100%;/*=-100%*/
  24. position:relative;
  25. left:-210px;/*=-parantNode.paddingLeft*/
  26. _left:0;/*IE6hack*/
  27. }
  28. .bd-lft.main{
  29. float:left;
  30. width:100%;
  31. }
  32. /*右侧栏固定宽度,左侧自适应*/
  33. .bd-rgt{
  34. zoom:1;
  35. overflow:hidden;
  36. padding-right:210px;
  37. }
  38. .bd-rgt.aside{
  39. float:left;
  40. width:200px;
  41. margin-left:-200px;/*=-this.width*/
  42. position:relative;
  43. rightright:-210px;/*=-parantNode.paddingRight*/
  44. }
  45. .bd-rgt.main{
  46. float:left;
  47. width:100%;
  48. }
  49. /*左中右三栏自适应*/
  50. .bd-3-lr{
  51. zoom:1;
  52. overflow:hidden;
  53. padding-left:210px;
  54. padding-right:210px;
  55. }
  56. .bd-3-lr.main{
  57. float:left;
  58. width:100%;
  59. }
  60. .bd-3-lr.aside-1{
  61. float:left;
  62. width:200px;
  63. margin-left:-100%;
  64. position:relative;
  65. left:-210px;
  66. _left:210px;/*IE6hack*/
  67. }
  68. .bd-3-lr.aside-2{
  69. float:left;
  70. width:200px;
  71. margin-left:-200px;
  72. position:relative;
  73. rightright:-210px;
  74. }
  75. /*都在左边,右侧自适应*/
  76. .bd-3-ll{
  77. zoom:1;
  78. overflow:hidden;
  79. padding-left:420px;
  80. }
  81. .bd-3-ll.main{
  82. float:left;
  83. width:100%;
  84. }
  85. .bd-3-ll.aside-1{
  86. float:left;
  87. width:200px;
  88. margin-left:-100%;
  89. position:relative;
  90. left:-420px;
  91. _left:0px;/*IE6hack*/
  92. }
  93. .bd-3-ll.aside-2{
  94. float:left;
  95. width:200px;
  96. margin-left:-100%;
  97. position:relative;
  98. left:-210px;
  99. _left:210px;/*IE6hack*/
  100. }
  101. /*都在右边,左侧自适应*/
  102. .bd-3-rr{
  103. zoom:1;
  104. overflow:hidden;
  105. padding-right:420px;
  106. }
  107. .bd-3-rr.main{
  108. float:left;
  109. width:100%;
  110. }
  111. .bd-3-rr.aside-1{
  112. float:left;
  113. width:200px;
  114. margin-left:-200px;
  115. position:relative;
  116. rightright:-210px;
  117. }
  118. .bd-3-rr.aside-2{
  119. float:left;
  120. width:200px;
  121. margin-left:-200px;
  122. position:relative;
  123. rightright:-420px;
  124. }
  125. </style>
  126. </head>
  127. <body>
  128. <divid="hd">头部</div>
  129. <divclass="bd-lft">
  130. <divclass="main">
  131. <p>主内容栏自适应宽度</p>
  132. </div>
  133. <divclass="aside">
  134. <p>侧边栏固定宽度</p>
  135. </div>
  136. </div>
  137. <divclass="bd-rgt">
  138. <divclass="main">
  139. <p>主内容栏自适应宽度</p>
  140. </div>
  141. <divclass="aside">
  142. <p>侧边栏固定宽度</p>
  143. </div>
  144. </div>
  145. <divclass="bd-3-lr">
  146. <divclass="main">
  147. <p>主内容栏自适应宽度</p>
  148. </div>
  149. <divclass="aside-1">
  150. <p>侧边栏1固定宽度</p>
  151. </div>
  152. <divclass="aside-2">
  153. <p>侧边栏2固定宽度</p>
  154. </div>
  155. </div>
  156. <divclass="bd-3-ll">
  157. <divclass="main">
  158. <p>主内容栏自适应宽度</p>
  159. </div>
  160. <divclass="aside-1">
  161. <p>侧边栏1固定宽度</p>
  162. </div>
  163. <divclass="aside-2">
  164. <p>侧边栏2固定宽度</p>
  165. </div>
  166. </div>
  167. <divclass="bd-3-rr">
  168. <divclass="main">
  169. <p>主内容栏自适应宽度</p>
  170. </div>
  171. <divclass="aside-1">
  172. <p>侧边栏1固定宽度</p>
  173. </div>
  174. <divclass="aside-2">
  175. <p>侧边栏2固定宽度</p>
  176. </div>
  177. </div>
  178. <divid="ft">底部</div>
  179. </body>
  180. </html>

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

本文CSS的三列式"圣杯布局"方案完全解析到此结束。年轻时代是培养习惯、希望及信仰的一段时光。小编再次感谢大家对我们的支持!

您可能有感兴趣的文章
面试必问:圣杯布局和双飞翼布局的区别

浅谈css双飞翼布局和圣杯布局

CSS布局之圣杯布局与双飞翼布局

css让页脚保持在底部位置的四种方案

Flex布局史上最简单使用语法教程