Saltu al ĉefa enhavo Saltu al navigado de dokumentoj
Check
in English

Valido

Provizu valorajn, ageblajn komentojn al viaj uzantoj per HTML5-formula validigo, per retumilo defaŭltaj kondutoj aŭ kutimaj stiloj kaj JavaScript.

Ni konscias, ke nuntempe la klientflankaj kutimaj validumaj stiloj kaj konsiletoj ne estas alireblaj, ĉar ili ne estas elmontritaj al helpaj teknologioj. Dum ni laboras pri solvo, ni rekomendus aŭ uzi la servilflankan opcion aŭ la defaŭltan retumilon validigan metodon.

Kiel ĝi funkcias

Jen kiel validado de formularoj funkcias kun Bootstrap:

  • HTML-formvalidigo estas aplikata per la du pseŭdoklasoj de CSS, :invalidkaj :valid. Ĝi validas por <input>, <select>, kaj <textarea>elementoj.
  • Bootstrap ampleksas la :invalidkaj :validstilojn al gepatra .was-validatedklaso, kutime aplikita al la <form>. Alie, ajna postulata kampo sen valoro aperas kiel nevalida ĉe paĝa ŝarĝo. Tiel, vi povas elekti kiam aktivigi ilin (tipe post kiam la formularo estas provita).
  • Por restarigi la aspekton de la formularo (ekzemple, en la kazo de dinamikaj formularaj sendadoj uzante AJAX), forigu la .was-validatedklason de la <form>denove post sendo.
  • Kiel rezerva, .is-invalidkaj .is-validklasoj povas esti uzataj anstataŭ la pseŭdo-klasoj por servilflanka validumado . Ili ne postulas .was-validatedgepatran klason.
  • Pro limoj en kiel CSS funkcias, ni ne povas (nuntempe) apliki stilojn al <label>kiu venas antaŭ formo-kontrolo en la DOM sen la helpo de kutima JavaScript.
  • Ĉiuj modernaj retumiloj subtenas la limigan validumadon API , serion de JavaScript-metodoj por validigi formularajn kontrolojn.
  • Reagomesaĝoj povas utiligi la defaŭltajn retumilon (malsamajn por ĉiu retumilo, kaj malstileblajn per CSS) aŭ niajn kutimajn retrostilojn kun pliaj HTML kaj CSS.
  • Vi povas provizi kutimajn validecajn mesaĝojn setCustomValidityen JavaScript.

Konsiderante tion, konsideru la sekvajn demonstraĵojn por niaj kutimaj formularaj validigaj stiloj, laŭvolaj servilflankaj klasoj kaj retumiloj defaŭltaj.

Propraj stiloj

Por kutimaj Bootstrap formularvalidigaj mesaĝoj, vi devos aldoni la novalidatebulean atributon al via <form>. Ĉi tio malŝaltas la defaŭltajn sugestajn konsiletojn de la retumilo, sed ankoraŭ disponigas aliron al la API-validigaj formularoj en JavaScript. Provu sendi la suban formularon; nia JavaScript kaptos la sendi butonon kaj sendos komentojn al vi. Kiam vi provas sendi, vi vidos la stilojn :invalidkaj aplikatajn al viaj formularaj kontroloj.:valid

Propraj sugestiloj aplikas kutimajn kolorojn, randojn, fokusajn stilojn kaj fonajn ikonojn por pli bone komuniki komentojn. Fonaj piktogramoj por <select>s disponeblas nur kun .form-select, kaj ne .form-control.

Aspektas bone!
Aspektas bone!
@
Bonvolu elekti uzantnomon.
Bonvolu provizi validan urbon.
Bonvolu elekti validan ŝtaton.
Bonvolu doni validan zipon.
Vi devas konsenti antaŭ ol sendi.
html
<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)
  })
})()

Retumilo defaŭlta

Ne interesiĝas pri kutimaj validigaj sugestaj mesaĝoj aŭ skribi JavaScript por ŝanĝi formajn kondutojn? Ĉio bone, vi povas uzi la defaŭltajn retumilon. Provu sendi la suban formularon. Depende de via retumilo kaj OS, vi vidos iomete malsaman stilon de retrosciigo.

Kvankam ĉi tiuj sugestiloj ne povas esti stilitaj per CSS, vi ankoraŭ povas personecigi la sugestajn tekstojn per JavaScript.

@
html
<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>

Servila flanko

Ni rekomendas uzi klientflankan validigon, sed se vi postulas servilflankan validigon, vi povas indiki nevalidajn kaj validajn formularajn kampojn per .is-invalidkaj .is-valid. Notu, ke .invalid-feedbackankaŭ estas subtenata kun ĉi tiuj klasoj.

Por nevalidaj kampoj, certigu, ke la nevalida sugesto/erarmesaĝo estas asociita kun la koncerna formularkampo uzante aria-describedby(rimarkante, ke ĉi tiu atributo permesas idreferenci pli ol unu, se la kampo jam montras al plia formo-teksto).

Por solvi problemojn kun limradiuso , enigogrupoj postulas plian .has-validationklason.

Aspektas bone!
Aspektas bone!
@
Bonvolu elekti uzantnomon.
Bonvolu provizi validan urbon.
Bonvolu elekti validan ŝtaton.
Bonvolu doni validan zipon.
Vi devas konsenti antaŭ ol sendi.
html
<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>

Subtenataj elementoj

Validaj stiloj disponeblas por la sekvaj formularaj kontroloj kaj komponantoj:

  • <input>s kaj <textarea>s kun .form-control(inkluzive de ĝis unu .form-controlen eniggrupoj)
  • <select>s kun.form-select
  • .form-checks
Bonvolu enigi mesaĝon en la teksta areo.
Ekzemplo nevalida sugesta teksto
Pli da ekzemplo nevalida sugesta teksto
Ekzemplo nevalida elekta sugesto
Ekzemplo nevalida formulardosiera sugesto
html
<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>

Konsiletoj

Se via formulararanĝo permesas ĝin, vi povas interŝanĝi la .{valid|invalid}-feedbackklasojn por .{valid|invalid}-tooltipklasoj por montri validigajn sugestojn en stilita konsileto. Nepre havu gepatron kun position: relativeĝi por poziciigado de konsileto. En la malsupra ekzemplo, niaj kolumnaj klasoj jam havas ĉi tion, sed via projekto eble postulas alternativan aranĝon.

Aspektas bone!
Aspektas bone!
@
Bonvolu elekti unikan kaj validan uzantnomon.
Bonvolu provizi validan urbon.
Bonvolu elekti validan ŝtaton.
Bonvolu doni validan zipon.
html
<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

Variabloj

$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>");

Miksinoj

Du miksaĵoj estas kombinitaj kune, tra nia buklo , por generi niajn formularajn validigajn sugestajn stilojn.

@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;
        }
      }
    }
  }
}

Mapo

Ĉi tio estas la validuma Sass-mapo de _variables.scss. Anstataŭigi aŭ etendi ĉi tion por generi malsamajn aŭ pliajn ŝtatojn.

$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
  )
);

Mapoj de $form-validation-statespovas enhavi tri laŭvolajn parametrojn por anstataŭi konsiletojn kaj fokusajn stilojn.

Buklo

Uzita por ripetadi super $form-validation-statesmapvaloroj por generi niajn validigajn stilojn. Ajna modifo al ĉi-supra Sass-mapo estos reflektita en via kompilita CSS per ĉi tiu buklo.

@each $state, $data in $form-validation-states {
  @include form-validation-state($state, $data...);
}

Agordado

Validaj ŝtatoj povas esti personecigitaj per Sass kun la $form-validation-statesmapo. Lokita en nia _variables.scssdosiero, ĉi tiu Sass-mapo estas kiel ni generas la defaŭltajn valid/ invalidvalidigajn statojn. Inkluzivita estas nestita mapo por agordi la koloron, ikonon, konsileblan koloron kaj fokusan ombron de ĉiu ŝtato. Dum neniuj aliaj ŝtatoj estas subtenataj de retumiloj, tiuj, kiuj uzas kutimajn stilojn, povas facile aldoni pli kompleksajn formularajn sugestojn.