圣杯布局和双飞翼布局解决的问题是一样的,就是两边顶宽,中间自适应的三栏布局,中间栏要在放在文档流前面以优先渲染。

    圣杯布局和双飞翼布局解决问题的方案在前一半是相同的,也就是三栏全部 float 浮动,但左右两栏加上负 margin 让其跟中间栏 div 并排,以形成三栏布局。

    不同在于解决” 中间栏 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

    对比图:

    布局中间要突出显示 - 图2

    下面直接上代码:

    圣杯布局:

    1. <body>
    2. <div>header</div>
    3. <div>
    4. <div>middle</div>
    5. <div>left</div>
    6. <div>right</div>
    7. </div>
    8. <div>footer</div>
    9. </body>
    10. <style>
    11. #hd{
    12. height:50px;
    13. background: #666;
    14. text-align: center;
    15. }
    16. #bd{
    17. /*左右栏通过添加负的margin放到正确的位置了,此段代码是为了摆正中间栏的位置*/
    18. padding:0 200px 0 180px;
    19. height:100px;
    20. }
    21. #middle{
    22. float:left;
    23. width:100%;/*左栏上去到第一行*/
    24. height:100px;
    25. background:blue;
    26. }
    27. #left{
    28. float:left;
    29. width:180px;
    30. height:100px;
    31. margin-left:-100%;
    32. background:#0c9;
    33. /*中间栏的位置摆正之后,左栏的位置也相应右移,通过相对定位的left恢复到正确位置*/
    34. position:relative;
    35. left:-180px;
    36. }
    37. #right{
    38. float:left;
    39. width:200px;
    40. height:100px;
    41. margin-left:-200px;
    42. background:#0c9;
    43. /*中间栏的位置摆正之后,右栏的位置也相应左移,通过相对定位的right恢复到正确位置*/
    44. position:relative;
    45. right:-200px;
    46. }
    47. #footer{
    48. height:50px;
    49. background: #666;
    50. text-align: center;
    51. }
    52. </style>

    双飞翼布局:

    1. <body>
    2. <div>header</div>
    3. <div>
    4. <div>middle</div>
    5. </div>
    6. <div>left</div>
    7. <div>right</div>
    8. <div>footer</div>
    9. </body>
    10. <style>
    11. #hd{
    12. height:50px;
    13. background: #666;
    14. text-align: center;
    15. }
    16. #middle{
    17. float:left;
    18. width:100%;/*左栏上去到第一行*/
    19. height:100px;
    20. background:blue;
    21. }
    22. #left{
    23. float:left;
    24. width:180px;
    25. height:100px;
    26. margin-left:-100%;
    27. background:#0c9;
    28. }
    29. #right{
    30. float:left;
    31. width:200px;
    32. height:100px;
    33. margin-left:-200px;
    34. background:#0c9;
    35. }
    36. /*给内部div添加margin,把内容放到中间栏,其实整个背景还是100%*/
    37. #inside{
    38. margin:0 200px 0 180px;
    39. height:100px;
    40. }
    41. #footer{
    42. clear:both; /*记得清楚浮动*/
    43. height:50px;
    44. background: #666;
    45. text-align: center;
    46. }
    47. </style>
    1. <body>
    2. <style type="text/css">
    3. body{margin:0; padding:0;}
    4. .boxA{width:180px;background: #CD0000 }
    5. .boxB{width:600px;background: #9ACD32}
    6. .boxC{width:180px;background: #87CEFF}
    7. .box{ height: 300px; float: left;}
    8. /*ABC*/
    9. /*.boxA{position: relative;left:-960px;}
    10. .boxB{margin-left:180px;}*/
    11. /*CBA*/
    12. .container{ padding: 0 180px;}
    13. .boxB{width: 100%; text-align: right;}
    14. .boxC{position: relative;margin-left: -180px;left:-100%;}
    15. .boxA{position: relative;margin-left: -180px;right:-180px;}
    16. /*BAC*/
    17. /*.boxC{float:right;}
    18. .container{width: 960px;}*/
    19. </style>
    20. <p>现有并列的三列布局结构,从左至右依次为 A, B, C, 宽度分别为180px, 600px, 180px。要求在不改变 Html 结构的情况下用CSS实现:ABC,CBA,BAC 三种布局及在CBA排列下使B宽度自适应(三列总宽度100%),不能使用针对浏览器的CSS Hack.</p>
    21. <div>
    22. <div>B</div>
    23. <div>C</div>
    24. <div>A</div>
    25. </div>
    26. </body>