您的第一個表單
本系列中的第一篇文章為您提供了建立 Web 表單的第一個體驗,包括設計簡單表單、使用正確的 HTML 表單控制元件和其他 HTML 元素實施表單、透過 CSS 新增一些非常簡單的樣式,以及描述資料如何傳送到伺服器。我們將在本模組的後面更詳細地擴充套件這些子主題。
| 先決條件 | 對 HTML 的基本瞭解。 |
|---|---|
| 目標 | 熟悉什麼是 Web 表單,它們用於什麼,如何設計它們以及簡單情況下所需的基本 HTML 元素。 |
什麼是 Web 表單?
Web 表單是使用者與網站或應用程式之間互動的主要方式之一。表單允許使用者輸入資料,這些資料通常會發送到 Web 伺服器進行處理和儲存(請參閱本模組後面的 傳送表單資料),或者在客戶端使用以立即以某種方式更新介面(例如,將另一個專案新增到列表中,或顯示或隱藏 UI 功能)。
Web 表單的 HTML 由一個或多個表單控制元件(有時稱為小部件)以及一些額外的元素組成,以幫助構建整個表單 - 它們通常被稱為HTML 表單。控制元件可以是單行或多行文字欄位、下拉框、按鈕、複選框或單選按鈕,主要使用 <input> 元素建立,儘管也有一些其他元素需要學習。
表單控制元件也可以程式設計為強制輸入特定格式或值(表單驗證),並與文字標籤配對,這些文字標籤描述了它們對視力正常和視力障礙使用者的目的。
設計您的表單
在開始編寫程式碼之前,最好先退一步,花時間考慮一下您的表單。設計一個快速的模型將有助於您定義要向用戶詢問的資料集。從使用者體驗 (UX) 的角度來看,重要的是要記住,表單越大,您越有可能讓使用者感到沮喪並失去使用者。保持簡單並專注:只詢問您絕對需要的資料。
設計表單是構建網站或應用程式時一個重要的步驟。本文不打算涵蓋表單的使用者體驗,但如果您想深入瞭解該主題,請閱讀以下文章。
- Smashing Magazine 有些關於表單 UX 的 優秀文章,包括一篇較舊但仍然相關的 《Web 表單可用性指南》 文章。
- UXMatters 也是一個非常有見地的資源,提供從 基本最佳實踐 到諸如 多頁表單 等複雜問題的好建議。
在本文中,我們將構建一個簡單的聯絡表單。讓我們先做一個粗略的草圖。
我們的表單將包含三個文字欄位和一個按鈕。我們要求使用者輸入他們的姓名、電子郵件以及他們要傳送的訊息。點選按鈕將把他們的資料傳送到 Web 伺服器。
主動學習:實施我們的表單 HTML
好的,讓我們嘗試建立表單的 HTML。我們將使用以下 HTML 元素:<form>、<label>、<input>、<textarea> 和 <button>。
在繼續之前,請在本地複製我們的 簡單 HTML 模板 - 您將在其中輸入您的表單 HTML。
<form> 元素
所有表單都以 <form> 元素開頭,如下所示。
<form action="/my-handling-form-page" method="post">…</form>
此元素正式定義了表單。它是一個容器元素,就像 <section> 或 <footer> 元素一樣,但專門用於包含表單;它還支援一些特定屬性來配置表單的行為方式。所有屬性都是可選的,但標準做法是始終至少設定 action 和 method 屬性。
action屬性定義了表單收集的資料在提交時應該傳送到的位置(URL)。method屬性定義了用於傳送資料的 HTTP 方法(通常是get或post)。
注意: 我們將在後面的 傳送表單資料 文章中瞭解這些屬性的工作原理。
<label>、<input> 和 <textarea> 元素
我們的聯絡表單並不複雜:資料輸入部分包含三個文字欄位,每個欄位都有一個相應的 <label>。
- 名稱的輸入欄位是一個 單行文字欄位。
- 電子郵件的輸入欄位是 型別為電子郵件的輸入:一個單行文字欄位,只接受電子郵件地址。
- 訊息的輸入欄位是一個
<textarea>;一個多行文字欄位。
在 HTML 程式碼方面,我們需要類似以下內容來實現這些表單小部件。
<form action="/my-handling-form-page" method="post">
<ul>
<li>
<label for="name">Name:</label>
<input type="text" id="name" name="user_name" />
</li>
<li>
<label for="mail">Email:</label>
<input type="email" id="mail" name="user_email" />
</li>
<li>
<label for="msg">Message:</label>
<textarea id="msg" name="user_message"></textarea>
</li>
</ul>
</form>
更新您的表單程式碼以使其看起來像上面一樣。
<li> 元素用於方便地構建程式碼並使樣式更輕鬆(請參閱本文後面的內容)。為了提高可用性和可訪問性,我們在每個表單控制元件中包含一個顯式標籤。請注意在所有 <label> 元素上的 for 屬性的使用,該屬性的值是與其關聯的表單控制元件的 id - 這就是您將表單控制元件與其標籤關聯起來的方式。
這樣做有很多好處 - 它將標籤與表單控制元件關聯起來,使滑鼠、觸控板和觸控裝置使用者能夠點選標籤以啟用相應的控制元件,並且它還為螢幕閱讀器提供了可訪問的名稱以向其使用者朗讀。您將在 如何構建 Web 表單 中找到有關表單標籤的更多詳細資訊。
在 <input> 元素上,最重要的屬性是type 屬性。此屬性非常重要,因為它定義了 <input> 元素的外觀和行為方式。您將在後面的 基本原生表單控制元件 文章中瞭解有關此屬性的更多資訊。
- 在我們的簡單示例中,我們對第一個輸入使用 text 值 - 此屬性的預設值。它表示一個基本的單行文字欄位,可以接受任何型別的文字輸入。
- 對於第二個輸入,我們使用 email 值,它定義了一個單行文字欄位,該欄位只接受格式良好的電子郵件地址。這將一個基本的文字欄位變成一個“智慧”欄位,該欄位將對使用者鍵入的資料執行一些驗證檢查。它還會在具有動態鍵盤的裝置(如智慧手機)上導致更合適的電子郵件地址輸入鍵盤佈局(例如,預設情況下帶有 @ 符號)。您將在後面的 客戶端表單驗證 文章中瞭解有關表單驗證的更多資訊。
最後但並非最不重要的一點是,請注意<input> 與 <textarea></textarea> 的語法。這是 HTML 中的怪異之處之一。<input> 標籤是一個 空元素,這意味著它不需要結束標籤。 <textarea> 不是空元素,這意味著它應該用正確的結束標籤關閉。這對錶單的特定功能有影響:定義預設值的方式。要定義 <input> 元素的預設值,您必須使用 value 屬性,如下所示。
<input type="text" value="by default this element is filled with this text" />
另一方面,如果您想為 <textarea> 定義一個預設值,請將其放在 <textarea> 元素的開始和結束標籤之間,如下所示。
<textarea>
by default this element is filled with this text
</textarea>
<button> 元素
表單的標記幾乎完成了;我們只需要新增一個按鈕,以便使用者在填寫完表單後可以傳送或“提交”他們的資料。這可以透過使用 <button> 元素來完成;將以下內容新增到結束</ul> 標籤的正上方。
<li class="button">
<button type="submit">Send your message</button>
</li>
<button> 元素還接受type 屬性 - 此屬性接受三個值之一:submit、reset 或 button。
- 點選
submit按鈕(預設值)會將表單資料傳送到<form>元素的action屬性定義的網頁。 - 點選
reset按鈕會立即將所有表單小部件重置為其預設值。從 UX 的角度來看,這被認為是不好的做法,因此您應該避免使用這種型別的按鈕,除非您確實有充分的理由包含一個。 - 點選
button按鈕不會做任何事!這聽起來很愚蠢,但它對於構建自定義按鈕非常有用 - 您可以在 JavaScript 中定義它們的選定功能。
基本表單樣式
現在您已完成表單 HTML 程式碼的編寫,請嘗試儲存它並在瀏覽器中檢視它。目前,您會發現它看起來很醜。
注意: 如果您認為自己的 HTML 程式碼不正確,請嘗試將其與我們的完成示例進行比較 - 請參閱 first-form.html(也請檢視它線上執行的效果)。
表單以其難以精美地設定樣式而聞名。本文不打算詳細講解表單樣式,因此現在我們將只讓您新增一些 CSS 以使其看起來不錯。
首先,將 <style> 元素新增到您的頁面,位於 HTML 的頭部。它應該如下所示。
<style>
…
</style>
在style 標籤中,新增以下 CSS。
body {
/* Center the form on the page */
text-align: center;
}
form {
display: inline-block;
/* Form outline */
padding: 1em;
border: 1px solid #ccc;
border-radius: 1em;
}
ul {
list-style: none;
padding: 0;
margin: 0;
}
form li + li {
margin-top: 1em;
}
label {
/* Uniform size & alignment */
display: inline-block;
min-width: 90px;
text-align: right;
}
input,
textarea {
/* To make sure that all text fields have the same font settings
By default, textareas have a monospace font */
font: 1em sans-serif;
/* Uniform text field size */
width: 300px;
box-sizing: border-box;
/* Match form field borders */
border: 1px solid #999;
}
input:focus,
textarea:focus {
/* Additional highlight for focused elements */
border-color: #000;
}
textarea {
/* Align multiline text fields with their labels */
vertical-align: top;
/* Provide space to type some text */
height: 5em;
}
.button {
/* Align buttons with the text fields */
padding-left: 90px; /* same size as the label elements */
}
button {
/* This extra margin represent roughly the same space as the space
between the labels and their text fields */
margin-left: 0.5em;
}
儲存並重新載入,您會看到您的表單應該看起來不那麼醜了。
注意: 您可以在 GitHub 上找到我們的版本,位於 first-form-styled.html(也請檢視它線上執行的效果)。
將表單資料傳送到您的 Web 伺服器
最後也是最棘手的一步是在伺服器端處理表單資料。<form> 元素透過 action 和 method 屬性定義了資料傳送的位置和方式。
我們為每個表單控制元件提供了一個name 屬性。名稱在客戶端和伺服器端都很重要;它們告訴瀏覽器為每個資料部分指定哪個名稱,並且在伺服器端,它們允許伺服器按名稱處理每個資料部分。表單資料以名稱/值對的形式傳送到伺服器。
要為表單中的資料命名,需要在每個收集特定資料的表單小部件上使用name屬性。讓我們再看一些表單程式碼。
<form action="/my-handling-form-page" method="post">
<ul>
<li>
<label for="name">Name:</label>
<input type="text" id="name" name="user_name" />
</li>
<li>
<label for="mail">Email:</label>
<input type="email" id="mail" name="user_email" />
</li>
<li>
<label for="msg">Message:</label>
<textarea id="msg" name="user_message"></textarea>
</li>
…
</ul>
</form>
在本例中,表單將傳送 3 個名為 "user_name"、"user_email" 和 "user_message" 的資料。這些資料將使用 HTTP POST 方法傳送到 URL "/my-handling-form-page"。
在伺服器端,URL "/my-handling-form-page" 上的指令碼將接收資料,資料以包含在 HTTP 請求中的 3 個鍵值對列表的形式出現。此指令碼處理這些資料的方式由您決定。每種伺服器端語言 (PHP、Python、Ruby、Java、C# 等) 都擁有自己的表單資料處理機制。本指南不深入探討這個主題,但如果您想了解更多資訊,我們在後面的 傳送表單資料 文章中提供了一些示例。