Spiga

你有 <table /> 强迫症吗?

2007-03-19 00:04 by Cat Chen, 10653 visits, 收藏, 编辑

上次讲到“欲练 CSS ,必先宫 IE”,如果你宫了IE然而还是觉得不得要领,那就该怀疑自己是不是有传说中的table强迫症了。

CSDN社区上,时不时能够看到一些页面整体布局的问题,要求用div做一些table才能做到的,否则就以此为把柄说XHTML+CSS布局方法不好。其实,首先要做的是改变思维,以适应XHTML+CSS的布局。

面向页面设计而非面向浏览器设计

XHTML+CSS能够实现的是一种流布局,也就是随着内容的长度自动增长区域,并且最终导致整个页面增长,这时候浏览器就必须显示滚动条。table强迫症的一个征兆就是极力避免流布局,希望以浏览器的可视区域为布局目标,要求在可视区域中划分内容区域而不是在页面上划分内容区域。实际上XHTML是无法针对浏览器设计的,因为它仅仅包含语义,或者说是内容,而浏览器如何去表现这些内容是我们无法确定的。CSS提供了我们控制表现方式的一种途径,但这仅仅是针对主流浏览器的,而且浏览器支持的“指令集”还有稍为的差别(说到这,我真希望能够为一个浏览器写CSS然后编译为全平台兼容代码),最后这些指令暂时还仅仅支持针对页面的流式布局控制。因此,如果你决定要开始写符合语义的XHTML并且仅仅用CSS控制布局,首先就要把思路转变为面向页面(或者说是文档)的布局控制,而非面向浏览器可视区域的布局控制。

接下来肯定有人要说,“那你就是承认了有些布局老方法很容易做到,但新方法很难做到啦”。这是当然的,然而这不成为我们继续使用table的理由。这时候要反过来探讨原始目标了,我们是为什么要控制布局?低层次的需求是为了美观,谁都希望同样的内容能够以更好的视觉效果展示在用户眼前;高层次的需求是为了控制受众的浏览方式,让他们能够按我们预先设计好的方式来区分页面内容的轻重点,按我们的期望优先浏览某些内容,同时也帮助他们更快的找到他们想要的内容,而不会在我们的网站内感到沮丧。既然我们确定了这时控制布局的目标,那么我们再来看看CSS是不是“没办法把事情做好”。首先,CSS也能做出美观的页面,虽然某些布局做不到,但是在CSS的限制下做到同等美观程度的页面是肯定没问题的。其次,CSS也能让设计变得友善,不会说CSS的设计就肯定是“干净”到用户无法一眼找到他想要的功能。因此,虽然CSS无法实现某些特定的布局效果,但对于设计师来说它能够达到老方法所能达到的同等效果,这就足够了。

从XHTML中去掉内容无关的视觉元素

另一个table强迫症的征兆就是,习惯为每一个视觉上的元素对应一个XHTML元素。在table中,无论视觉效果有多复杂,我们总能不停的切割table,甚至table套table,直到准确定位每一个特定的元素。然而应用了CSS之后,这就是不必要的,甚至会给设计师带来麻烦,因为XHTML+CSS就是为了内容和布局分离,所以如果一个视觉元素与内容无关,那么它就不应当出现在XHTML中,自然也就不会对应一个XHTML元素。

例如有一个网站当前栏目的徽标,这个徽标没有任何的语义,而XHTML中也有文字内容描述当前栏目了,那么这个徽标就并不一定要对应一个<img />元素。如何让徽标显示出来呢?它可以是当前栏目文字描述区域的background-image,同时通过一些定位技巧让它显示出来。如果你认为有这个徽标就不需要文字描述时,你还可以通过定位技巧将文字隐藏掉,这样单纯看XHTML或者在不支持CSS的浏览器上就只见文字描述,而在支持CSS的浏览器中则看见会标。从这个例子,我们可以看得到一个视觉元素不一定要对应XHTML中一个实实在在的内容元素,或者对应一个文本元素而非图形元素。XHTML包含的是内容,那就不应该包含与内容无关的视觉元素描述,而通过CSS你可以事后增加有关的视觉元素。

又例如:before和:after这两个伪选择器,允许你创建插入在匹配元素前后的元素,这样就能够实现非内容视觉效果仅在CSS中插入。常见的用法包括,插入clear到浮动元素之后以确保父元素的完整包含,又或者是引用语句的前后自动加上引号。事实表明,CSS是很适合于将非内容的元素从XHTML中分离出来的,因此我们在设计XHTML时就不能够总想着要有什么效果,而应该单纯想着信息的组织形式。

最后,如果要我为table强迫症开处方的话,我还是会选择《CSS Mastery/精通CSS》。看完之后,你自然能够解除上述的烦恼,理解到CSS布局带来的便利,从而选择开始用纯CSS的思维来进行设计。如果你关注CSS方面的内容,可以考虑订阅我的blog:

将来我会和大家分享更多关于CSS的思考,以及使用CSS的技巧。

Add your comment

26 条回复

  1. #1楼 deerchao2007-03-19 00:29
    web标准,语义化网络,任重而道远啊。。。

    有点怀疑这些在中国能不能在Web亡之前流行起来。
     回复 引用   
  2. #2楼 补丁      2007-03-19 07:58
    ....怎么听起来XHTML里不该用table?
    我倒不认为table怎么样怎么样糟糕,反倒觉得有些人对div的推崇有点过了
    两者有不同的特点决定了针对不同应用或环境有不同的选择
    table强迫症.....对应也有div强迫症
     回复 引用 查看   
  3. #3楼 yzx110[未注册用户]2007-03-19 09:21
    就普通的显示来说,好像table是浏览器支持最好的,不管主流还是非主流浏览器,虽然用css/js控制不太方便。

    基本上我整体布局用css,但是局部的还是用table
     回复 引用   
  4. #4楼 轻剑傲风      2007-03-19 09:27
    Table是内容标签,当然不应该在XHTML里用了,这是很明显的.应该用Table来标志信息内容,而不是样式和布局.我倒觉得,把Table的Width和Height属性去掉更好.这样大家就不会在这种概念上混乱了.
    那么为什么要严格区分内容标签和样式标签呢?这是为了WEB资源的更好的,更方便的重复利用.你用Table来实现了布局,效果也很好.当然,我们人为的分析你的页面时,知道你哪里是布局,哪里是内容.但是当一个软件,一个搜索工具来分析你的页面时,就不能清楚的弄清哪里是内容,哪里是样式了.这样,你的页面里的信息就不方便于再利用.不方便于交流了.所以,内容和样式的分离是很重要的.
    当然你也可以说:我的页面为什么要给别人再次利用,我的信息可不能这么轻易的被利用.那么恭喜你,你说出了中国互联网信息交流和发展的瓶颈之所在....
     回复 引用 查看   
  5. #5楼 补丁      2007-03-19 09:38
    Div是流布局,Table有自己独有的布局优势,"当然不应该在XHTML里用了,这是很明显的",我是看不出来,各取所长而已
    对于开发而言,div+css更吃功力,table兼容性更好,css应用也并不含糊,那么复杂度不应该推给开发人员,他们愿意用什么很大层面上不是技术本身或者它的前景决定的
    Table不应用在XHTML里是XHTML里规定的么?如果是,那么XHTML颠覆了HTML4.0的table定义,这个颠覆为不为大家接受,还需要时间来验证
     回复 引用 查看   
  6. #6楼 轻剑傲风      2007-03-19 09:43
    @补丁
    不得不说,我说错了一点,应该是Table不应该在XHTML里用来布局,而只是用来标识内容.告诉获取信息者,这里将是一个二维的表格内容.

    在我们公司,我是做后台开发的,我生成的内容页面里的Table只用做这个目的.而页面设计人员拿到我的内容页面后,只添加一句CSS的引用,和一个CSS文件给我就行了,内容页面我以后要做改动也不怕,只要不改变里面的ID.就再没出过错.
    而老板要求设计人员改动样式时,设计人员直接替换掉了CSS文件就搞定了.我和设计人员基本上是分离工作的.
     回复 引用 查看   
  7. #7楼 netflu2007-03-19 09:55
    有些时侯感觉使用div+css会比用table麻烦,使用div+css需要考虑到更多东西,弄得不好反而会有副作用,而使用table则很简单,可能是div+css的功力不够吧
     回复 引用   
  8. #8楼 轻剑傲风      2007-03-19 10:15
    其实这个和设计模式的应用有些相似...
     回复 引用 查看   
  9. #9楼 Jeffrey Zhao      2007-03-19 10:30
    如果概念上是table,则自然用table。
     回复 引用 查看   
  10. #10楼[楼主] Cat Chen      2007-03-19 13:01
    @补丁
    我整篇文章下来都没有提到过div+css,甚至连div都不说,只说xhtml+css,我想你应该明白我的用意吧——不是说应该用div取代table布局,table不用于布局同时div也不用于布局,它们都用于表示语义,只有css用于布局。也就是说,针对语义该用什么xhtml元素就用什么元素,然后无论xhtml如何都应该尽量仅用css完成布局任务。
     回复 引用 查看   
  11. #11楼[楼主] Cat Chen      2007-03-19 13:04
    @补丁
    所谓的div强迫症,也就是table强迫症的一种进化,但还是病态,xhtml不用于布局。只有当你写着xhtml时不用想着最终如何布局,而仅仅想着如何组织信息结构,这才算是真正实现了xhtml+css的分离。
     回复 引用 查看   
  12. #12楼 拉拉[未注册用户]2007-03-19 21:22
    那么为什么要严格区分内容标签和样式标签呢?这是为了WEB资源的更好的,更方便的重复利用.你用Table来实现了布局,效果也很好.当然,我们人为的分析你的页面时,知道你哪里是布局,哪里是内容.但是当一个软件,一个搜索工具来分析你的页面时,就不能清楚的弄清哪里是内容,哪里是样式了.这样,你的页面里的信息就不方便于再利用.不方便于交流了.所以,内容和样式的分离是很重要的.
     回复 引用   
  13. #13楼 拉拉[未注册用户]2007-03-19 21:29
    引用上面的话,我们有时候是不是刻意的去强调一些东西了?抛开一些信息发布类网站,我想我们绝大多数同行都在做专业性很强的web应用程序,这部分不能资源共享等等,而且以table布局,我个人认为代码更简单,清晰。
     回复 引用   
  14. #14楼 A.Z[未注册用户]2007-03-19 23:40
    lz的文章必顶
     回复 引用   
  15. #15楼 一抹微蓝      2007-03-20 10:03
    我有div强迫症,的时候用table很好解决的问题,我非要花上很多时间用div,dd,dl,ul等去实现.
     回复 引用 查看   
  16. #16楼 钢盅郭子[未注册用户]2007-03-20 12:24
    只要是布局,就应该用div
    只有数据、表单才需要table
     回复 引用   
  17. #17楼 钢盅郭子[未注册用户]2007-03-20 12:28
    table布局代码简单清晰?
    table兼容性更好?

    无语了
     回复 引用   
  18. #18楼[楼主] Cat Chen      2007-03-20 12:55
    @钢盅郭子
    其实div也不是用来布局的,div只是用来表示语义的,类似的常用元素还有ul、dl、span等等,不过都仅仅是常用元素,不是用来布局的。真正用来布局的是css。
     回复 引用 查看   
  19. #19楼 lwjj      2007-03-20 14:12
    受教育了~~
     回复 引用 查看   
  20. #20楼 Yok      2007-03-21 09:13
    div不是用来布局,只是div具有“一块东西”这样比较笼统的语义,所以网页上一大块的内容大多数都用div作为容器
     回复 引用 查看   
  21. #21楼 钢盅郭子[未注册用户]2007-03-21 09:16
    @Cat Chen

    你说得有道理,深入理解HTML/XHTML之后,就能领会到“语义”的概念
    不过我还是习惯将div的作用按其“默认”语义理解为“区域划分”(类似的,ul作用理解为无序列表)

    区域划分很大程度上决定了页面内容的布局,这也是最直观的理解
     回复 引用   
  22. #22楼 Wisdom-zh      2007-04-10 12:15
    我们目前的做法是:
    将内容放到数据库, 然后编写模版, 自动生成静态页面.
    所以感觉是所有的HTML元素都是用来布局的.
    看样子, 还得抽成三层概念比较好.
     回复 引用 查看   
  23. #23楼 runbin[未注册用户]2007-09-11 15:05
    我们目前的做法是:
    将内容放到数据库, 然后拿Flash模版, 生成SWF.
    所以感觉是所有的HTML元素都是用来镶入SWF的.
    看样子, 还得抽成层和时间线概念比较好.
     回复 引用   
  24. #24楼 琥珀色的微笑[未注册用户]2008-07-07 16:19
    支持支持!楼主写的很好!我学到了很多东西。希望楼主能随便写一些新手向的文章。期待中!
     回复 引用   
  25. #25楼 finaLCode[未注册用户]2008-08-20 10:07
    设计的时候应该脱离一些以前设计的概念,比如在写结构化语句的时候,脑子里就不要掺和进布局的概念,要做的只是考虑将页面元素一个个定义好,用什么样的命名,DIV,TABLE都可以使用,只是DIV只代表一个盒装模型,一个块,TABLE表示的是数据的容器,并不与布局产生关系。布局的事就全交给CSS,这样子的话才能使WEB设计更细更精确
     回复 引用   
  26. #26楼[楼主] Cat Chen      2008-08-20 10:11
    @finaLCode
    Exactly!
     回复 引用 查看