我非常痛恨「完美」。一旦「完美」,就到此为止了。没有「创造」的余地,那表示智慧和才能都派不上用场。你了解吗?对我们科学家而言,所谓「完美」,就是「绝望」。要比目前所存在的任何东西都来得出色,但是……绝对不能「完美」。

- 涅茧利Bleach Vol.35

YY流界面之三栏液态布局 & 圆角边框

March 3, 2007

在公司做了好几个项目的WEB前端开发工作,其实很早就想写一些技术心得,类似以前发的《[造车轮计划]今天写了一个右键菜单的JS类》,可惜……好罢这句话我已经重复过无数次了:太累 & 没时间。

今天终于整理了一部分以前写过的代码,我准备以后陆续在BLOG上发一些WEB交互界面方面的文章,并且逐步补充完善,争取凑出一套原创的控件库和JS效果库。如果你觉得这些东西对自己的开发有帮助,我当然非常欢迎你拿去自由使用,不过我也希望能收到反馈信息——比如你在开发中遇到的问题、或是你在这些代码基础上做的修改和补充——嗯,这也算是一种开源协议,比什么BSD什么阿帕契都要厚道罢……XD

那么先帖篇简单的:一种实现“三栏液态布局”和“圆角边框”的方法,所谓“液态布局”,就是网页内容的宽度能随屏幕分辨率/浏览器的大小而改变,自动撑满。

根据我的经验……目前网页设计中最常见的还是采用固定宽度居中对齐的布局,也就是说当用户的分辨率提高时,页面左右会出现空白,强调用户体验的WEB2.0网站们翰注重个性的BLOG们,经常会针对这些空白专门设计BODY背景边缘。而采用液态布局的网页中,又有很大一部分是采用两栏式结构。这里我要做的,是同时包括正文、左侧栏和右侧栏,始终撑满整个窗口,中栏的宽度会随浏览器窗口的大小而变化,当然了,在IE和Firefox里不能有差别。

这是我做的效果演示:http://demo.limboy.com/3c.htm

注意:在这个页面里,圆角方块的底部已经做成可以上下拖动的了,类似软件窗口的拖动效果,方便大家测试高度的自适应效果。

首先是HTML,建立三个容器,放在一个层里面,作为左、中、右三个竖栏:

  1. <div id="main">
  2.  
  3. <!-- 左侧栏 -->
  4. <div id="leftColumn"></div>
  5.  
  6. <!-- 右侧栏 -->
  7. <div id="rightColumn"></div>
  8.  
  9. <!-- 中间的正文 -->
  10. <div id="centerColumn"></div>
  11.  
  12. </div>

注意:中栏的DIV必须写在左右侧栏的“下面”,否则CSS就达不到效果:

  1. #main{
  2. background:#464646;
  3. width:100%;
  4. margin:0px auto;     
  5. padding:0;
  6. text-align:left;     
  7. float:left;
  8.  
  9. }
  10.  
  11. #leftColumn{
  12. float:left;
  13. width:200px;
  14.  
  15. }
  16.  
  17. #rightColumn{
  18. float:right;
  19. width:200px;
  20.  
  21. }
  22.  
  23. #centerColumn{
  24. width:auto;
  25. margin:0px 200px 0px 200px;
  26.  
  27. }

左右侧栏分别采用了左浮动和右浮动,限定宽度。中栏采用居中对齐的样式,只是不限定宽度,而且左右的margin设置为侧栏的宽度,而不是auto。

需要注意的是,为了让容器高度随着内容而增加,三栏外面的容器#main也必须设置为浮动,如果它的下面还有容器,也要设置为浮动,比如演示页面中的#foot,而#main上面的容器则不需要浮动,比如演示页面中的#head和#top。

但只是这样还不够,如果在容器里面加入内容,就会发现在该死的IE里出现了一些瑕疵,IE6和IE7一样,凭这一点就可以猜测是属于layout属性BUG,经过一些测试可以证实。所以解决办法是,给#centerColumn层加入某种能触发layout属性的样式,这里我采用的是IE的专有样式zoom:

  1. #leftColumn{
  2. margin-left:0px;
  3. }
  4.  
  5. #rightColumn{
  6. margin-right:0px;
  7. }
  8.  
  9. #centerColumn{
  10. zoom:1;
  11. }

以上代码应该放在一个IE专用的样式表里,这样既不会影响其他浏览器,也能通过W3C校验 :D

用微软的专有技术“条件注释”来实现:

  1. <!--[if IE]>
  2.  
  3. <link href="css/forie.css" type="text/css" rel="stylesheet" />
  4.  
  5. <![endif]-->

注释内的代码只有符合条件判断的IE浏览器会解释。

接下来在三栏中都加入若干圆角方框,作为基本容器。我的圆角方框是这样的:

  1. <div class="widgetBox">
  2.  
  3. <div class="widgetTop">
  4.  
  5.  <div class="widgetLeftTop"></div><div class="widgetRightTop"></div>
  6.  
  7. </div>
  8.  
  9. <div class="widgetCenter">
  10.  <div class="widgetMain" >  
  11.  </div>
  12. </div>
  13.  
  14. <div class="widgetBottom">
  15.  
  16.  <div class="widgetLeftBottom"></div><div class="widgetRightBottom"></div>
  17.  
  18. </div>
  19.  
  20. </div>

样式:

  1. .widgetBox{
  2. margin:0px;
  3. padding:0px;
  4.  
  5. }
  6. .widgetTop{
  7. background:url(../images/boxtbg.jpg) repeat-x;
  8.  
  9. height:21px;
  10. }
  11. .widgetLeftTop{
  12. background:url(../images/boxlt.jpg) no-repeat;
  13.  
  14. height:21px;width:16px;
  15. float:left;
  16.  
  17. }
  18. .widgetRightTop{
  19. background:url(../images/boxrt.jpg) no-repeat;
  20.  
  21. height:21px;width:16px;
  22. float:right;
  23.  
  24. }
  25. .widgetBottom{
  26. background:url(../images/boxbbg.jpg) repeat-x;
  27.  
  28. height:20px;
  29. }
  30.  
  31. .widgetLeftBottom{
  32. background:url(../images/boxlb.jpg) no-repeat left;
  33.  
  34. height:20px;width:16px;
  35. float:left;
  36.  
  37. }
  38. .widgetRightBottom{
  39. background:url(../images/boxrb.jpg) no-repeat right;
  40.  
  41. height:20px;width:16px;
  42. float:right;
  43.  
  44. }
  45. .widgetCenter{
  46. background:#343434;
  47. margin:0 3px 0 3px;
  48.  
  49. }
  50. .widgetMain{
  51. width:auto;
  52. margin:0 3px 0 3px;
  53.  
  54. background:#fff;
  55. border-left:2px solid #CCCCCC;
  56. border-right:2px solid #CCCCCC;
  57.  
  58. padding:8px;
  59. }

为了适应各种大小,顶部边缘和底部边缘用了单独的圆角图片和横向重复的背景,而中间没有任何图片,用边框颜色和内外两个层之间的空隙颜色来做出边缘阴影的效果。

当页面里内容不足的时候,这些圆角方框都会显得不够长,可以在样式里加入最小高度来解决这个问题:

  1. .widgetCenter{
  2. min-height:130px;
  3. }

min-height属于CSS2标准,IE6并不支持,但可以利用IE6的一个最常见的overflow BUG:当容器内的东西大小超过容器时,按照W3C标准,超出的内容会“飘”出来显示在容器外面,而在IE6里容器会被撑大,所以只要直接在IE专用样式表里写.widgetCenter{height:130px;}就行了……然则,IE7修正了overflow BUG,而且支持min-height属性-_______-b…………所以,必须写成这样:

  1. *html .widgetCenter{
  2. height:130px;
  3. }

*html是某种只有IE6认识的东西……而IE7不认识……因此以上样式只对IE6及以下的浏览器生效……(随便说一下,也有一种只有IE7能识别的前缀:*+html )-_______-b

这样就做出了一个比较灵活的三栏布局,只改动少量代码和背景图片就可以适应不同的页面设计(代码重用性在网页中同样重要)。更详细的内容请自行查看演示页面的代码。

posted in CSS, 界面 by Dexter.Yy

Follow comments via the RSS Feed | Leave a comment | Trackback URL

1 Comment to "YY流界面之三栏液态布局 & 圆角边框"

  1. redgps wrote:

    非常好,比较复杂的东西让你三下两下就搞定了,
    不过有个问题想请教一下,如果全部三栏为LIQUID布局,还要用ROUNDED CORNER,这样能不能做到?
    因为我前天弄了一个,但是如果里面的东西多,就现出现问题了.

Leave Your Comment

YY in Limbo (混沌海狂想) © Dexter.Yy

Except where otherwise noted, content on this site is licensed under a Creative Commons Attribution - NonCommercial - ShareAlike 3.0(署名-非商业性使用-相同方式共享).
Creative Commons License