基礎原生表單控制元件

上一篇文章中,我們標記了一個功能性的網頁表單示例,介紹了一些表單控制元件和常見的結構元素,並重點關注了無障礙訪問最佳實踐。接下來,我們將詳細瞭解不同表單控制元件(或小部件)的功能——研究所有可用於收集不同型別資料的選項。在這篇文章中,我們將重點介紹最初的表單控制元件集,這些控制元件從網頁的早期就開始在所有瀏覽器中提供。

先決條件 對 HTML 的基本瞭解
目標 詳細瞭解瀏覽器中可用於收集資料的原始本地表單小部件集,以及如何使用 HTML 實現它們。

您已經遇到了一些表單元素,包括<form><fieldset><legend><textarea><label><button><input>。本文涵蓋

注意:我們在接下來的兩篇文章中介紹了更多功能強大的表單控制元件。如果您需要更高階的參考,請查閱我們的HTML 表單元素參考,尤其是我們廣泛的<input> 型別參考。

文字輸入欄位

文字<input>欄位是最基本的表單小部件。它們是讓使用者輸入任何型別資料的非常便捷的方式,我們已經看到了一些簡單的示例。

注意:HTML 表單文字欄位是簡單的純文字輸入控制元件。這意味著您無法使用它們執行富文字編輯(粗體、斜體等)。您遇到的所有富文字編輯器都是使用 HTML、CSS 和 JavaScript 建立的自定義小部件。

所有基本文字控制元件都共享一些共同的行為

  • 它們可以標記為readonly(使用者無法修改輸入值,但它仍然與表單的其他資料一起傳送)或disabled(輸入值無法修改,並且永遠不會與表單的其他資料一起傳送)。
  • 它們可以有一個placeholder;這是出現在文字輸入框內的文字,用於簡要描述框的目的。
  • 它們可以在size(框的物理大小)和maxlength(可以輸入到框中的最大字元數)方面受到限制。
  • 它們可以從拼寫檢查中受益(使用spellcheck屬性)。

注意:<input>元素在 HTML 元素中是獨一無二的,因為它可以根據其type屬性值採用多種形式。它用於建立大多數型別的表單小部件,包括單行文字欄位、時間和日期控制元件、不帶文字輸入的控制元件(如複選框、單選按鈕和顏色選擇器)以及按鈕。

單行文字欄位

單行文字欄位是使用<input>元素建立的,其type屬性值設定為text,或者完全省略type屬性(text是預設值)。如果為type屬性指定的值瀏覽器未知(例如,如果您指定type="color"並且瀏覽器不支援本地顏色選擇器),則此屬性的text值也是回退值。

注意:您可以在 GitHub 上找到所有單行文字欄位型別的示例,網址為single-line-text-fields.html也可以線上檢視)。

這是一個基本的單行文字欄位示例

html
<input type="text" id="comment" name="comment" value="I'm a text field" />

單行文字欄位只有一個真正的限制:如果您鍵入帶有換行符的文字,瀏覽器會在將資料傳送到伺服器之前刪除這些換行符。

下面的螢幕截圖顯示了文字輸入在預設、聚焦和停用狀態下的狀態。大多數瀏覽器使用控制元件周圍的焦點環指示聚焦狀態,並使用灰色文字或褪色/半透明控制元件指示停用狀態。

Screenshot of the default, focused and disabled states text input in Chrome on macOS

本文件中使用的螢幕截圖是在 macOS 上的 Chrome 瀏覽器中拍攝的。這些欄位/按鈕在不同瀏覽器之間可能存在細微差異,但基本的高亮顯示技術仍然相似。

注意:我們將在下一篇文章HTML5 輸入型別中討論type屬性的值,這些值強制執行特定的驗證約束,包括顏色、電子郵件和 URL 輸入型別。

密碼欄位

原始輸入型別之一是password文字欄位型別

html
<input type="password" id="pwd" name="pwd" />

以下螢幕截圖顯示了密碼輸入欄位,其中每個輸入字元都顯示為一個點。

Password field in chrome 115 on macOS

password值不會對輸入的文字新增任何特殊約束,但它確實會隱藏輸入到欄位中的值(例如,使用點或星號),因此其他人無法輕鬆讀取。

請記住,這只是一個使用者介面功能;除非您安全地提交表單,否則它將以純文字形式傳送,這對安全性不利——惡意方可能會攔截您的資料並竊取密碼、信用卡詳細資訊或您提交的任何其他內容。保護使用者免受此影響的最佳方法是透過安全連線(即位於https://地址)託管包含表單的任何頁面,以便在傳送資料之前對其進行加密。

瀏覽器認識到透過不安全連線傳送表單資料的安全隱患,並提供警告以阻止使用者使用不安全的表單。有關 Firefox 實現內容的更多資訊,請參閱不安全的密碼

隱藏內容

另一個原始文字控制元件是hidden輸入型別。它用於建立對使用者不可見的表單控制元件,但在提交後仍會與表單的其他資料一起傳送到伺服器——例如,您可能希望向伺服器提交一個時間戳,說明訂單何時下達。由於它是隱藏的,使用者無法看到或有意編輯該值,它永遠不會獲得焦點,螢幕閱讀器也不會注意到它。

html
<input type="hidden" id="timestamp" name="timestamp" value="1286705410" />

如果建立此類元素,則需要設定其namevalue屬性。可以透過 JavaScript 動態設定該值。hidden輸入型別不應具有關聯的標籤。

其他文字輸入型別,如searchurltel,將在下一教程HTML5 輸入型別中介紹。

可選中專案:複選框和單選按鈕

可選中專案是可以透過單擊它們或其關聯標籤來更改其狀態的控制元件。可選中專案有兩種:複選框和單選按鈕。兩者都使用checked屬性來指示小部件預設是否選中。

值得注意的是,這些小部件的行為與其他表單小部件並不完全相同。對於大多數表單小部件,一旦提交表單,所有具有name屬性的小部件都會發送,即使未填寫任何值。對於可選中專案,只有在選中時才會傳送其值。如果未選中,則不會發送任何內容,甚至不會發送其名稱。如果選中但沒有值,則會發送名稱,其值為on

注意:您可以在 GitHub 上找到本節中的示例,網址為checkable-items.html也可以線上檢視)。

為了獲得最大的可用性和可訪問性,建議您將每個相關專案列表都包含在<fieldset>中,並使用<legend>提供列表的總體描述。每個單獨的<label>/<input>元素對都應包含在其自己的列表項(或類似項)中。關聯的<label>通常放置在單選按鈕或複選框的前面或後面,單選按鈕或複選框組的說明通常是<legend>的內容。請參閱上面連結的示例以瞭解結構示例。

複選框

複選框是使用<input>元素建立的,其type屬性設定為checkbox值。

html
<input type="checkbox" id="questionOne" name="subscribe" value="yes" checked />

相關的複選框專案應使用相同的name屬性。包含checked屬性會在頁面載入時自動選中複選框。單擊複選框或其關聯標籤會在複選框之間切換。

html
<fieldset>
  <legend>Choose all the vegetables you like to eat</legend>
  <ul>
    <li>
      <label for="carrots">Carrots</label>
      <input
        type="checkbox"
        id="carrots"
        name="vegetable"
        value="carrots"
        checked />
    </li>
    <li>
      <label for="peas">Peas</label>
      <input type="checkbox" id="peas" name="vegetable" value="peas" />
    </li>
    <li>
      <label for="cabbage">Cabbage</label>
      <input type="checkbox" id="cabbage" name="vegetable" value="cabbage" />
    </li>
  </ul>
</fieldset>

以下螢幕截圖顯示了複選框在預設、聚焦和停用狀態下的狀態。預設和停用狀態下的複選框顯示為選中狀態,而在聚焦狀態下,複選框未選中,周圍有焦點環。

Default, focused and disabled Checkboxes in chrome 115 on macOS

注意:載入時具有checked屬性的任何複選框和單選按鈕都與:default偽類匹配,即使它們不再選中。當前選中的任何複選框都與:checked偽類匹配。

由於複選框的開/關特性,複選框被認為是一個切換按鈕,許多開發人員和設計師擴充套件了預設的複選框樣式以建立看起來像切換開關的按鈕。您可以在這裡檢視一個示例(還可以檢視原始碼)。

單選按鈕

單選按鈕是使用<input>元素建立的,其type屬性設定為radio

html
<input type="radio" id="soup" name="meal" value="soup" checked />

可以將多個單選按鈕關聯在一起。如果它們為其name屬性共享相同的值,則會被視為屬於同一組按鈕。同一組中一次只能選中一個按鈕;這意味著,當選中其中一個按鈕時,其他所有按鈕都會自動取消選中。提交表單時,只會傳送選中的單選按鈕的值。如果沒有任何按鈕被選中,則整個單選按鈕池被視為處於未知狀態,表單不會發送任何值。一旦同一組名稱的按鈕組中的一個單選按鈕被選中,使用者就無法取消選中所有按鈕,除非重置表單。

html
<fieldset>
  <legend>What is your favorite meal?</legend>
  <ul>
    <li>
      <label for="soup">Soup</label>
      <input type="radio" id="soup" name="meal" value="soup" checked />
    </li>
    <li>
      <label for="curry">Curry</label>
      <input type="radio" id="curry" name="meal" value="curry" />
    </li>
    <li>
      <label for="pizza">Pizza</label>
      <input type="radio" id="pizza" name="meal" value="pizza" />
    </li>
  </ul>
</fieldset>

以下螢幕截圖顯示了選中狀態下的預設和停用的單選按鈕,以及未選中狀態下的聚焦單選按鈕。

Default, focused and disabled Radio buttons in chrome 115 on macOS

實際按鈕

儘管名稱如此,單選按鈕實際上並不是一個按鈕;讓我們繼續前進,看看真正的按鈕!有三種輸入型別可以生成按鈕

提交

將表單資料傳送到伺服器。對於<button>元素,省略type屬性(或type的無效值)會生成一個提交按鈕。

重置

將所有表單小部件重置為其預設值。

按鈕

沒有自動效果的按鈕,但可以使用 JavaScript 程式碼對其進行自定義。

然後我們還有<button>元素本身。它可以接受值為submitresetbuttontype屬性,以模仿上面提到的三種<input>型別的行為。兩者之間的主要區別在於,實際的<button>元素更容易設定樣式。

html
<input type="submit" value="Submit this form" />
<input type="reset" value="Reset this form" />
<input type="button" value="Do Nothing without JavaScript" />

<button type="submit">Submit this form</button>
<button type="reset">Reset this form</button>
<button type="button">Do Nothing without JavaScript</button>

注意:image輸入型別也會呈現為按鈕。我們稍後也會介紹它。

注意:您可以在 GitHub 上找到本節中的示例,網址為button-examples.html也可以線上檢視)。

下面您可以找到每種按鈕<input>型別的示例,以及等效的<button>型別。

提交

html
<button type="submit">This is a <strong>submit button</strong></button>

<input type="submit" value="This is a submit button" />

重置

html
<button type="reset">This is a <strong>reset button</strong></button>

<input type="reset" value="This is a reset button" />

匿名

html
<button type="button">This is an <strong>anonymous button</strong></button>

<input type="button" value="This is an anonymous button" />

無論您使用<button>元素還是<input>元素,按鈕的行為始終相同。但是,正如您從示例中看到的,<button>元素允許您在其內容中使用 HTML,這些內容插入在開始和結束<button>標籤之間。<input>元素另一方面是空元素;其顯示的內容插入到value屬性中,因此只接受純文字作為內容。

以下螢幕截圖顯示了按鈕在預設、聚焦和停用狀態下的狀態。在聚焦狀態下,按鈕周圍有一個焦點環,而在停用狀態下,按鈕會變灰。

Default, focus, and disabled button states in chrome 115 on macOS

影像按鈕

影像按鈕控制元件的呈現方式與<img>元素完全相同,只是當用戶單擊它時,它的行為類似於提交按鈕。

使用type屬性設定為image值的<input>元素來建立影像按鈕。此元素支援與<img>元素完全相同的屬性集,以及其他表單按鈕支援的所有屬性。

html
<input type="image" alt="Click me!" src="my-img.png" width="80" height="30" />

如果使用影像按鈕提交表單,則此控制元件不會提交其值,而是提交影像上單擊位置的 X 和 Y 座標(座標相對於影像,這意味著影像的左上角表示座標 (0, 0))。座標作為兩個鍵/值對傳送

  • X 值鍵是name屬性的值後跟字串“.x”。
  • Y 值鍵是name屬性的值後跟字串“.y”。

例如,當您在座標 (123, 456) 處單擊影像並透過get方法提交時,您會看到值附加到 URL 中,如下所示

網址
http://foo.com?pos.x=123&pos.y=456

這是一種構建“熱圖”的非常方便的方法。這些值如何傳送和檢索在傳送表單資料文章中詳細介紹。

檔案選擇器

在早期的 HTML 中,還有一個我們用到的最後一個<input>型別:檔案輸入型別。表單能夠將檔案傳送到伺服器(此特定操作也在傳送表單資料文章中詳細介紹)。檔案選擇器小部件可用於選擇要傳送的一個或多個檔案。

要建立檔案選擇器小部件,請使用type屬性設定為file<input>元素。可以使用accept屬性限制接受的檔案型別。此外,如果您想讓使用者選擇多個檔案,可以透過新增multiple屬性來實現。

示例

在此示例中,建立了一個請求圖形影像檔案的選取器。在這種情況下,使用者可以選中多個檔案。

html
<input type="file" name="file" id="file" accept="image/*" multiple />

在某些移動裝置上,透過向accept屬性新增捕獲資訊,檔案選擇器可以訪問裝置相機和麥克風直接捕獲的照片、影片和音訊,如下所示

html
<input type="file" accept="image/*;capture=camera" />
<input type="file" accept="video/*;capture=camcorder" />
<input type="file" accept="audio/*;capture=microphone" />

以下螢幕截圖顯示了在未選擇任何檔案時,檔案選擇器小部件在預設、焦點和停用狀態下的狀態。

File picker widget in default, focus, and disabled states in chrome 115 on macOS

常用屬性

用於定義表單控制元件的許多元素都有一些特定的屬性。但是,有一組屬性是所有表單元素共有的。您已經遇到了一些,但以下列出了這些常用屬性,以供參考

屬性名稱 預設值 描述
自動聚焦 錯誤的 此布林屬性允許您指定元素在頁面載入時應自動獲得輸入焦點。文件中只能有一個與表單關聯的元素指定此屬性。
停用 錯誤的 此布林屬性指示使用者無法與元素互動。如果未指定此屬性,則元素將從包含元素繼承其設定,例如<fieldset>;如果沒有包含元素設定了disabled屬性,則元素處於啟用狀態。
形式 小部件關聯的<form>元素,如果它沒有巢狀在該表單中,則使用。屬性的值必須是同一文件中<form>元素的id屬性。這使您可以將表單控制元件與它外部的表單關聯,即使它位於其他表單元素內部。
姓名 元素的名稱;這會與表單資料一起提交。
價值 元素的初始值。

測試你的技能!

您已經閱讀完本文,但您還記得最重要的資訊嗎?在繼續之前,您可以進行一些進一步的測試以驗證您是否保留了這些資訊——請參閱測試您的技能:基本控制元件

總結

本文介紹了較舊的輸入型別——在 HTML 早期引入並得到所有瀏覽器良好支援的原始集合。在下一節中,我們將瞭解type屬性的更現代的值。

高階主題