表單
範例和使用指南,用於建立各種表單的表單控制樣式、配置選項和自訂元件。
概觀
Bootstrap 的表單控制使用類別擴充 我們的重新啟動表單樣式。使用這些類別來選擇自訂顯示,以在各種瀏覽器和裝置中獲得更一致的呈現。
務必在所有輸入中使用適當的 type
屬性(例如,電子郵件地址的 email
或數字資訊的 number
),以利用電子郵件驗證、數字選取等較新的輸入控制。
以下是一個快速範例,用來說明 Bootstrap 的表單樣式。繼續閱讀以取得關於必要類別、表單配置等的文件。
<form>
<div class="form-group">
<label for="exampleInputEmail1">Email address</label>
<input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp">
<small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
</div>
<div class="form-group">
<label for="exampleInputPassword1">Password</label>
<input type="password" class="form-control" id="exampleInputPassword1">
</div>
<div class="form-group form-check">
<input type="checkbox" class="form-check-input" id="exampleCheck1">
<label class="form-check-label" for="exampleCheck1">Check me out</label>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
表單控制項
文字表單控制(例如 <input>
、<select>
和 <textarea>
)使用 .form-control
類別設定樣式。其中包含一般外觀、焦點狀態、調整大小等樣式。
務必探索我們的 自訂表單 以進一步設定 <select>
的樣式。
<form>
<div class="form-group">
<label for="exampleFormControlInput1">Email address</label>
<input type="email" class="form-control" id="exampleFormControlInput1" placeholder="name@example.com">
</div>
<div class="form-group">
<label for="exampleFormControlSelect1">Example select</label>
<select class="form-control" id="exampleFormControlSelect1">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
</select>
</div>
<div class="form-group">
<label for="exampleFormControlSelect2">Example multiple select</label>
<select multiple class="form-control" id="exampleFormControlSelect2">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
</select>
</div>
<div class="form-group">
<label for="exampleFormControlTextarea1">Example textarea</label>
<textarea class="form-control" id="exampleFormControlTextarea1" rows="3"></textarea>
</div>
</form>
對於檔案輸入,將 .form-control
換成 .form-control-file
。
<form>
<div class="form-group">
<label for="exampleFormControlFile1">Example file input</label>
<input type="file" class="form-control-file" id="exampleFormControlFile1">
</div>
</form>
尺寸
使用 .form-control-lg
和 .form-control-sm
等類別設定高度。
<input class="form-control form-control-lg" type="text" placeholder=".form-control-lg">
<input class="form-control" type="text" placeholder="Default input">
<input class="form-control form-control-sm" type="text" placeholder=".form-control-sm">
<select class="form-control form-control-lg">
<option>Large select</option>
</select>
<select class="form-control">
<option>Default select</option>
</select>
<select class="form-control form-control-sm">
<option>Small select</option>
</select>
唯讀
在輸入中加入 readonly
布林屬性,以防止修改輸入的值。唯讀輸入看起來較淡(就像已停用的輸入),但會保留標準游標。
<input class="form-control" type="text" placeholder="Readonly input here..." readonly>
唯讀純文字
如果您想要在表單中將 <input readonly>
元素設定為純文字樣式,請使用 .form-control-plaintext
類別來移除預設表單欄位樣式,並保留正確的邊界和內距。
<form>
<div class="form-group row">
<label for="staticEmail" class="col-sm-2 col-form-label">Email</label>
<div class="col-sm-10">
<input type="text" readonly class="form-control-plaintext" id="staticEmail" value="email@example.com">
</div>
</div>
<div class="form-group row">
<label for="inputPassword" class="col-sm-2 col-form-label">Password</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="inputPassword">
</div>
</div>
</form>
<form class="form-inline">
<div class="form-group mb-2">
<label for="staticEmail2" class="sr-only">Email</label>
<input type="text" readonly class="form-control-plaintext" id="staticEmail2" value="email@example.com">
</div>
<div class="form-group mx-sm-3 mb-2">
<label for="inputPassword2" class="sr-only">Password</label>
<input type="password" class="form-control" id="inputPassword2" placeholder="Password">
</div>
<button type="submit" class="btn btn-primary mb-2">Confirm identity</button>
</form>
範圍輸入
使用 .form-control-range
設定水平可捲動範圍輸入。
<form>
<div class="form-group">
<label for="formControlRange">Example Range input</label>
<input type="range" class="form-control-range" id="formControlRange">
</div>
</form>
核取方塊和單選按鈕
使用 .form-check
可改善預設核取方塊和無線按鈕,這是用於兩種輸入類型的單一類別,可改善其 HTML 元素的配置和行為。核取方塊用於在清單中選取一個或多個選項,而無線按鈕則用於從多個選項中選取一個選項。
支援已停用的核取方塊和無線按鈕。disabled
屬性會套用較淺的顏色,以協助指出輸入的狀態。
核取方塊和無線按鈕支援基於 HTML 的表單驗證,並提供簡潔且可存取的標籤。因此,我們的 <input>
和 <label>
是兄弟元素,而不是 <label>
內的 <input>
。這會稍微冗長,因為您必須指定 id
和 for
屬性,才能關聯 <input>
和 <label>
。
預設 (堆疊)
預設情況下,任何數量立即成為兄弟的核取方塊和無線按鈕都會垂直堆疊,並使用 .form-check
適當地調整間距。
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="defaultCheck1">
<label class="form-check-label" for="defaultCheck1">
Default checkbox
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="defaultCheck2" disabled>
<label class="form-check-label" for="defaultCheck2">
Disabled checkbox
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios1" value="option1" checked>
<label class="form-check-label" for="exampleRadios1">
Default radio
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios2" value="option2">
<label class="form-check-label" for="exampleRadios2">
Second default radio
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios3" value="option3" disabled>
<label class="form-check-label" for="exampleRadios3">
Disabled radio
</label>
</div>
內嵌
對任何 .form-check
新增 .form-check-inline
,即可在同一水平列中將核取方塊或無線按鈕分組。
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" id="inlineCheckbox1" value="option1">
<label class="form-check-label" for="inlineCheckbox1">1</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" id="inlineCheckbox2" value="option2">
<label class="form-check-label" for="inlineCheckbox2">2</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" id="inlineCheckbox3" value="option3" disabled>
<label class="form-check-label" for="inlineCheckbox3">3 (disabled)</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio1" value="option1">
<label class="form-check-label" for="inlineRadio1">1</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio2" value="option2">
<label class="form-check-label" for="inlineRadio2">2</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio3" value="option3" disabled>
<label class="form-check-label" for="inlineRadio3">3 (disabled)</label>
</div>
無標籤
將 .position-static
新增到沒有任何標籤文字的 .form-check
中的輸入。請記得仍提供某種無障礙名稱供輔助技術使用(例如使用 aria-label
)。
<div class="form-check">
<input class="form-check-input position-static" type="checkbox" id="blankCheckbox" value="option1" aria-label="...">
</div>
<div class="form-check">
<input class="form-check-input position-static" type="radio" name="blankRadio" id="blankRadio1" value="option1" aria-label="...">
</div>
版面配置
由於 Bootstrap 將 display: block
和 width: 100%
套用至幾乎所有我們的表單控制項,因此表單預設會垂直堆疊。可以額外使用類別來依據每個表單變更此配置。
表單群組
.form-group
類別是最簡單的方式,可為表單新增一些結構。它提供一個彈性的類別,鼓勵適當分組標籤、控制項、選用的說明文字和表單驗證訊息。預設它只套用 margin-bottom
,但它會在需要時在 .form-inline
中選取額外的樣式。將它與 <fieldset>
、<div>
或幾乎任何其他元素一起使用。
<form>
<div class="form-group">
<label for="formGroupExampleInput">Example label</label>
<input type="text" class="form-control" id="formGroupExampleInput" placeholder="Example input placeholder">
</div>
<div class="form-group">
<label for="formGroupExampleInput2">Another label</label>
<input type="text" class="form-control" id="formGroupExampleInput2" placeholder="Another input placeholder">
</div>
</form>
表單格線
可以使用我們的格線類別建立更複雜的表單。將這些類別用於需要多個欄、不同寬度和額外對齊選項的表單配置。
<form>
<div class="row">
<div class="col">
<input type="text" class="form-control" placeholder="First name">
</div>
<div class="col">
<input type="text" class="form-control" placeholder="Last name">
</div>
</div>
</form>
表單列
您也可以將 .row
換成 .form-row
,這是我們標準格線列的變體,它會覆寫預設的欄位間距,以提供更緊密和更精簡的配置。
<form>
<div class="form-row">
<div class="col">
<input type="text" class="form-control" placeholder="First name">
</div>
<div class="col">
<input type="text" class="form-control" placeholder="Last name">
</div>
</div>
</form>
也可以使用格線系統建立更複雜的配置。
<form>
<div class="form-row">
<div class="form-group col-md-6">
<label for="inputEmail4">Email</label>
<input type="email" class="form-control" id="inputEmail4">
</div>
<div class="form-group col-md-6">
<label for="inputPassword4">Password</label>
<input type="password" class="form-control" id="inputPassword4">
</div>
</div>
<div class="form-group">
<label for="inputAddress">Address</label>
<input type="text" class="form-control" id="inputAddress" placeholder="1234 Main St">
</div>
<div class="form-group">
<label for="inputAddress2">Address 2</label>
<input type="text" class="form-control" id="inputAddress2" placeholder="Apartment, studio, or floor">
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label for="inputCity">City</label>
<input type="text" class="form-control" id="inputCity">
</div>
<div class="form-group col-md-4">
<label for="inputState">State</label>
<select id="inputState" class="form-control">
<option selected>Choose...</option>
<option>...</option>
</select>
</div>
<div class="form-group col-md-2">
<label for="inputZip">Zip</label>
<input type="text" class="form-control" id="inputZip">
</div>
</div>
<div class="form-group">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="gridCheck">
<label class="form-check-label" for="gridCheck">
Check me out
</label>
</div>
</div>
<button type="submit" class="btn btn-primary">Sign in</button>
</form>
水平表單
透過將 .row
類別新增至表單群組,並使用 .col-*-*
類別來指定標籤和控制項的寬度,使用格線建立水平表單。請務必將 .col-form-label
新增至您的 <label>
,以便它們與其相關的表單控制項垂直置中。
有時,您可能需要使用 margin 或 padding 工具程式來建立您需要的完美對齊。例如,我們已移除堆疊式單選按鈕輸入標籤上的 padding-top
,以更好地對齊文字基準線。
<form>
<div class="form-group row">
<label for="inputEmail3" class="col-sm-2 col-form-label">Email</label>
<div class="col-sm-10">
<input type="email" class="form-control" id="inputEmail3">
</div>
</div>
<div class="form-group row">
<label for="inputPassword3" class="col-sm-2 col-form-label">Password</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="inputPassword3">
</div>
</div>
<fieldset class="form-group row">
<legend class="col-form-label col-sm-2 float-sm-left pt-0">Radios</legend>
<div class="col-sm-10">
<div class="form-check">
<input class="form-check-input" type="radio" name="gridRadios" id="gridRadios1" value="option1" checked>
<label class="form-check-label" for="gridRadios1">
First radio
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="gridRadios" id="gridRadios2" value="option2">
<label class="form-check-label" for="gridRadios2">
Second radio
</label>
</div>
<div class="form-check disabled">
<input class="form-check-input" type="radio" name="gridRadios" id="gridRadios3" value="option3" disabled>
<label class="form-check-label" for="gridRadios3">
Third disabled radio
</label>
</div>
</div>
</fieldset>
<div class="form-group row">
<div class="col-sm-10 offset-sm-2">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="gridCheck1">
<label class="form-check-label" for="gridCheck1">
Example checkbox
</label>
</div>
</div>
</div>
<div class="form-group row">
<div class="col-sm-10">
<button type="submit" class="btn btn-primary">Sign in</button>
</div>
</div>
</form>
水平表單標籤尺寸
請務必使用 .col-form-label-sm
或 .col-form-label-lg
套用至 <label>
或 <legend>
,以正確遵循 .form-control-lg
和 .form-control-sm
的大小。
<form>
<div class="form-group row">
<label for="colFormLabelSm" class="col-sm-2 col-form-label col-form-label-sm">Email</label>
<div class="col-sm-10">
<input type="email" class="form-control form-control-sm" id="colFormLabelSm" placeholder="col-form-label-sm">
</div>
</div>
<div class="form-group row">
<label for="colFormLabel" class="col-sm-2 col-form-label">Email</label>
<div class="col-sm-10">
<input type="email" class="form-control" id="colFormLabel" placeholder="col-form-label">
</div>
</div>
<div class="form-group row">
<label for="colFormLabelLg" class="col-sm-2 col-form-label col-form-label-lg">Email</label>
<div class="col-sm-10">
<input type="email" class="form-control form-control-lg" id="colFormLabelLg" placeholder="col-form-label-lg">
</div>
</div>
</form>
欄位尺寸
如前述範例所示,我們的網格系統允許您在 .row
或 .form-row
內放置任意數量的 .col
。它們會將可用寬度平均分配給它們。您也可以選擇讓部分欄位佔用更多或更少的空間,而其餘的 .col
會平均分配剩餘空間,並使用特定欄位類別,例如 .col-7
。
<form>
<div class="form-row">
<div class="col-7">
<input type="text" class="form-control" placeholder="City">
</div>
<div class="col">
<input type="text" class="form-control" placeholder="State">
</div>
<div class="col">
<input type="text" class="form-control" placeholder="Zip">
</div>
</div>
</form>
自動調整尺寸
下列範例使用彈性盒狀模型公用程式垂直置中內容,並將 .col
變更為 .col-auto
,讓您的欄位僅佔用所需的空間。換句話說,欄位大小會根據內容調整。
<form>
<div class="form-row align-items-center">
<div class="col-auto">
<label class="sr-only" for="inlineFormInput">Name</label>
<input type="text" class="form-control mb-2" id="inlineFormInput" placeholder="Jane Doe">
</div>
<div class="col-auto">
<label class="sr-only" for="inlineFormInputGroup">Username</label>
<div class="input-group mb-2">
<div class="input-group-prepend">
<div class="input-group-text">@</div>
</div>
<input type="text" class="form-control" id="inlineFormInputGroup" placeholder="Username">
</div>
</div>
<div class="col-auto">
<div class="form-check mb-2">
<input class="form-check-input" type="checkbox" id="autoSizingCheck">
<label class="form-check-label" for="autoSizingCheck">
Remember me
</label>
</div>
</div>
<div class="col-auto">
<button type="submit" class="btn btn-primary mb-2">Submit</button>
</div>
</div>
</form>
然後,您可以再次使用特定大小的欄位類別重新組合。
<form>
<div class="form-row align-items-center">
<div class="col-sm-3 my-1">
<label class="sr-only" for="inlineFormInputName">Name</label>
<input type="text" class="form-control" id="inlineFormInputName" placeholder="Jane Doe">
</div>
<div class="col-sm-3 my-1">
<label class="sr-only" for="inlineFormInputGroupUsername">Username</label>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">@</div>
</div>
<input type="text" class="form-control" id="inlineFormInputGroupUsername" placeholder="Username">
</div>
</div>
<div class="col-auto my-1">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="autoSizingCheck2">
<label class="form-check-label" for="autoSizingCheck2">
Remember me
</label>
</div>
</div>
<div class="col-auto my-1">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
</form>
當然,自訂表單控制項也受支援。
<form>
<div class="form-row align-items-center">
<div class="col-auto my-1">
<label class="mr-sm-2 sr-only" for="inlineFormCustomSelect">Preference</label>
<select class="custom-select mr-sm-2" id="inlineFormCustomSelect">
<option selected>Choose...</option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
</div>
<div class="col-auto my-1">
<div class="custom-control custom-checkbox mr-sm-2">
<input type="checkbox" class="custom-control-input" id="customControlAutosizing">
<label class="custom-control-label" for="customControlAutosizing">Remember my preference</label>
</div>
</div>
<div class="col-auto my-1">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
</form>
內嵌表單
使用 .form-inline
類別在單一水平列中顯示一系列標籤、表單控制項和按鈕。內嵌式表單中的表單控制項與其預設狀態略有不同。
- 控制項為
display: flex
,會壓縮任何 HTML 空白,並允許您使用 間距 和 彈性盒狀模型 公用程式提供對齊控制。 - 控制項和輸入群組會收到
width: auto
來覆寫 Bootstrap 預設的width: 100%
。 - 控制項只會在視窗寬度至少為 576 像素時內嵌顯示,以考量行動裝置上的窄視窗。
您可能需要手動處理個別表單控制項的寬度和對齊,方法是使用間距工具(如下所示)。最後,務必始終為每個表單控制項包含一個 <label>
,即使您需要使用 .sr-only
對非螢幕閱讀器訪客隱藏它。
<form class="form-inline">
<label class="sr-only" for="inlineFormInputName2">Name</label>
<input type="text" class="form-control mb-2 mr-sm-2" id="inlineFormInputName2" placeholder="Jane Doe">
<label class="sr-only" for="inlineFormInputGroupUsername2">Username</label>
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
<div class="input-group-text">@</div>
</div>
<input type="text" class="form-control" id="inlineFormInputGroupUsername2" placeholder="Username">
</div>
<div class="form-check mb-2 mr-sm-2">
<input class="form-check-input" type="checkbox" id="inlineFormCheck">
<label class="form-check-label" for="inlineFormCheck">
Remember me
</label>
</div>
<button type="submit" class="btn btn-primary mb-2">Submit</button>
</form>
自訂表單控制項和選取元件也受支援。
<form class="form-inline">
<label class="my-1 mr-2" for="inlineFormCustomSelectPref">Preference</label>
<select class="custom-select my-1 mr-sm-2" id="inlineFormCustomSelectPref">
<option selected>Choose...</option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
<div class="custom-control custom-checkbox my-1 mr-sm-2">
<input type="checkbox" class="custom-control-input" id="customControlInline">
<label class="custom-control-label" for="customControlInline">Remember my preference</label>
</div>
<button type="submit" class="btn btn-primary my-1">Submit</button>
</form>
隱藏標籤的替代方案
如果您沒有為每個輸入包含標籤,輔助技術(例如螢幕閱讀器)將無法順利處理您的表單。對於這些內嵌表單,您可以使用 .sr-only
類別來隱藏標籤。還有其他提供標籤給輔助技術的替代方法,例如 aria-label
、aria-labelledby
或 title
屬性。如果這些屬性都不存在,輔助技術可能會使用 placeholder
屬性(如果存在),但請注意,不建議使用 placeholder
來取代其他標籤方法。
說明文字
表單中的區塊層級說明文字可以使用 .form-text
建立(以前在 v3 中稱為 .help-block
)。內嵌說明文字可以靈活地使用任何內嵌 HTML 元素和工具類別(例如 .text-muted
)實作。
將說明文字與表單控制項關聯
說明文字應該使用 aria-describedby
屬性與它所關聯的表單控制項明確關聯。這將確保輔助技術(例如螢幕閱讀器)在使用者聚焦或輸入控制項時會宣告這段說明文字。
輸入欄位下方的說明文字可以使用 .form-text
設定樣式。此類別包含 display: block
,並新增一些頂端外距,以便輕鬆與上方輸入欄位間隔。
<label for="inputPassword5">Password</label>
<input type="password" id="inputPassword5" class="form-control" aria-describedby="passwordHelpBlock">
<small id="passwordHelpBlock" class="form-text text-muted">
Your password must be 8-20 characters long, contain letters and numbers, and must not contain spaces, special characters, or emoji.
</small>
內嵌文字可以使用任何典型的內嵌 HTML 元素(無論是 <small>
、<span>
或其他元素),只需使用一個工具類別即可。
<form class="form-inline">
<div class="form-group">
<label for="inputPassword6">Password</label>
<input type="password" id="inputPassword6" class="form-control mx-sm-3" aria-describedby="passwordHelpInline">
<small id="passwordHelpInline" class="text-muted">
Must be 8-20 characters long.
</small>
</div>
</form>
停用表單
在輸入欄位上加上 disabled
布林屬性,可以防止使用者互動並讓它看起來更淡。
<input class="form-control" id="disabledInput" type="text" placeholder="Disabled input here..." disabled>
在 <fieldset>
中加上 disabled
屬性,可以停用其中的所有控制項。
<form>
<fieldset disabled>
<legend>Disabled fieldset example</legend>
<div class="form-group">
<label for="disabledTextInput">Disabled input</label>
<input type="text" id="disabledTextInput" class="form-control" placeholder="Disabled input">
</div>
<div class="form-group">
<label for="disabledSelect">Disabled select menu</label>
<select id="disabledSelect" class="form-control">
<option>Disabled select</option>
</select>
</div>
<div class="form-group">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="disabledFieldsetCheck" disabled>
<label class="form-check-label" for="disabledFieldsetCheck">
Can't check this
</label>
</div>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</fieldset>
</form>
錨點的注意事項
瀏覽器會將 <fieldset disabled>
內的所有原生表單控制項(<input>
、<select>
和 <button>
元素)視為已停用,並禁止使用鍵盤和滑鼠與它們互動。
但是,如果您的表單也包含自訂的按鈕狀元素,例如 <a ... class="btn btn-*">
,它們只會被賦予 pointer-events: none
的樣式。正如按鈕的 停用狀態 部分(特別是錨點元素的子部分)中所述,此 CSS 屬性尚未標準化,且在 Internet Explorer 10 中並未獲得完全支援。基於錨點的控制項仍然可以透過鍵盤對焦和操作。您必須手動修改這些控制項,方法是加上 tabindex="-1"
以防止它們接收焦點,並加上 aria-disabled="disabled"
以向輔助技術傳達其狀態。
跨瀏覽器相容性
雖然 Bootstrap 會在所有瀏覽器中套用這些樣式,但 Internet Explorer 11 及以下版本並不完全支援 <fieldset>
上的 disabled
屬性。請使用自訂 JavaScript 在這些瀏覽器中停用欄位集。
驗證
透過 HTML5 表單驗證提供有價值且可操作的回饋給您的使用者,在我們支援的所有瀏覽器中都可用。從瀏覽器的預設驗證回饋中選擇,或使用我們的內建類別和入門 JavaScript 實作自訂訊息。
運作方式
以下是 Bootstrap 表單驗證運作的方式
- HTML 表單驗證透過 CSS 的兩個偽類別
:invalid
和:valid
進行套用。它適用於<input>
、<select>
和<textarea>
元素。 - Bootstrap 將
:invalid
和:valid
樣式範圍設定為父類別.was-validated
,通常套用於<form>
。否則,任何沒有值的必填欄位都會在頁面載入時顯示為無效。這樣一來,您可以選擇在何時啟用它們(通常是在嘗試提交表單之後)。 - 若要重設表單的外觀(例如,在使用 AJAX 進行動態表單提交的情況下),請在提交後再次從
<form>
中移除.was-validated
類別。 - 作為備用方案,
.is-invalid
和.is-valid
類別可以用於偽類別,以進行 伺服器端驗證。它們不需要.was-validated
父類別。 - 由於 CSS 運作方式的限制,我們目前無法在沒有自訂 JavaScript 協助的情況下,將樣式套用於 DOM 中表單控制項之前的
<label>
。 - 所有現代瀏覽器都支援 約束驗證 API,這是一系列用於驗證表單控制項的 JavaScript 方法。
- 回饋訊息可以使用 瀏覽器預設值(每個瀏覽器不同,且無法透過 CSS 設定樣式)或我們的自訂回饋樣式,以及額外的 HTML 和 CSS。
- 您可以在 JavaScript 中使用
setCustomValidity
提供自訂有效性訊息。
請考慮以下範例,了解我們的自訂表單驗證樣式、選用的伺服器端類別和瀏覽器預設值。
自訂樣式
對於自訂 Bootstrap 表單驗證訊息,您需要將 novalidate
布林屬性新增至您的 <form>
。這會停用瀏覽器預設的回饋工具提示,但仍可透過 JavaScript 存取表單驗證 API。請嘗試提交以下表單;我們的 JavaScript 會攔截提交按鈕,並向您傳達回饋。嘗試提交時,您會看到 :invalid
和 :valid
樣式套用於您的表單控制項。
自訂回饋樣式會套用自訂顏色、邊框、焦點樣式和背景圖示,以更好地傳達回饋。<select>
的背景圖示僅可搭配 .custom-select
使用,而不能搭配 .form-control
使用。
<form class="needs-validation" novalidate>
<div class="form-row">
<div class="col-md-6 mb-3">
<label for="validationCustom01">First name</label>
<input type="text" class="form-control" id="validationCustom01" value="Mark" required>
<div class="valid-feedback">
Looks good!
</div>
</div>
<div class="col-md-6 mb-3">
<label for="validationCustom02">Last name</label>
<input type="text" class="form-control" id="validationCustom02" value="Otto" required>
<div class="valid-feedback">
Looks good!
</div>
</div>
</div>
<div class="form-row">
<div class="col-md-6 mb-3">
<label for="validationCustom03">City</label>
<input type="text" class="form-control" id="validationCustom03" required>
<div class="invalid-feedback">
Please provide a valid city.
</div>
</div>
<div class="col-md-3 mb-3">
<label for="validationCustom04">State</label>
<select class="custom-select" id="validationCustom04" required>
<option selected disabled value="">Choose...</option>
<option>...</option>
</select>
<div class="invalid-feedback">
Please select a valid state.
</div>
</div>
<div class="col-md-3 mb-3">
<label for="validationCustom05">Zip</label>
<input type="text" class="form-control" id="validationCustom05" required>
<div class="invalid-feedback">
Please provide a valid zip.
</div>
</div>
</div>
<div class="form-group">
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="invalidCheck" required>
<label class="form-check-label" for="invalidCheck">
Agree to terms and conditions
</label>
<div class="invalid-feedback">
You must agree before submitting.
</div>
</div>
</div>
<button class="btn btn-primary" type="submit">Submit form</button>
</form>
<script>
// Example starter JavaScript for disabling form submissions if there are invalid fields
(function() {
'use strict';
window.addEventListener('load', function() {
// Fetch all the forms we want to apply custom Bootstrap validation styles to
var forms = document.getElementsByClassName('needs-validation');
// Loop over them and prevent submission
var validation = Array.prototype.filter.call(forms, function(form) {
form.addEventListener('submit', function(event) {
if (form.checkValidity() === false) {
event.preventDefault();
event.stopPropagation();
}
form.classList.add('was-validated');
}, false);
});
}, false);
})();
</script>
瀏覽器預設值
對自訂驗證回饋訊息或撰寫 JavaScript 以變更表單行為不感興趣嗎?沒問題,您可以使用瀏覽器預設值。試試提交以下表單。根據您的瀏覽器和作業系統,您會看到略有不同的回饋樣式。
雖然這些回饋樣式無法使用 CSS 設定樣式,但您仍可透過 JavaScript 自訂回饋文字。
<form>
<div class="form-row">
<div class="col-md-6 mb-3">
<label for="validationDefault01">First name</label>
<input type="text" class="form-control" id="validationDefault01" value="Mark" required>
</div>
<div class="col-md-6 mb-3">
<label for="validationDefault02">Last name</label>
<input type="text" class="form-control" id="validationDefault02" value="Otto" required>
</div>
</div>
<div class="form-row">
<div class="col-md-6 mb-3">
<label for="validationDefault03">City</label>
<input type="text" class="form-control" id="validationDefault03" required>
</div>
<div class="col-md-3 mb-3">
<label for="validationDefault04">State</label>
<select class="custom-select" id="validationDefault04" required>
<option selected disabled value="">Choose...</option>
<option>...</option>
</select>
</div>
<div class="col-md-3 mb-3">
<label for="validationDefault05">Zip</label>
<input type="text" class="form-control" id="validationDefault05" required>
</div>
</div>
<div class="form-group">
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="invalidCheck2" required>
<label class="form-check-label" for="invalidCheck2">
Agree to terms and conditions
</label>
</div>
</div>
<button class="btn btn-primary" type="submit">Submit form</button>
</form>
伺服器端
我們建議使用用戶端驗證,但如果您需要伺服器端驗證,您可以使用 .is-invalid
和 .is-valid
指出無效和有效的表單欄位。請注意,這些類別也支援 .invalid-feedback
。
對於無效欄位,請確保無效回饋/錯誤訊息與相關表單欄位關聯,並使用 aria-describedby
。此屬性允許多個 id
參照,以防欄位已指向其他表單文字。
<form>
<div class="form-row">
<div class="col-md-6 mb-3">
<label for="validationServer01">First name</label>
<input type="text" class="form-control is-valid" id="validationServer01" value="Mark" required>
<div class="valid-feedback">
Looks good!
</div>
</div>
<div class="col-md-6 mb-3">
<label for="validationServer02">Last name</label>
<input type="text" class="form-control is-valid" id="validationServer02" value="Otto" required>
<div class="valid-feedback">
Looks good!
</div>
</div>
</div>
<div class="form-row">
<div class="col-md-6 mb-3">
<label for="validationServer03">City</label>
<input type="text" class="form-control is-invalid" id="validationServer03" aria-describedby="validationServer03Feedback" required>
<div id="validationServer03Feedback" class="invalid-feedback">
Please provide a valid city.
</div>
</div>
<div class="col-md-3 mb-3">
<label for="validationServer04">State</label>
<select class="custom-select is-invalid" id="validationServer04" aria-describedby="validationServer04Feedback" required>
<option selected disabled value="">Choose...</option>
<option>...</option>
</select>
<div id="validationServer04Feedback" class="invalid-feedback">
Please select a valid state.
</div>
</div>
<div class="col-md-3 mb-3">
<label for="validationServer05">Zip</label>
<input type="text" class="form-control is-invalid" id="validationServer05" aria-describedby="validationServer05Feedback" required>
<div id="validationServer05Feedback" class="invalid-feedback">
Please provide a valid zip.
</div>
</div>
</div>
<div class="form-group">
<div class="form-check">
<input class="form-check-input is-invalid" type="checkbox" value="" id="invalidCheck3" aria-describedby="invalidCheck3Feedback" required>
<label class="form-check-label" for="invalidCheck3">
Agree to terms and conditions
</label>
<div id="invalidCheck3Feedback" class="invalid-feedback">
You must agree before submitting.
</div>
</div>
</div>
<button class="btn btn-primary" type="submit">Submit form</button>
</form>
支援的元素
驗證樣式可供下列表單控制項和元件使用
<input>
和<textarea>
搭配.form-control
<select>
搭配.form-control
或.custom-select
.form-check
.custom-checkbox
和.custom-radio
.custom-file
<form class="was-validated">
<div class="mb-3">
<label for="validationTextarea">Textarea</label>
<textarea class="form-control is-invalid" id="validationTextarea" placeholder="Required example textarea" required></textarea>
<div class="invalid-feedback">
Please enter a message in the textarea.
</div>
</div>
<div class="custom-control custom-checkbox mb-3">
<input type="checkbox" class="custom-control-input" id="customControlValidation1" required>
<label class="custom-control-label" for="customControlValidation1">Check this custom checkbox</label>
<div class="invalid-feedback">Example invalid feedback text</div>
</div>
<div class="custom-control custom-radio">
<input type="radio" class="custom-control-input" id="customControlValidation2" name="radio-stacked" required>
<label class="custom-control-label" for="customControlValidation2">Toggle this custom radio</label>
</div>
<div class="custom-control custom-radio mb-3">
<input type="radio" class="custom-control-input" id="customControlValidation3" name="radio-stacked" required>
<label class="custom-control-label" for="customControlValidation3">Or toggle this other custom radio</label>
<div class="invalid-feedback">More example invalid feedback text</div>
</div>
<div class="mb-3">
<select class="custom-select" required>
<option value="">Choose...</option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
<div class="invalid-feedback">Example invalid custom select feedback</div>
</div>
<div class="custom-file mb-3">
<input type="file" class="custom-file-input" id="validatedCustomFile" required>
<label class="custom-file-label" for="validatedCustomFile">Choose file...</label>
<div class="invalid-feedback">Example invalid custom file feedback</div>
</div>
<div class="mb-3">
<div class="input-group is-invalid">
<div class="input-group-prepend">
<span class="input-group-text" id="validatedInputGroupPrepend">@</span>
</div>
<input type="text" class="form-control is-invalid" aria-describedby="validatedInputGroupPrepend" required>
</div>
<div class="invalid-feedback">
Example invalid input group feedback
</div>
</div>
<div class="mb-3">
<div class="input-group is-invalid">
<div class="input-group-prepend">
<label class="input-group-text" for="validatedInputGroupSelect">Options</label>
</div>
<select class="custom-select" id="validatedInputGroupSelect" required>
<option value="">Choose...</option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
</div>
<div class="invalid-feedback">
Example invalid input group feedback
</div>
</div>
<div class="input-group is-invalid">
<div class="custom-file">
<input type="file" class="custom-file-input" id="validatedInputGroupCustomFile" required>
<label class="custom-file-label" for="validatedInputGroupCustomFile">Choose file...</label>
</div>
<div class="input-group-append">
<button class="btn btn-outline-secondary" type="button">Button</button>
</div>
</div>
<div class="invalid-feedback">
Example invalid input group feedback
</div>
</form>
工具提示
如果您的表單配置允許,您可以將 .{valid|invalid}-feedback
類別替換為 .{valid|invalid}-tooltip
類別,以在樣式化工具提示中顯示驗證回饋。請務必在工具提示定位的父項上加上 position: relative
。在以下範例中,我們的欄位類別已經有這個設定,但您的專案可能需要其他設定。
<form class="needs-validation" novalidate>
<div class="form-row">
<div class="col-md-6 mb-3">
<label for="validationTooltip01">First name</label>
<input type="text" class="form-control" id="validationTooltip01" value="Mark" required>
<div class="valid-tooltip">
Looks good!
</div>
</div>
<div class="col-md-6 mb-3">
<label for="validationTooltip02">Last name</label>
<input type="text" class="form-control" id="validationTooltip02" value="Otto" required>
<div class="valid-tooltip">
Looks good!
</div>
</div>
</div>
<div class="form-row">
<div class="col-md-6 mb-3">
<label for="validationTooltip03">City</label>
<input type="text" class="form-control" id="validationTooltip03" required>
<div class="invalid-tooltip">
Please provide a valid city.
</div>
</div>
<div class="col-md-3 mb-3">
<label for="validationTooltip04">State</label>
<select class="custom-select" id="validationTooltip04" required>
<option selected disabled value="">Choose...</option>
<option>...</option>
</select>
<div class="invalid-tooltip">
Please select a valid state.
</div>
</div>
<div class="col-md-3 mb-3">
<label for="validationTooltip05">Zip</label>
<input type="text" class="form-control" id="validationTooltip05" required>
<div class="invalid-tooltip">
Please provide a valid zip.
</div>
</div>
</div>
<button class="btn btn-primary" type="submit">Submit form</button>
</form>
自訂
驗證狀態可以使用 Sass 中的 $form-validation-states
地圖自訂。此 Sass 地圖位於我們的 _variables.scss
檔案中,會迴圈產生預設的 valid
/invalid
驗證狀態。其中包含一個巢狀地圖,用於自訂每個狀態的顏色和圖示。雖然瀏覽器不支援其他狀態,但使用自訂樣式的使用者可以輕鬆地加入更複雜的表單回饋。
請注意,我們不建議在不修改 form-validation-state
混入的情況下自訂這些值。
// Sass map from `_variables.scss`
// Override this and recompile your Sass to generate different states
$form-validation-states: map-merge(
(
"valid": (
"color": $form-feedback-valid-color,
"icon": $form-feedback-icon-valid
),
"invalid": (
"color": $form-feedback-invalid-color,
"icon": $form-feedback-icon-invalid
)
),
$form-validation-states
);
// Loop from `_forms.scss`
// Any modifications to the above Sass map will be reflected in your compiled
// CSS via this loop.
@each $state, $data in $form-validation-states {
@include form-validation-state($state, map-get($data, color), map-get($data, icon));
}
輸入群組驗證
若要偵測在驗證的輸入群組中哪些元素需要圓角,輸入群組需要一個額外的 .has-validation
類別。
<div class="input-group has-validation">
<div class="input-group-prepend">
<span class="input-group-text">@</span>
</div>
<input type="text" class="form-control" required>
<div class="invalid-feedback">
Please choose a username.
</div>
</div>
自訂表單
若要獲得更多自訂選項和跨瀏覽器一致性,請使用我們完全自訂的表單元素來取代瀏覽器預設值。它們建置在語意且可存取的標記上,因此是任何預設表單控制項的可靠替代品。
核取方塊和單選按鈕
每個核取方塊和無線按鈕 <input>
和 <label>
配對都包在一個 <div>
中,以建立我們的自訂控制項。在結構上,這與我們的預設 .form-check
相同。
我們對所有 <input>
狀態(例如 :checked
)使用同層選擇器 (~
) 來適當地設定我們自訂表單指標的樣式。當與 .custom-control-label
類別結合使用時,我們也可以根據 <input>
的狀態設定每個項目的文字樣式。
我們使用 opacity
隱藏預設的 <input>
,並使用 .custom-control-label
在其位置建立一個新的自訂表單指標,並使用 ::before
和 ::after
。遺憾的是,我們無法僅從 <input>
建立自訂指標,因為 CSS 的 content
不適用於該元素。
在已勾選的狀態中,我們使用來自 Open Iconic 的base64 嵌入式 SVG 圖示。這讓我們可以最佳控制跨瀏覽器和裝置的樣式和定位。
核取方塊
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="customCheck1">
<label class="custom-control-label" for="customCheck1">Check this custom checkbox</label>
</div>
自訂核取方塊也可以使用 :indeterminate
偽類別,但必須透過 JavaScript 手動設定(沒有可用的 HTML 屬性可以指定它)。
如果您使用 jQuery,類似以下內容就足夠了
$('.your-checkbox').prop('indeterminate', true)
單選按鈕
<div class="custom-control custom-radio">
<input type="radio" id="customRadio1" name="customRadio" class="custom-control-input">
<label class="custom-control-label" for="customRadio1">Toggle this custom radio</label>
</div>
<div class="custom-control custom-radio">
<input type="radio" id="customRadio2" name="customRadio" class="custom-control-input">
<label class="custom-control-label" for="customRadio2">Or toggle this other custom radio</label>
</div>
內嵌
<div class="custom-control custom-radio custom-control-inline">
<input type="radio" id="customRadioInline1" name="customRadioInline" class="custom-control-input">
<label class="custom-control-label" for="customRadioInline1">Toggle this custom radio</label>
</div>
<div class="custom-control custom-radio custom-control-inline">
<input type="radio" id="customRadioInline2" name="customRadioInline" class="custom-control-input">
<label class="custom-control-label" for="customRadioInline2">Or toggle this other custom radio</label>
</div>
停用
自訂核取方塊和單選按鈕也可以停用。將 disabled
布林屬性新增至 <input>
,自訂指標和標籤說明會自動套用樣式。
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="customCheckDisabled1" disabled>
<label class="custom-control-label" for="customCheckDisabled1">Check this custom checkbox</label>
</div>
<div class="custom-control custom-radio">
<input type="radio" name="radioDisabled" id="customRadioDisabled2" class="custom-control-input" disabled>
<label class="custom-control-label" for="customRadioDisabled2">Toggle this custom radio</label>
</div>
開關
開關的標記與自訂核取方塊相同,但使用 .custom-switch
類別來呈現切換開關。開關也支援 disabled
屬性。
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="customSwitch1">
<label class="custom-control-label" for="customSwitch1">Toggle this switch element</label>
</div>
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" disabled id="customSwitch2">
<label class="custom-control-label" for="customSwitch2">Disabled switch element</label>
</div>
選單
自訂 <select>
選單只需要自訂類別 .custom-select
即可觸發自訂樣式。自訂樣式僅限於 <select>
的初始外觀,且無法修改 <option>
,這是由於瀏覽器限制所致。
<select class="custom-select">
<option selected>Open this select menu</option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
您也可以從小型和大型自訂選單中選擇,以符合我們大小相似的文字輸入。
<select class="custom-select custom-select-lg mb-3">
<option selected>Open this select menu</option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
<select class="custom-select custom-select-sm">
<option selected>Open this select menu</option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
也支援 multiple
屬性
<select class="custom-select" multiple>
<option selected>Open this select menu</option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
size
屬性也是如此
<select class="custom-select" size="3">
<option selected>Open this select menu</option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
範圍
使用 .custom-range
建立自訂 <input type="range">
控制項。軌道(背景)和拇指(值)都經過樣式設定,以在各個瀏覽器中呈現相同的外觀。由於只有 IE 和 Firefox 支援從拇指的左側或右側「填滿」其軌道,作為視覺上表示進度的工具,因此我們目前不支援此功能。
<label for="customRange1">Example range</label>
<input type="range" class="custom-range" id="customRange1">
範圍輸入元件隱含的 min
和 max
值分別為 0
和 100
。您可以使用 min
和 max
屬性指定這些值的新值。
<label for="customRange2">Example range</label>
<input type="range" class="custom-range" min="0" max="5" id="customRange2">
預設情況下,範圍輸入元件會「貼齊」整數值。若要變更此設定,您可以指定 step
值。在以下範例中,我們使用 step="0.5"
將步數加倍。
<label for="customRange3">Example range</label>
<input type="range" class="custom-range" min="0" max="5" step="0.5" id="customRange3">
檔案瀏覽器
檔案輸入元件是這群元件中最難搞的,而且如果您想將它們連結到功能性的 選擇檔案… 和選取的檔案名稱文字,則需要額外的 JavaScript。
<div class="custom-file">
<input type="file" class="custom-file-input" id="customFile">
<label class="custom-file-label" for="customFile">Choose file</label>
</div>
我們透過 opacity
隱藏預設的檔案 <input>
,並改為設定 <label>
的樣式。按鈕會使用 ::after
產生並定位。最後,我們在 <input>
上宣告 width
和 height
,以適當地配置周圍內容的間距。
使用 SCSS 翻譯或自訂字串
:lang()
偽類別用於允許將「瀏覽」文字翻譯成其他語言。使用相關的 語言標籤 和在地化字串覆寫或新增 $custom-file-text
Sass 變數的項目。英文字串也可以用相同的方式自訂。例如,以下是新增西班牙文翻譯的方法(西班牙文的語言代碼為 es
)
$custom-file-text: (
en: "Browse",
es: "Elegir"
);
以下是 lang(es)
用於西班牙文翻譯的自訂檔案輸入元件的範例
<div class="custom-file">
<input type="file" class="custom-file-input" id="customFileLang" lang="es">
<label class="custom-file-label" for="customFileLang">Seleccionar Archivo</label>
</div>
您需要正確設定文件(或其子樹)的語言,才能顯示正確的文字。這可以使用 <html>
元素上的 lang
屬性或 Content-Language
HTTP 標頭 等方法來完成。
使用 HTML 翻譯或自訂字串
Bootstrap 也提供一種方法,可以使用 data-browse
屬性在 HTML 中翻譯「瀏覽」文字,該屬性可以新增到自訂輸入標籤(荷蘭文範例)
<div class="custom-file">
<input type="file" class="custom-file-input" id="customFileLangHTML">
<label class="custom-file-label" for="customFileLangHTML" data-browse="Bestand kiezen">Voeg je document toe</label>
</div>