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 的表單示意圖

當然這樣標籤並沒有對齊,所以我們透過 CSS 來搞定它。

首先當然是把 <form> 的邊界去除:

form {
  margin: 0;
}

接著,我們讓 <label> 變成浮動,並固定它的寬度為 100px ,當然你可以視你的標籤文字寬度來決定。

form label {
  float: left;
  width: 100px;
}

最後,為了不讓接下來的輸入欄位被上一層的浮動 <label> 影響,我們再設定 <form> 裡的 <p> 標籤:

form p {
  clear: both;
}

這樣一來,就如下圖所示:

套用 CSS 後的表單示意圖

是不是很簡單呢?

當然,除了不用表格之外,這樣的表單我還加上點選文字標籤 <label> ,或是利用鍵盤上的 [ALT] 加上數字鍵,就能夠將輸入焦點自動放到對應的 <input> 欄位上。這些都是無障礙網頁規範裡的一小部份,大家可以多多留意喔。



Posted by jaceju at 樂多Roodo! │17:42 │CSS
樂多分類:網路/3C 共同主題:CSS設計排版 工具:編輯本文
Ads by Roodo! 
回應文章
像前輩你的這個做法好像還不錯...但如果要把元素橫向排列呢??因為我試了一下..大概功力不足..沒有辦法做到用表格一樣漂亮
Posted by 王惠治 at 2005年11月25日 10:40
橫向排列?不太懂你的意思?
舉個例子看看吧。

另外有時候需要用到表格時,還是可以用。像是比較複雜的填表頁,只要按照標準的 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>
Posted by hsiang at 2006年03月28日 19:08
關於第二點,我想要的語意就是一個段落一個欄位沒錯,這點倒是不用過於去校正它。

另外不要太相信某個瀏覽器或是建議的標準規格 (因為總是會有例外) ,加上 clear:both 是種安全的作法。

最後除非必要 (像是寄送電子報) ,否則儘可能不要使用行內樣式,那和你用 font 標籤沒什麼兩樣。
Posted by jaceju at 2006年03月28日 21:53
ㄚ阿..還有這邊的圖圖@@"少了圖就事倍功半嚕><
3Q^^
Posted by 娃娃 at 2006年11月8日 17:27
To 娃娃:

處理了。
Posted by jaceju at 2006年11月8日 17:34