您的第一個表單

本系列中的第一篇文章為您提供了建立 Web 表單的第一個體驗,包括設計簡單表單、使用正確的 HTML 表單控制元件和其他 HTML 元素實施表單、透過 CSS 新增一些非常簡單的樣式,以及描述資料如何傳送到伺服器。我們將在本模組的後面更詳細地擴充套件這些子主題。

先決條件 HTML 的基本瞭解。
目標 熟悉什麼是 Web 表單,它們用於什麼,如何設計它們以及簡單情況下所需的基本 HTML 元素。

什麼是 Web 表單?

Web 表單是使用者與網站或應用程式之間互動的主要方式之一。表單允許使用者輸入資料,這些資料通常會發送到 Web 伺服器進行處理和儲存(請參閱本模組後面的 傳送表單資料),或者在客戶端使用以立即以某種方式更新介面(例如,將另一個專案新增到列表中,或顯示或隱藏 UI 功能)。

Web 表單的 HTML 由一個或多個表單控制元件(有時稱為小部件)以及一些額外的元素組成,以幫助構建整個表單 - 它們通常被稱為HTML 表單。控制元件可以是單行或多行文字欄位、下拉框、按鈕、複選框或單選按鈕,主要使用 <input> 元素建立,儘管也有一些其他元素需要學習。

表單控制元件也可以程式設計為強制輸入特定格式或值(表單驗證),並與文字標籤配對,這些文字標籤描述了它們對視力正常和視力障礙使用者的目的。

設計您的表單

在開始編寫程式碼之前,最好先退一步,花時間考慮一下您的表單。設計一個快速的模型將有助於您定義要向用戶詢問的資料集。從使用者體驗 (UX) 的角度來看,重要的是要記住,表單越大,您越有可能讓使用者感到沮喪並失去使用者。保持簡單並專注:只詢問您絕對需要的資料。

設計表單是構建網站或應用程式時一個重要的步驟。本文不打算涵蓋表單的使用者體驗,但如果您想深入瞭解該主題,請閱讀以下文章。

在本文中,我們將構建一個簡單的聯絡表單。讓我們先做一個粗略的草圖。

The form to build, roughly sketch

我們的表單將包含三個文字欄位和一個按鈕。我們要求使用者輸入他們的姓名、電子郵件以及他們要傳送的訊息。點選按鈕將把他們的資料傳送到 Web 伺服器。

主動學習:實施我們的表單 HTML

好的,讓我們嘗試建立表單的 HTML。我們將使用以下 HTML 元素:<form><label><input><textarea><button>

在繼續之前,請在本地複製我們的 簡單 HTML 模板 - 您將在其中輸入您的表單 HTML。

<form> 元素

所有表單都以 <form> 元素開頭,如下所示。

html
<form action="/my-handling-form-page" method="post"></form>

此元素正式定義了表單。它是一個容器元素,就像 <section><footer> 元素一樣,但專門用於包含表單;它還支援一些特定屬性來配置表單的行為方式。所有屬性都是可選的,但標準做法是始終至少設定 actionmethod 屬性。

  • action 屬性定義了表單收集的資料在提交時應該傳送到的位置(URL)。
  • method 屬性定義了用於傳送資料的 HTTP 方法(通常是getpost)。

注意: 我們將在後面的 傳送表單資料 文章中瞭解這些屬性的工作原理。

現在,將上面的 <form> 元素新增到 HTML <body> 中。

<label><input><textarea> 元素

我們的聯絡表單並不複雜:資料輸入部分包含三個文字欄位,每個欄位都有一個相應的 <label>

在 HTML 程式碼方面,我們需要類似以下內容來實現這些表單小部件。

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 屬性,如下所示。

html
<input type="text" value="by default this element is filled with this text" />

另一方面,如果您想為 <textarea> 定義一個預設值,請將其放在 <textarea> 元素的開始和結束標籤之間,如下所示。

html
<textarea>
by default this element is filled with this text
</textarea>

<button> 元素

表單的標記幾乎完成了;我們只需要新增一個按鈕,以便使用者在填寫完表單後可以傳送或“提交”他們的資料。這可以透過使用 <button> 元素來完成;將以下內容新增到結束</ul> 標籤的正上方。

html
<li class="button">
  <button type="submit">Send your message</button>
</li>

<button> 元素還接受type 屬性 - 此屬性接受三個值之一:submitresetbutton

  • 點選submit 按鈕(預設值)會將表單資料傳送到 <form> 元素的action 屬性定義的網頁。
  • 點選reset 按鈕會立即將所有表單小部件重置為其預設值。從 UX 的角度來看,這被認為是不好的做法,因此您應該避免使用這種型別的按鈕,除非您確實有充分的理由包含一個。
  • 點選button 按鈕不會做任何事!這聽起來很愚蠢,但它對於構建自定義按鈕非常有用 - 您可以在 JavaScript 中定義它們的選定功能。

注意: 您還可以使用具有相應type<input> 元素來生成按鈕,例如<input type="submit"><button> 元素的主要優點是 <input> 元素僅允許在標籤中使用純文字,而 <button> 元素允許使用完整的 HTML 內容,從而允許更復雜、更有創意的按鈕內容。

基本表單樣式

現在您已完成表單 HTML 程式碼的編寫,請嘗試儲存它並在瀏覽器中檢視它。目前,您會發現它看起來很醜。

注意: 如果您認為自己的 HTML 程式碼不正確,請嘗試將其與我們的完成示例進行比較 - 請參閱 first-form.html也請檢視它線上執行的效果)。

表單以其難以精美地設定樣式而聞名。本文不打算詳細講解表單樣式,因此現在我們將只讓您新增一些 CSS 以使其看起來不錯。

首先,將 <style> 元素新增到您的頁面,位於 HTML 的頭部。它應該如下所示。

html
<style></style>

style 標籤中,新增以下 CSS。

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> 元素透過 actionmethod 屬性定義了資料傳送的位置和方式。

我們為每個表單控制元件提供了一個name 屬性。名稱在客戶端和伺服器端都很重要;它們告訴瀏覽器為每個資料部分指定哪個名稱,並且在伺服器端,它們允許伺服器按名稱處理每個資料部分。表單資料以名稱/值對的形式傳送到伺服器。

要為表單中的資料命名,需要在每個收集特定資料的表單小部件上使用name屬性。讓我們再看一些表單程式碼。

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>

在本例中,表單將傳送 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# 等) 都擁有自己的表單資料處理機制。本指南不深入探討這個主題,但如果您想了解更多資訊,我們在後面的 傳送表單資料 文章中提供了一些示例。

總結

恭喜您,您已經構建了第一個 Web 表單。它看起來是這樣的

但這僅僅是開始——現在是時候深入研究了。表單比我們這裡看到的強大得多,本模組中的其他文章將幫助您掌握其餘內容。

高階主題