fankatoavana
Manomeza valin-teny sarobidy sy azo atao ho an'ny mpampiasa anao miaraka amin'ny fanamarinana ny endrika HTML5, amin'ny alàlan'ny fitondran-tena mahazatra amin'ny navigateur na ny fomba mahazatra sy ny JavaScript.
Ahoana ny fiasan'izany
Toy izao ny fomba fiasan'ny validation amin'ny Bootstrap:
- Ny fanamarinana endrika HTML dia ampiharina amin'ny alàlan'ny pseudo-class roa an'ny CSS,
:invalid
ary:valid
. Mihatra amin'ny<input>
,<select>
, ary<textarea>
singa izany. - Ny Bootstrap dia mametaka ny
:invalid
sy ny:valid
fomba ho an'ny.was-validated
kilasin'ny ray aman-dreny, matetika ampiharina amin'ny<form>
. Raha tsy izany, izay saha ilaina tsy misy sandany dia miseho ho tsy manan-kery amin'ny entana pejy. Amin'izany fomba izany, azonao atao ny misafidy hoe rahoviana no hampavitrika azy ireo (matetika rehefa avy nanandrana ny fandefasana taratasy). - Mba hamerenana ny endriky ny endrika (ohatra, amin'ny fandefasana endrika mavitrika amin'ny fampiasana AJAX), esory ny
.was-validated
kilasy<form>
indray aorian'ny fandefasana. - Amin'ny maha-famerenana azy,
.is-invalid
ary ny.is-valid
kilasy dia azo ampiasaina ho solon'ny kilasy pseudo ho an'ny fanamarinana amin'ny lafiny mpizara . Tsy mila.was-validated
kilasy ray aman-dreny izy ireo. - Noho ny faneriterena amin'ny fomba fiasan'ny CSS dia tsy afaka (amin'izao fotoana izao) izahay hampihatra fomba amin'ny endrika iray
<label>
alohan'ny fifehezana endrika ao amin'ny DOM raha tsy misy ny fanampian'ny JavaScript mahazatra. - Ny navigateur maoderina rehetra dia manohana ny API validation constraint , andiana fomba JavaScript hanamarinana ny fanaraha-maso ny endrika.
- Ny hafatra valin- kafatra dia mety hampiasa ny default amin'ny navigateur (samy hafa ho an'ny navigateur tsirairay, ary tsy azo fehezina amin'ny alàlan'ny CSS) na ny fomba fanehoan-kevitra mahazatra misy HTML sy CSS fanampiny.
- Azonao atao ny manome hafatra manan-kery manokana
setCustomValidity
amin'ny JavaScript.
Miaraka amin'izany ao an-tsaina, diniho ireto demo manaraka ireto ho an'ny fomba fanamarinana ny endrika fanaontsika, ny kilasin'ny mpizara safidy, ary ny tsy mety amin'ny navigateur.
Fomba mahazatra
Ho an'ny hafatra fanamarinana ny endrika Bootstrap mahazatra dia mila manampy ny novalidate
toetra boolean amin'ny <form>
. Izany dia manafoana ny toro-hevitra momba ny valin-kafatra ho an'ny navigateur, fa mbola manome fidirana amin'ny API fanamarinana endrika amin'ny JavaScript. Andramo ny mandefa ny taratasy eto ambany; ny JavaScript dia hanakana ny bokotra fandefasana ary hampita hevitra aminao. Rehefa manandrana manatitra ianao dia ho hitanao ny fomba :invalid
sy ny :valid
fomba ampiharina amin'ny fanaraha-maso ny endrikao.
Mampihatra loko, sisin-tany, fomba fifantohana, ary kisary ambadika mba hampitana hevitra tsara kokoa ny fomba fanehoan-kevitra manokana. Ny kisary background ho an'ny <select>
s dia tsy misy afa-tsy amin'ny .form-select
, fa tsy .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
(() => {
'use strict'
// Fetch all the forms we want to apply custom Bootstrap validation styles to
const forms = document.querySelectorAll('.needs-validation')
// Loop over them and prevent submission
Array.from(forms).forEach(form => {
form.addEventListener('submit', event => {
if (!form.checkValidity()) {
event.preventDefault()
event.stopPropagation()
}
form.classList.add('was-validated')
}, false)
})
})()
Ny navigateur default
Tsy liana amin'ny hafatra fanehoan-kevitra momba ny fanamarinana manokana na manoratra JavaScript hanovana fitondran-tena? Tsara daholo, azonao ampiasaina ny default navigateur. Andramo mandefa ny taratasy etsy ambany. Miankina amin'ny navigateur sy ny OS, dia hahita fomba fanehoan-kevitra hafa kely ianao.
Na dia tsy azo atao amin'ny CSS aza ireo fomba fanehoan-kevitra ireo, dia mbola azonao atao ny manamboatra ny lahatsoratra fanehoan-kevitra amin'ny alàlan'ny 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>
Lafiny mpizara
Manoro hevitra izahay hampiasa ny fanamarinana amin'ny lafiny mpanjifa, fa raha toa ka mila fanamarinana amin'ny lafiny server ianao, dia azonao atao ny manondro saha misy endrika tsy mety sy manankery miaraka amin'ny .is-invalid
sy .is-valid
. Mariho fa .invalid-feedback
tohana ihany koa amin'ireo kilasy ireo.
Ho an'ny saha tsy mety, ataovy azo antoka fa mifandray amin'ny sahan'ny endrika mifanaraka amin'izany ny hafatra tsy mety/diso aria-describedby
(marihina fa ity toetra ity dia mamela mihoatra ny iray id
azo resahana, raha toa ka efa manondro lahatsoratra amin'ny endrika fanampiny ny saha).
Mba hamahana ny olana amin'ny sisin-tany dia mila kilasy fanampiny ny vondrona fampidirana .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>
Singa tohanana
Ny fomba fanamarinana dia misy amin'ireto fanaraha-maso sy singa manaraka ireto:
<input>
s sy<textarea>
s miaraka amin'ny.form-control
(anisan'izany hatramin'ny iray.form-control
amin'ny vondrona fampidirana)<select>
s miaraka.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" 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
Raha mamela izany ny fandrafetana endrikao dia azonao atao ny manova ny .{valid|invalid}-feedback
kilasy ho an'ny .{valid|invalid}-tooltip
kilasy mba hanehoana valin-kafatra momba ny fanamarinana amin'ny tondro-fitaovana voalamina. Ataovy azo antoka fa manana ray aman-dreny miaraka position: relative
amin'ny fametrahana fitaovana. Ao amin'ny ohatra etsy ambany, ny kilasin'ny tsanganana dia efa manana an'io, fa ny tetikasanao dia mety mitaky fanamboarana hafa.
<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>
Sass
hiovaova
$form-feedback-margin-top: $form-text-margin-top;
$form-feedback-font-size: $form-text-font-size;
$form-feedback-font-style: $form-text-font-style;
$form-feedback-valid-color: $success;
$form-feedback-invalid-color: $danger;
$form-feedback-icon-valid-color: $form-feedback-valid-color;
$form-feedback-icon-valid: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'><path fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/></svg>");
$form-feedback-icon-invalid-color: $form-feedback-invalid-color;
$form-feedback-icon-invalid: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='#{$form-feedback-icon-invalid-color}'><circle cx='6' cy='6' r='4.5'/><path stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/><circle cx='6' cy='8.2' r='.6' fill='#{$form-feedback-icon-invalid-color}' stroke='none'/></svg>");
Mixins
Mixins roa no mitambatra, amin'ny alalan'ny loop , mba hamoronana ny endrika fanehoan-kevitra fanamarinana.
@mixin form-validation-state-selector($state) {
@if ($state == "valid" or $state == "invalid") {
.was-validated #{if(&, "&", "")}:#{$state},
#{if(&, "&", "")}.is-#{$state} {
@content;
}
} @else {
#{if(&, "&", "")}.is-#{$state} {
@content;
}
}
}
@mixin form-validation-state(
$state,
$color,
$icon,
$tooltip-color: color-contrast($color),
$tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),
$focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity)
) {
.#{$state}-feedback {
display: none;
width: 100%;
margin-top: $form-feedback-margin-top;
@include font-size($form-feedback-font-size);
font-style: $form-feedback-font-style;
color: $color;
}
.#{$state}-tooltip {
position: absolute;
top: 100%;
z-index: 5;
display: none;
max-width: 100%; // Contain to parent when possible
padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;
margin-top: .1rem;
@include font-size($form-feedback-tooltip-font-size);
line-height: $form-feedback-tooltip-line-height;
color: $tooltip-color;
background-color: $tooltip-bg-color;
@include border-radius($form-feedback-tooltip-border-radius);
}
@include form-validation-state-selector($state) {
~ .#{$state}-feedback,
~ .#{$state}-tooltip {
display: block;
}
}
.form-control {
@include form-validation-state-selector($state) {
border-color: $color;
@if $enable-validation-icons {
padding-right: $input-height-inner;
background-image: escape-svg($icon);
background-repeat: no-repeat;
background-position: right $input-height-inner-quarter center;
background-size: $input-height-inner-half $input-height-inner-half;
}
&:focus {
border-color: $color;
box-shadow: $focus-box-shadow;
}
}
}
// stylelint-disable-next-line selector-no-qualifying-type
textarea.form-control {
@include form-validation-state-selector($state) {
@if $enable-validation-icons {
padding-right: $input-height-inner;
background-position: top $input-height-inner-quarter right $input-height-inner-quarter;
}
}
}
.form-select {
@include form-validation-state-selector($state) {
border-color: $color;
@if $enable-validation-icons {
&:not([multiple]):not([size]),
&:not([multiple])[size="1"] {
padding-right: $form-select-feedback-icon-padding-end;
background-image: escape-svg($form-select-indicator), escape-svg($icon);
background-position: $form-select-bg-position, $form-select-feedback-icon-position;
background-size: $form-select-bg-size, $form-select-feedback-icon-size;
}
}
&:focus {
border-color: $color;
box-shadow: $focus-box-shadow;
}
}
}
.form-control-color {
@include form-validation-state-selector($state) {
@if $enable-validation-icons {
width: add($form-color-width, $input-height-inner);
}
}
}
.form-check-input {
@include form-validation-state-selector($state) {
border-color: $color;
&:checked {
background-color: $color;
}
&:focus {
box-shadow: $focus-box-shadow;
}
~ .form-check-label {
color: $color;
}
}
}
.form-check-inline .form-check-input {
~ .#{$state}-feedback {
margin-left: .5em;
}
}
.input-group {
> .form-control:not(:focus),
> .form-select:not(:focus),
> .form-floating:not(:focus-within) {
@include form-validation-state-selector($state) {
@if $state == "valid" {
z-index: 3;
} @else if $state == "invalid" {
z-index: 4;
}
}
}
}
}
Sarintany
Ity ny sarintany Sass fanamarinana avy amin'ny _variables.scss
. Amboary na hanitarana izany mba hamoronana fanjakana hafa na fanampiny.
$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
)
);
Ny sarintanin'ny $form-validation-states
dia mety ahitana mason-tsivana telo azo atao hanilihana ny toro-hevitra sy ny fomba fifantohana.
manome fitoerana
Ampiasaina hamerenana ny $form-validation-states
sandan'ny sari-tany mba hamoronana fomba fanamarinanay. Ny fanovana rehetra amin'ny sarintany Sass etsy ambony dia ho hita ao amin'ny CSS natambatrao amin'ny alalan'ity loop ity.
@each $state, $data in $form-validation-states {
@include form-validation-state($state, $data...);
}
Customizing
Ny fanjakana fanamarinana dia azo amboarina amin'ny alàlan'ny Sass miaraka amin'ny $form-validation-states
sarintany. Ao amin'ny _variables.scss
rakitray, ity sari-tany Sass ity dia ny fomba hamoronana ny fanjakana default valid
/ invalid
fanamarinana. Ao anatin'izany ny sarintany misy akany ho an'ny fanamboarana ny lokon'ny fanjakana tsirairay, ny kisary, ny lokon'ny fitaovana, ary ny aloky ny fifantohana. Na dia tsy misy fanjakana hafa tohanan'ny mpitety tranonkala aza, ireo mampiasa fomba fanao mahazatra dia afaka manampy mora foana ny fanehoan-kevitra sarotra kokoa.