Validation (バリデーション)
ブラウザのデフォルトの動作、カスタムスタイルと JavaScript、HTML5 フォーム検証などを使用して、実用的なフィードバックをユーザーに提供します。
How it works
フォーム検証がどのように機能するかを次に示します。
- HTMLフォームの検証は、CSSの2つの疑似クラス
:invalid
と:valid
を介して適用されます。 これは、<input>
、<select>
、および<textarea>
要素に適用されます。 :invalid
および:valid
スタイルのスコープを親の.was-validated
クラスにスコープ指定し、通常は<form>
に適用されます。それ以外の場合、値のない必須フィールドはページの読み込み時に無効として表示されます。 このようにして、いつアクティブ化するかを選択できます(通常はフォームの送信が試行された後)。- フォームの外観をリセットするには(たとえば、AJAXを使用した動的フォーム送信の場合)、送信後に
.forms
から.was-validated
クラスを削除します。 - フォールバックとして、server-side validation の疑似クラスの代わりに、
.is-invalid
と.is-valid
を使用できます。.was-validated
親クラスは必要ありません。 - CSSの動作には制約があるため、(現在のところ)カスタムJavaScriptを使用しないと、DOMのフォームコントロールの前にある
<label>
にスタイルを適用できません。 - モダンブラウザでは constraint validation API をサポートしています。フォームコントロールを検証するための一連のJavaScriptメソッドです。
- フィードバックメッセージは、browser defaults (ブラウザごとに異なり、CSSでスタイル設定できない) または追加のHTMLとCSSを使用したカスタムフィードバックスタイルを利用できます。
- JavaScriptでは、
setCustomValidity
を使用してカスタムの有効性メッセージを提供できます。
カスタムフォーム検証スタイル、オプションのサーバー側クラス、およびブラウザーのデフォルトについて、以下のデモを検討してください。
Custom styles
フォーム検証メッセージの場合、 novaformate
属性を<form>
に追加する必要があります。これにより、ブラウザのデフォルトのフィードバックツールチップが無効になりますが、JavaScriptの form validation APIs へのアクセスは引き続き提供されます。
以下のフォームを送信してみてください。 JavaScriptが送信ボタンをインターセプトし、フィードバックを中継します。 送信しようとすると、フォームコントロールに適用された :invalid
および:valid
スタイルが表示されます。
カスタムフィードバックスタイルは、フィードバックをより良く伝えるために、カスタムカラー、ボーダー、フォーカススタイル、アイコンを適用します。<select>
のアイコンは .form-select
でのみ利用可能であり、.form-control
では利用できません。
<form class="row g-3 needs-validation" novalidate>
<div class="col-md-4">
<label for="validationCustom01" class="form-label">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-4">
<label for="validationCustom02" class="form-label">Last name</label>
<input type="text" class="form-control" id="validationCustom02" value="Otto" required>
<div class="valid-feedback">
Looks good!
</div>
</div>
<div class="col-md-4">
<label for="validationCustomUsername" class="form-label">Username</label>
<div class="input-group has-validation">
<span class="input-group-text" id="inputGroupPrepend">@</span>
<input type="text" class="form-control" id="validationCustomUsername" aria-describedby="inputGroupPrepend" required>
<div class="invalid-feedback">
Please choose a username.
</div>
</div>
</div>
<div class="col-md-6">
<label for="validationCustom03" class="form-label">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">
<label for="validationCustom04" class="form-label">State</label>
<select class="form-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">
<label for="validationCustom05" class="form-label">Zip</label>
<input type="text" class="form-control" id="validationCustom05" required>
<div class="invalid-feedback">
Please provide a valid zip.
</div>
</div>
<div class="col-12">
<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>
<div class="col-12">
<button class="btn btn-primary" type="submit">Submit form</button>
</div>
</form>
// Example starter JavaScript for disabling form submissions if there are invalid fields
(function () {
'use strict'
// Fetch all the forms we want to apply custom Bootstrap validation styles to
var forms = document.querySelectorAll('.needs-validation')
// Loop over them and prevent submission
Array.prototype.slice.call(forms)
.forEach(function (form) {
form.addEventListener('submit', function (event) {
if (!form.checkValidity()) {
event.preventDefault()
event.stopPropagation()
}
form.classList.add('was-validated')
}, false)
})
})()
Browser defaults
カスタムバリデーションのフィードバックメッセージや、フォームの動作を変更するためのJavaScriptの記述はブラウザのデフォルト設定を使用することができます。 下記のフォームを送信してみてください。お使いのブラウザやOSによって、フィードバックのスタイルが若干異なります。
これらのフィードバックスタイルはCSSではスタイリングできませんが、JavaScriptを使ってフィードバックテキストをカスタマイズすることができます。
<form class="row g-3">
<div class="col-md-4">
<label for="validationDefault01" class="form-label">First name</label>
<input type="text" class="form-control" id="validationDefault01" value="Mark" required>
</div>
<div class="col-md-4">
<label for="validationDefault02" class="form-label">Last name</label>
<input type="text" class="form-control" id="validationDefault02" value="Otto" required>
</div>
<div class="col-md-4">
<label for="validationDefaultUsername" class="form-label">Username</label>
<div class="input-group">
<span class="input-group-text" id="inputGroupPrepend2">@</span>
<input type="text" class="form-control" id="validationDefaultUsername" aria-describedby="inputGroupPrepend2" required>
</div>
</div>
<div class="col-md-6">
<label for="validationDefault03" class="form-label">City</label>
<input type="text" class="form-control" id="validationDefault03" required>
</div>
<div class="col-md-3">
<label for="validationDefault04" class="form-label">State</label>
<select class="form-select" id="validationDefault04" required>
<option selected disabled value="">Choose...</option>
<option>...</option>
</select>
</div>
<div class="col-md-3">
<label for="validationDefault05" class="form-label">Zip</label>
<input type="text" class="form-control" id="validationDefault05" required>
</div>
<div class="col-12">
<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>
<div class="col-12">
<button class="btn btn-primary" type="submit">Submit form</button>
</div>
</form>
Server side
クライアントサイドのバリデーションを使用することを推奨しますが、サーバーサイドのバリデーションが必要な場合は、.is-invalid
と .is-valid
を使用して無効なフォームフィールドと有効なフォームフィールドを表示することができます。.invalid-feedback
もこれらのクラスでサポートされています。
invalid なフィールドの場合は、 aria-describeby
を使用して、無効なフィードバック/エラーメッセージが関連するフォームフィールドに関連付けられています(フィールドがすでに追加のフォームを指している場合は、この属性で複数の id
を参照できます。テキスト)。
issues with border radii を 修正するには、入力グループに追加の .has-validation
クラスが必要です。
<form class="row g-3">
<div class="col-md-4">
<label for="validationServer01" class="form-label">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-4">
<label for="validationServer02" class="form-label">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 class="col-md-4">
<label for="validationServerUsername" class="form-label">Username</label>
<div class="input-group has-validation">
<span class="input-group-text" id="inputGroupPrepend3">@</span>
<input type="text" class="form-control is-invalid" id="validationServerUsername" aria-describedby="inputGroupPrepend3 validationServerUsernameFeedback" required>
<div id="validationServerUsernameFeedback" class="invalid-feedback">
Please choose a username.
</div>
</div>
</div>
<div class="col-md-6">
<label for="validationServer03" class="form-label">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">
<label for="validationServer04" class="form-label">State</label>
<select class="form-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">
<label for="validationServer05" class="form-label">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 class="col-12">
<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>
<div class="col-12">
<button class="btn btn-primary" type="submit">Submit form</button>
</div>
</form>
Supported elements
バリデーションスタイルは、以下のフォームコントロールとコンポーネントで利用できます。
<input>
s and<textarea>
s with.form-control
(including up to one.form-control
in input groups)<select>
s with.form-select
.form-check
s
<form class="was-validated">
<div class="mb-3">
<label for="validationTextarea" class="form-label">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="form-check mb-3">
<input type="checkbox" class="form-check-input" id="validationFormCheck1" required>
<label class="form-check-label" for="validationFormCheck1">Check this checkbox</label>
<div class="invalid-feedback">Example invalid feedback text</div>
</div>
<div class="form-check">
<input type="radio" class="form-check-input" id="validationFormCheck2" name="radio-stacked" required>
<label class="form-check-label" for="validationFormCheck2">Toggle this radio</label>
</div>
<div class="form-check mb-3">
<input type="radio" class="form-check-input" id="validationFormCheck3" name="radio-stacked" required>
<label class="form-check-label" for="validationFormCheck3">Or toggle this other radio</label>
<div class="invalid-feedback">More example invalid feedback text</div>
</div>
<div class="mb-3">
<select class="form-select" required aria-label="select example">
<option value="">Open this select menu</option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
<div class="invalid-feedback">Example invalid select feedback</div>
</div>
<div class="mb-3">
<input type="file" class="form-control" aria-label="file example" required>
<div class="invalid-feedback">Example invalid form file feedback</div>
</div>
<div class="mb-3">
<button class="btn btn-primary" type="submit" disabled>Submit form</button>
</div>
</form>
Tooltips
フォームレイアウトが許すのであれば、.{valid|invalid}-feedback
を .{valid|invalid}-tooltip
と入れ替えて、スタイル付きのツールチップにバリデーションのフィードバックを表示させることができます。ツールチップの位置を決めるためには、 position: relative
を持つ親を持つようにしてください。
下の例では、カラムクラスはすでにこれを持っていますが、あなたのプロジェクトでは別の設定が必要になるかもしれません。
<form class="row g-3 needs-validation" novalidate>
<div class="col-md-4 position-relative">
<label for="validationTooltip01" class="form-label">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-4 position-relative">
<label for="validationTooltip02" class="form-label">Last name</label>
<input type="text" class="form-control" id="validationTooltip02" value="Otto" required>
<div class="valid-tooltip">
Looks good!
</div>
</div>
<div class="col-md-4 position-relative">
<label for="validationTooltipUsername" class="form-label">Username</label>
<div class="input-group has-validation">
<span class="input-group-text" id="validationTooltipUsernamePrepend">@</span>
<input type="text" class="form-control" id="validationTooltipUsername" aria-describedby="validationTooltipUsernamePrepend" required>
<div class="invalid-tooltip">
Please choose a unique and valid username.
</div>
</div>
</div>
<div class="col-md-6 position-relative">
<label for="validationTooltip03" class="form-label">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 position-relative">
<label for="validationTooltip04" class="form-label">State</label>
<select class="form-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 position-relative">
<label for="validationTooltip05" class="form-label">Zip</label>
<input type="text" class="form-control" id="validationTooltip05" required>
<div class="invalid-tooltip">
Please provide a valid zip.
</div>
</div>
<div class="col-12">
<button class="btn btn-primary" type="submit">Submit form</button>
</div>
</form>
Customizing
バリデーション状態はSassを使って $form-validation-state
マップを使ってカスタマイズすることができます。この Sass マップは _variables.scss
ファイルにあり、デフォルトの valid
/ invalid
の検証状態を生成するためにループされます。
各状態の色やアイコンをカスタマイズするためのネストされたマップも含まれています。他の状態はブラウザではサポートされていませんが、カスタムスタイルを使用している人は、より複雑なフォームフィードバックを簡単に追加することができます。
mixin の form-validation-state
を変更せずにこれらの値をカスタマイズすることはお勧めしません。
これは _variables.scss
の Sass マップです。これをオーバーライドして、異なる状態を生成するために Sass を再コンパイルしてください。
$form-validation-states: (
"valid": (
"color": $form-feedback-valid-color,
"icon": $form-feedback-icon-valid
),
"invalid": (
"color": $form-feedback-invalid-color,
"icon": $form-feedback-icon-invalid
)
);
forms/_validation.scss.scss
からのループです。上記のSassマップへの変更は、このループを経由してコンパイルされたCSSに反映されます。
@each $state, $data in $form-validation-states {
@include form-validation-state($state, map-get($data, color), map-get($data, icon));
}