超越起点 追随自由 我想故我所有

我看不见,我的明天,但今天,绝不重复昨天;顺风是滑翔,逆风才是飞翔,火烧过才能化凤凰!

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  346 随笔 :: 16 文章 :: 1578 评论 :: 30 引用

连接
◆《重构之美》总目录
上一篇:重构之美-走在Web标准化设计的路上[唠叨先]
下一篇:重构之美-走在Web标准化设计的路上[振臂一呼:Css, Stop!]


最近突然遭遇许多复杂表单,于是干上了。

一直有种说法:table用于数据表,对于复杂表单,table也是最好的选择,由于一直没有遇见过也就没有认真去研究,到底复杂表单是否应该使用table。

好了,机会来了,我拿着复杂表单的图样,看来看去都觉得不应该用table呀,除非是有行标和列标的数据表表单。反而类似于登陆这种简单表单,我倒是一直使用table,理由是能够在纯文档的时候对齐文本与输入框,但是对于复杂表单就不一样了,复杂表单涉及到页面布局了。

为什么要研究?因为我希望程序员不要涉及到界面的任何部分,对于页面,他只需要关注结构,而复杂表单如果采用table,很容易就将程序员带进对布局的操作中去。

好,经过一阵艰苦奋斗,还算好,xhtml部分自己觉得还算摸清了一些规律,页面的分析信手捻来,div结构下的复杂表单真是漂亮,但是但是……css部分……我靠,真是难搞,干了几个复杂表单的css都没摸清规律,太JB麻烦了,尤其是文本长度不一致,表单控件又各种各样交错,还有错误提示隐藏的文本,时不时中间又加个按钮……迷茫了……算了,继续干css,希望最后能得出结论,对于复杂表单到底用table还是div?

先给一个对于登陆界面这样简单的表单,我最常用的xhtml代码,使用table,理由见上:

<div>
    
<h3><span>用户登陆</span></h3>
    
<table>
        
<tr>
            
<td><label for="name">用户名</label></td>
            
<td><input id="name" />
        
</tr>
        
<tr>
            
<td><label for="pw">密码</label></td>
            
<td><input id="pw" /></td>
        
</tr>
    
</table>
    
<p><button /></p>
</div>

另外不使用table的如下:

<div>
    
<h3><span>用户登陆</span></h3>
    
<div>
       
<label for="name">用户名</label>
       
<input id="name" />
    
</div>
    
<div>
        
<label for="pw">密码</label>
        
<input id="pw" />
    
</div>
    
<p><button /></p>
</div>

怎么说呢?第一种我视这样的简单表单为2行2列数据,用了table。第二种则是div模块化操作。一般我都使用第一种,除非文本长度一样(比如姓名,密码)才用第二种。当然我觉得第二种是正确的,所以我会优先在文案上先做文章使之长度一致。为什么?因为只有模块化,才能固定xhtml而通过css随意布局,比如形式上为一行四列之时,第一种就做不到(其实FF可以正确解释对tr的浮动操作,例如2列tr,但是ie不支持,一个tr怎么都得占table的一行。)。

好了,复杂表单的图样和xhtml部分在公司,明天上班发上,现在睡觉问梦去。

这份表单够份量不?

这里是xhtml部分,做了些必要的删除,没破坏结构就好了。留意我补充的部分,比如h2、h3。

<h1>大便蛔虫的表单标题</h1>
<div>
    
<h2>导航</h2>
    
<div>
        
<button>新增</button>
        
<button>刷新</button>
    
</div>
    
<div>
        
<h3>当前批次采用的标准为</h3>
        
<div>
            
<label>本人补贴</label>
            
<asp:label id="" Runat="server"></asp:label>
        
</div>
        
<div>
            
<label>本人工龄补贴</label>
            
<asp:label id="" Runat="server"></asp:label>
        
</div>
        
<div>
            
<label>配偶补贴</label>
            
<asp:label id="" Runat="server"></asp:label>
        
</div>
        
<div>
            
<label>配偶工龄补贴</label>
            
<asp:label id="" Runat="server"></asp:label>
        
</div>
        
<div>
            
<label>特殊补贴</label>
            
<asp:label id="" Runat="server"></asp:label>
        
</div>
    
</div>
    
<iewc:treeview id="" ExpandLevel="1" runat="server" AutoPostBack="True"></iewc:treeview>
</div>
<div>
    
<h2>表单内容</h2>
    
<div>
        
<h3>申请人信息</h3>
        
<div>
            
<label>本人姓名</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>身份证号码</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>本人工龄(年)</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
            
<asp:regularexpressionvalidator id="REVY" runat="server" Display="Dynamic" ValidationExpression="\d{0,2}" ErrorMessage="必须输入整数"
        ControlToValidate
="txt_WorkAge"></asp:regularexpressionvalidator>
        
</div>
        
<div>
            
<label>工作单位</label>
            
<asp:label id="" Runat="server"></asp:label>
        
</div>
        
<div>
            
<label>职务或职称</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
    
</div>
    
<div class="personinfo">
        
<h3>现住房信息</h3>
        
<div>
            
<label>现住房地址</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>建筑面积(平方米)</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>其中个人按市场价自购面积(平方米)</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>现住房性质</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>补贴住房面积标准(平方米)</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>申请住房补贴理由</label>
            
<asp:dropdownlist id="" Runat="server"></asp:dropdownlist>
        
</div>
        
<div>
            
<label>申请住房补贴标准</label>
            
<asp:radiobuttonlist id="" runat="server" RepeatDirection="Horizontal">
                
<asp:ListItem>无房户一次性补贴</asp:ListItem>
                
<asp:ListItem>一次性补面积差</asp:ListItem>
            
</asp:radiobuttonlist>
        
</div>
    
</div>
    
<div>
        
<h3>配偶信息</h3>
        
<div>
            
<label>配偶姓名</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>配偶身份证号码</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>配偶工龄</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
            
<asp:regularexpressionvalidator id="" runat="server" Display="Dynamic" ValidationExpression="\d{0,2}" ErrorMessage="必须输入整数"
            ControlToValidate
=""></asp:regularexpressionvalidator>
        
</div>
        
<div>
            
<label>配偶工作单位</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>职务或职称:</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
    
</div>
    
<div>
        
<h3>享受住房分配或货币补贴情况</h3>
        
<div>
            
<label>(1)已享受房改购房面积(平方米)</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>(2)已享受购房补贴(元)</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>(3)已享受住房补贴(元)</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<asp:button id="" Text="计算" Runat="server"></asp:button>
            
<label>本次补贴面积(平方米)</label>
            
<cc1:acceptnumber id="" runat="server"></cc1:acceptnumber>
        
</div>
    
</div>
    
<div>
        
<h3>住房补贴</h3>
        
<div>
            
<label>本人补贴(元)</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>本人工龄补贴(元)</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>配偶补贴(元)</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>配偶工龄补贴(元)</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>特殊补贴(元)</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>合计(元)</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>实际发放补贴(元)</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
    
</div>
    
<div>
        
<h3>请申请人根据不同情况填写</h3>
        
<div>
            
<label>现购房地址</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>售房单位</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>偿还贷款帐号</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
        
<div>
            
<label>贷款银行</label>
            
<cc1:xmldropdownlist id="" runat="server" XmlNodeName="" XmlPath=""></cc1:xmldropdownlist>
        
</div>
        
<div>
            
<label>本人公积金存储号</label>
            
<asp:textbox id="" Runat="server"></asp:textbox>
        
</div>
    
</div>
    
<div>
        
<asp:button id="" Text="保存" runat="server" CssClass="button"></asp:button>
        
<asp:Button id="" Text="退回" runat="server" CssClass="button"></asp:Button>
        
<asp:Button id="" Text="删除" runat="server" CssClass="button"></asp:Button>
        
<button id="" onclick="javascript:window.close();">关闭</button>
    
</div>
</div>

再补充一个,这里有两个部分很明显的表格结构,所以在那里使用了table,而其他部分没有用。

table部分xhtml。css部分还没琢磨出来规律,结论没有,继续琢磨,不过感觉没有用table结构很漂亮也很灵活,但是css确实让人头大,权衡得失中,再补充了。

..
            
<div class="personinfo">
                
<h2><span>个人信息</span></h2>
                
<div>
                    
<h3><span>购房人</span></h3>
                    
<table>
                        
<tr>
                            
<td><span>选择</span></td>
                            
<td>姓名</td>
                            
<td>性别</td>
                            
<td>年龄</td>
                            
<td>关系</td>
                            
<td>户籍所在地</td>
                        
</tr>
                        
<tr>
                            
<td><input type="checkbox" /></td>
                            
<td><select /></td>
                            
<td><input /></td>
                            
<td><input /></td>
                            
<td><select /></td>
                            
<td><input /></td>
                        
</tr>
                    
</table>
                
</div>            
                
<div>
                    
<h3><span>家庭成员</span></h3>
                    
<table>
                        
<tr>
                            
<td><span>选择</span></td>
                            
<td>姓名</td>
                            
<td>性别</td>
                            
<td>年龄</td>
                            
<td>关系</td>
                            
<td>户籍所在地</td>
                            
<td>工作单位</td>
                            
<td>编辑</td>
                            
<td>删除</td>
                        
</tr>
                        
<tr>
                            
<td><input type="checkbox" /></td>
                            
<td><select /></td>
                            
<td><input /></td>
                            
<td><input /></td>
                            
<td><input /></td>
                            
<td><input /></td>
                            
<td><input /></td
posted on 2006-02-23 00:34 爆牙齿 阅读(6730) 评论(23)  编辑 收藏 网摘 所属分类: 4、奋斗《重构之美》

评论

#1楼  2006-02-23 09:02 [天道酬勤]      
我以前处理复杂表格多是通过colSpan和rowSpan来配合实现的。
  回复  引用  查看    

曾经做过复杂表单设计器,界面和VB的窗体设计器差不多,后台根据设计信息自动生成格式简单的HTML代码,无table,div,全靠自动生成的空格来排版
  回复  引用    

#3楼  2006-02-23 12:00 NeedForSleep      
我直到现在还一直在用TABLE做表单结构。
对DIV一直不习惯。。。哎。。。

  回复  引用  查看    

我也是
  回复  引用  查看    

#5楼  2006-02-23 23:12 avill      
从模块化方面上来说,当然应该用web标准,就像楼上说的,目前很多小的公司程序员跟界面设计师是同一个人,对于程序员来说,作界面的设计方面是很吃力的,如果再按web标准化来作难度就更大了。跑题了,呵呵。如果我选择还是用div,虽然复杂的表单用table实现起来比较容易一些,但是考虑标准化可以给团队带来好处,给后期的维护工作带来方便,所以更宁愿在前期的时候多花一些时间。多写一些慢慢也会上手的。
  回复  引用  查看    

#6楼  2006-02-24 08:38 子扬's Blog      
呵呵.你完全不熟悉xhtml.
  回复  引用  查看    

#7楼 [楼主] 2006-02-24 08:54 爆牙齿      
@子扬's Blog

你这么说,我真是觉得无地自容,好歹我也用了近2年Web标准了,你说我完全不熟悉,唉,我好像真是浪费时间。

拜托,请指教一下。

  回复  引用  查看    

#8楼  2006-02-25 14:51 雁儿飞飞      
无聊的时候玩拉一把
我玩她的理由是求速度
但是不要刻意去为拉标准而使用xhtml
呵呵
作品:
http://lgwindow.sdut.edu.cn

  回复  引用  查看    

#9楼  2006-02-25 22:36 劲舞团 [未注册用户]
不错。。。收藏了。。。。
  回复  引用    

#10楼  2006-02-27 10:35 畅想自由      
我个人觉得现在确实是个尴尬的时期,但不知道会持续多久。
现在很多美工还都使用全表格布局,当然也包括表单;当页面到我这里后,我又将它全改为了<div>布局,为什么,一是便于程序的编写,二是考虑到以后的重写。以前为了不要如此的麻烦,我曾经狠学了photoshop什么的,但最后因为精力有限,效果并不大,费了半天劲页面还是很丑(hahaha!);为此我决定告诉美工,要最大可能的多使用<div>布局,当然我没提什么“标准”,因为只要客户满意谁也不会去关心那个狗屎标准!说实在的用CSS来布局,如果你还要考虑多种浏览器对web标准的支持度,那么你肯定要发疯!表格就不存在这种问题,即使再复杂的表单它的表现力也是很强的。
但对于程序员来说,当然更喜欢<div> 式的表单,为什么?因为如果有人让你将一个以前用<table>实现的表单修改或改写,你肯定会起火!但如果是div实现的表单你就会更轻松。
最终造成的局面就是:前端表现对标准的支持几乎为零,后端程序员又迫切要支持标准。
幸好没打起来!!

  回复  引用  查看    

#11楼  2006-02-27 23:03 rocman      
“大便蛔虫的表单”,这个是不是寄生虫研究报告?
  回复  引用  查看    

#12楼  2006-03-16 12:42 berlo [未注册用户]
用div的话,表单具有弹性吗?也就是说表单的大小会随着浏览器的大小自动调整吗?谢谢
  回复  引用    

#13楼  2006-03-18 21:17 hellow [未注册用户]
表单的xhtml有了,我想看看css是怎么写的,方便给看看吗?
  回复  引用    

#14楼 [楼主] 2006-03-19 01:16 爆牙齿      
@berlo
这个是固定宽度设计和百分比宽度设计的问题,和用那种标签没有关系。


@hellow
可能比较困难,因为这个表单样式设计穿插在整个系统css设计之中,我说过,不少地方都能部分或全部应用整体样式。其实每个页面都是,所以要提炼出某一个页面的完整样式比较麻烦。而系统css已经达到48k了。

过两天我会给一个完整css,关于这个blog的,或许你会感兴趣。

  回复  引用  查看    

#15楼  2006-03-23 20:25 hellow [未注册用户]
好,谢谢,谢谢。我就是想看看是不是为了控制表单的定位需要定义很多的类。定义每个输入框的宽度,填充值和补白之类的。因为我想不出什么好的方法既定义的少,又能让他们挨个对齐和整齐。
  回复  引用    

请教:用XHTML标准建的比较好的中文网站有哪些?我们如何鉴别?
谢谢。
本人邮箱 zhangjs@heinfo.net

  回复  引用    

好文章!
  回复  引用    

#18楼  2007-01-29 11:14 owla [未注册用户]
@xdesigner_aaaaaaaaaaa
表单设计器这种东西,的确让人头疼,本人也在做,用.net进行开发,,跟你采用类似的思路,不知道能否跟你请教些问题,本人msn :owla_99@hotmail.com.

  回复  引用    

#19楼  2007-05-01 07:25 jackl [未注册用户]
对于楼主贴出来的代码
我不敢苟同你对div的理解
其实我不用表格,不用div,用p元素,br元素,span元素一样可以做的很好
同时也更容易理解
div只是用来布局,而p、br等才是内容块的划分

希望楼主能明白这一点

  回复  引用    

我对表单中的input标签的定义习惯是:
form input{外观,不包括长宽}
.inputstyle1{长宽,特殊定义}
.inputstyle2{长宽,特殊定义}
.inputstyle3{长宽,特殊定义}
.inputstyle4{长宽,特殊定义}

不过对于布局,同样觉得很棘手.

  回复  引用    

#21楼  2007-05-28 21:01 game10000 [未注册用户]
css确实让人头大,同感!
  回复  引用    

@[天道酬勤]
那不就是表格的单元格的拆分合并么
我习惯用表格布局 这么复杂的表单用div会想破脑袋

  回复  引用    

#23楼  2008-07-20 09:42 一他他      
你好,我是一个初学者,一直在不断的学习中,但在学习中发现很多翻译的外国书,太不适合我啦,所以就在一直找国人原创的系列教程,收集起来放在我的小站上,呵呵,所以想转载一下你的文章到我的小站上,更希望有和我一样烦恼的人解决这个苦恼.(不好意思,我已经转了)
  回复  引用  查看    


发表评论



姓名 [登录] [注册] 
主页
Email (仅博主可见) 
验证码 *  验证码看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论   新用户注册   返回页首      

导航: 网站首页 社区 新闻 博问 闪存 网摘 招聘 .NET频道 知识库 找找看 Google站内搜索



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务

相关文章:

相关链接: