2005年06月3日
CSS 技巧:表單
表單一直是網頁設計裡,一門重大的學問。這裡介紹大家一些簡單的表單設計技巧,希望對大家有所幫助。
表單的邊界問題
在多數瀏覽器預設的表單樣式,會讓表單上下會有一小塊空間,如下所示:

原始碼如下:
<form name="form1" id="form1" method="post" action="">
<table width="400" border="1">
<tr>
<td>文 字 欄 位 1</td>
<td><input type="text" name="text1" /></td>
</tr>
<tr>
<td>文字欄位2</td>
<td><input type="text" name="text2" /></td>
</tr>
<tr>
<td valign="top">多行文字欄位</td>
<td><textarea name="text3" cols="25" rows="10"></textarea></td>
</tr>
</table>
</form>
所以一般在設計表單時,都會像上面這樣利用表格來編排輸入欄位,再將 <form> 標籤藏在 <table> 裡,如下:
<table width="400" border="1">
<form name="form1" id="form1" method="post" action="">
<tr>
<td>文 字 欄 位 1</td>
<td><input type="text" name="text1" /></td>
</tr>
<tr>
<td>文字欄位2</td>
<td><input type="text" name="text2" /></td>
</tr>
<tr>
<td valign="top">多行文字欄位</td>
<td><textarea name="text3" cols="25" rows="10"></textarea></td>
</tr>
</form>
</table>
但是這不符合 W3C 的標準,而且在 Dreamweaver 編輯時,也不容易點選表單。
透過 CSS ,我們能夠很容易地解決這個問題,我們只需設定:
<form name="form1" id="form1" method="post" action="" style="margin: 0;">
<table width="400" border="1">
<tr>
<td>文 字 欄 位 1</td>
<td><input type="text" name="text1" /></td>
</tr>
<tr>
<td>文字欄位2</td>
<td><input type="text" name="text2" /></td>
</tr>
<tr>
<td valign="top">多行文字欄位</td>
<td><textarea name="text3" cols="25" rows="10"></textarea></td>
</tr>
</table>
</form>
如果要讓整個網站的表單都能依此規則作用,那麼我們僅需在共用的 CSS 檔案裡加入:
form {
margin: 0;
}
但是除非必要,否則大多數情況還是不建議大家使用表格來編排輸入欄位。
用 CSS 來編排輸入欄位
不過不使用表格的話,怎麼做表單的排版呢?
我們利用 <p> 標籤和 <label> 標籤來完成這項任務,如下所示:
<form name="form1" id="form1" method="post" action="">
<p>
<label for="text1">文 字 欄 位 1</label>
<input type="text" name="text1" id="text1" accesskey="1" />
</p>
<p>
<label for="text2">文字欄位2</label>
<input type="text" name="text2" id="text2" accesskey="2" />
</p>
<p>
<label for="text3">多行文字欄位</label>
<textarea name="text3" id="text3" cols="40" rows="10" accesskey="3"></textarea>
</p>
</form>
實際上的畫面如下圖:
當然這樣標籤並沒有對齊,所以我們透過 CSS 來搞定它。
首先當然是把 <form> 的邊界去除:
form {
margin: 0;
}
接著,我們讓 <label> 變成浮動,並固定它的寬度為 100px ,當然你可以視你的標籤文字寬度來決定。
form label {
float: left;
width: 100px;
}
最後,為了不讓接下來的輸入欄位被上一層的浮動 <label> 影響,我們再設定 <form> 裡的 <p> 標籤:
form p {
clear: both;
}
這樣一來,就如下圖所示:

是不是很簡單呢?
當然,除了不用表格之外,這樣的表單我還加上點選文字標籤 <label> ,或是利用鍵盤上的 [ALT] 加上數字鍵,就能夠將輸入焦點自動放到對應的 <input> 欄位上。這些都是無障礙網頁規範裡的一小部份,大家可以多多留意喔。
回應文章 
像前輩你的這個做法好像還不錯...但如果要把元素橫向排列呢??因為我試了一下..大概功力不足..沒有辦法做到用表格一樣漂亮
Posted by 王惠治
at 2005年11月25日 10:40
橫向排列?不太懂你的意思?
舉個例子看看吧。
另外有時候需要用到表格時,還是可以用。像是比較複雜的填表頁,只要按照標準的 XHTML 規範製作,表格還是有它的好處的 (只要不是拿來安排畫面結構就行了) 。
舉個例子看看吧。
另外有時候需要用到表格時,還是可以用。像是比較複雜的填表頁,只要按照標準的 XHTML 規範製作,表格還是有它的好處的 (只要不是拿來安排畫面結構就行了) 。
Posted by jaceju
at 2005年11月25日 13:51
其實前輩已經抓到我所說的了~~~
得你的指點我大概也略懂一二了!謝謝啊~
得你的指點我大概也略懂一二了!謝謝啊~
Posted by 王惠治
at 2005年11月26日 23:28
1.我稍微試了一下,<form>有邊界是在ie才有,ff下就沒有,不過為了滿足這兩個瀏覽器,還是得加下去><"
2.另外我建議用<div>代替<p>,<p>原意畢竟是使用在文字上面的一個段落,而我們只需要一個block包住,所以我建議用<div>代替<p>。
3.您說必須加上p {clear:both;},試了一下,似乎不用,因為上下都是block element所以即使不加 clear:both;,下面的block element也不會跑上去。
以下是我稍微改過的的樣式,給您參考看看,如果有錯,歡迎指教^^
<form style="margin:0;">
<div style="margin-bottom:10px;">
<label style="width:100px; float:left; text-align:center;">文字欄位1</label>
<input type="text" style="vertical-align:middle; margin-left:5px; padding:0;" />
</div>
<div style="margin-bottom:10px;">
<label style="width:100px; float:left; text-align:center;">文字欄位2</label>
<input type="text" style="vertical-align:middle; margin-left:5px; padding:0;" />
</div>
<div style="margin-bottom:10px;">
<label style="width:100px; float:left; text-align:center;">多行文字欄位</label>
<textarea cols="40" rows="10" style="margin:0 auto 0 5px; vertical-align:middle; padding:0;"></textarea>
</div>
</form>
2.另外我建議用<div>代替<p>,<p>原意畢竟是使用在文字上面的一個段落,而我們只需要一個block包住,所以我建議用<div>代替<p>。
3.您說必須加上p {clear:both;},試了一下,似乎不用,因為上下都是block element所以即使不加 clear:both;,下面的block element也不會跑上去。
以下是我稍微改過的的樣式,給您參考看看,如果有錯,歡迎指教^^
<form style="margin:0;">
<div style="margin-bottom:10px;">
<label style="width:100px; float:left; text-align:center;">文字欄位1</label>
<input type="text" style="vertical-align:middle; margin-left:5px; padding:0;" />
</div>
<div style="margin-bottom:10px;">
<label style="width:100px; float:left; text-align:center;">文字欄位2</label>
<input type="text" style="vertical-align:middle; margin-left:5px; padding:0;" />
</div>
<div style="margin-bottom:10px;">
<label style="width:100px; float:left; text-align:center;">多行文字欄位</label>
<textarea cols="40" rows="10" style="margin:0 auto 0 5px; vertical-align:middle; padding:0;"></textarea>
</div>
</form>
Posted by hsiang
at 2006年03月28日 19:08
關於第二點,我想要的語意就是一個段落一個欄位沒錯,這點倒是不用過於去校正它。
另外不要太相信某個瀏覽器或是建議的標準規格 (因為總是會有例外) ,加上 clear:both 是種安全的作法。
最後除非必要 (像是寄送電子報) ,否則儘可能不要使用行內樣式,那和你用 font 標籤沒什麼兩樣。
另外不要太相信某個瀏覽器或是建議的標準規格 (因為總是會有例外) ,加上 clear:both 是種安全的作法。
最後除非必要 (像是寄送電子報) ,否則儘可能不要使用行內樣式,那和你用 font 標籤沒什麼兩樣。
Posted by jaceju
at 2006年03月28日 21:53
ㄚ阿..還有這邊的圖圖@@"少了圖就事倍功半嚕><
3Q^^
3Q^^
Posted by 娃娃
at 2006年11月8日 17:27
To 娃娃:
處理了。
處理了。
Posted by jaceju
at 2006年11月8日 17:34
