双飞翼布局(圣杯布局)介绍-始于淘宝UED

仔细分析各种布局的技术实现,可以发现下面三种技术被经常使用:

  • 浮动 float
  • 负边距 negative margin
  • 相对定位 relative position

这是实现布局的三个最基本的原子技术。只要巧妙组合,并加以灵活运用,就能“拼”出各种布局的实现方案。

尝试之路考虑以下DOM结构:

  1. <div id="page">      
  2.       <div id="hd"></div>      
  3.          <div id="bd">          
  4.               <div class="main"></div>          
  5.               <div class="sub"></div>          
  6.               <div class="extra"></div>      
  7.          </div>     
  8.       <div id="ft"></div>  
  9. </div>  

利用浮动元素的负边距来定位:

  1. .main {          
  2.            float: left;         
  3.            width: 100%;     
  4.  }    
  5. .sub {         
  6.            float: left;          
  7.            width: 190px;          
  8.            margin-left: -100%;      
  9. }     
  10. .extra {          
  11.              float: left;          
  12.              width: 190px;          
  13.              margin-left: -190px;     
  14.  }  

这样我们得到了第一个尝试页面 点击这里查看效果
可以看出,通过简单的负边距,已经让sub和extra定位到正确的位置。剩下的问题是如何让main也定位到正确的位置。
一个自然的想法是,给main的容器#bd添加padding:

  1. #bd {          
  2.           padding0 230px 0 190px;     
  3.  }  

点击这里查看效果

这样能让main定位到正确的位置,但sub和extra的位置不对了。这是一个思考的关卡。既然sub和extra的位置不对,那就想办法调整到正确的位置。相对定位隆重登场:

  1. .sub {          
  2.            floatleft;          
  3.            width190px;          
  4.            margin-left-100%;          
  5.            positionrelative;          
  6.            left: -190px;      
  7. }    
  8.   .extra {          
  9.              floatleft;          
  10.              width230px;          
  11.              margin-left-230px;          
  12.              positionrelative;          
  13.              right: -230px;      
  14. }  

点击这里查看完成页面 

很明显,这就是圣杯布局!
在不增加任何额外标签的假设上,我尝试了各种想法,但始终都没找到完美的布局实现(圣杯布局是我觉得所有想法中最接近完美的)。
既然不添加额外标签时,完美布局的实现如此困难,那如果允许添加一个额外标签呢?在淘宝UED内部的探讨中,给main增加了一层包裹:

  1. <div id="main" class="column">     
  2.    
  3. <div id="main-content">#main</div>  
  4.   
  5. </div>  

里层main-content的作用就是将main定位到合适的位置,并方便设置padding等属性。想到此处,就像牛顿被苹果砸傻了一样,原来的main定位问题迎刃而解:

  1. <div id="page">      
  2.    
  3.                <div id="bd">          
  4.    
  5.                <div class="main"></div>  
  6.    
  7.                </div>  
  8.    
  9. </div>  

CSS仅需增加一行:

  1. .main-wrap {    margin0 230px 0 190px;}  

想看example4效果点这里
一切如此简单!除了添加了一个额外标签,其它各方面,表现都很完美(试了下IE5.5, 也没任何问题)。目前只用到了浮动和负边距,如果再引入相对定位,还可以实现三栏布局的各种组合

  1. .extra {          
  2.             floatleft;          
  3.             width230px;          
  4.             margin-left-100%;          
  5.             positionrelative;          
  6.              left: 190px;      
  7.          }      
  8. .main-wrap {          
  9.                   margin-left430px;     
  10.                  }  

点击这里查看example5效果

仔细查看example5和example4的源代码,可以发现DOM结构是完全一样的,仅仅CSS稍有不同。这意味着HTML结构和CSS布局在一定程度上解耦了,我们开发HTML代码时,从内容出发即可,无需过多的考虑布局。这正是渐进增强在前端工作流程上的体现。
如果把三栏布局比作一只大鸟,可以把main看成是鸟的身体,sub和extra则是鸟的翅膀。这个布局的实现思路是,先把最重要的身体部分放好,然后再将翅膀移动到适当的地方。因此请容许我给这个布局实现取名为双飞翼布局(Flying Swing Layout).
就如上图中的鸟有各种姿势一样,利用双飞翼布局,我们也可以实现各种布局。这里有个尝试页面,利用双飞翼,实现了一套栅格化布局系统

优点

  • 实现了内容与布局的分离,即Eric提到的Any-Order Columns.
  • main部分是自适应宽度的,很容易在定宽布局和流体布局中切换。
  • 任何一栏都可以是最高栏,不会出问题。
  • 需要的hack非常少(就一个针对ie6的清除浮动hack:_zoom: 1;)
  • 在浏览器上的兼容性非常好,IE5.5以上都支持。

不足

  • main需要添加一个额外的包裹层。
  • 等待你的发现与反馈。

双飞翼的布局非常灵活,只要调整css代码就可以搞定一切。最近在一个论坛项目中准备尝试使用这个布局。希望大家有更好的布局方法一定要多多分享。

  1. <html><head>  
  2. <meta http-equiv="content-type" content="text/html; charset=utf-8">      
  3. <title>PE Layout Example 4</title>  
  4. <style type="text/css">  
  5.     body { font: 22px/1.5 Georgia, sans-serif; color: #333; min-width: 500px; }  
  6.     a { outline: none; text-decoration: none; color: #8CD0D3; }  
  7.     a:visited { color: #8CD0D3; }  
  8.     pre { font: 12px 'Courier New', monospace; }  
  9.   
  10.     .main { background: #D6D6D6; }  
  11.     .sub { background: #E79F6D; }  
  12.     .extra { background: #77BBDD; }  
  13.   
  14.     #hd, #ft {  
  15.         height: 50px;  
  16.         background: #666; color: #eee;  
  17.         text-align: center;  
  18.     }  
  19.     #ft { height: 40px; }  
  20.   
  21.     /* core layout css */  
  22.     .main {  
  23.         float: left;  
  24.         width: 100%;  
  25.     }  
  26.     .sub {  
  27.         float: left;  
  28.         width: 190px;  
  29.         margin-left: -100%;  
  30.     }  
  31.     .extra {  
  32.         float: left;  
  33.         width: 230px;  
  34.         margin-left: -230px;  
  35.     }  
  36.     .main, .sub, .extra {  
  37.         padding-bottom: 5000px;  
  38.         margin-bottom: -5000px;  
  39.     }  
  40.   
  41.     .main-wrap {  
  42.         margin: 0 230px 0 190px;  
  43.     }  
  44.       
  45.   
  46.     #bd { overflow: hidden; _zoom: 1; }  
  47.   
  48. </style>  
  49. </head>  
  50. <body>  
  51.   
  52. <div id="page2">  
  53.     <div id="hd">  
  54.         <p>Header</p>  
  55.     </div>  
  56.     <div id="bd">  
  57.         <div class="main">  
  58.             <div class="main-wrap">  
  59.                 <p>Main</p>  
  60.                 <pre>.main {  
  61.     float: left;  
  62.     width: 100%;  
  63. }  
  64. .main-wrap {  
  65.     margin: 0 230px 0 190px;  
  66. }  
  67.                 </pre>  
  68.             </div>  
  69.         </div>  
  70.         <div class="sub">  
  71.             <p>Sub</p>  
  72.             <pre>.sub {  
  73.     float: left;  
  74.     width: 190px;  
  75.     margin-left: -100%;  
  76. }  
  77.             </pre>  
  78.         </div>  
  79.         <div class="extra">  
  80.             <p>Extra</p>  
  81.             <pre>.extra {  
  82.     float: left;  
  83.     width: 230px;  
  84.     margin-left: -230px;  
  85. }  
  86.             </pre>  
  87.         </div>  
  88.     </div>  
  89.     <div id="ft">  
  90.         <p>Footer</p>  
  91.     </div>  
  92. </div>  
  93.   
  94.   
  95.   
  96. </body></html>  
  1. 转载:http://www.cnblogs.com/cobby/archive/2012/05/09/2491812.html 

还可参考:http://blog.csdn.net/magic_fx/article/details/44876891

(由圣杯布局到双飞翼布局引发的思考)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值