表單驗證(Validation)

      通過瀏覽器默認行為或自定義樣式和JavaScript,通過HTML5表單驗證向用戶提供有價值的、可操作的反饋。

      雖然我們知道目前客戶端的自定義驗證樣式和工具提示是無障礙的,自從它們不暴露于輔助技術。在處理解決方案時,我們仍建議使用服務器端選項或默認瀏覽器驗證方法。

      工作原理

      下面是Bootstrap表單驗證的工作原理:

      • HTML表單驗證是通過CSS的兩個偽類:invalid和:valid應用的。它適用于input、select和textarea元素。
      • Bootstrap 作用域:invalid和:valid樣式到父.was-validated類,通常應用于form。否則,任何不帶值的必填字段在頁面加載時顯示為無效。這樣,您可以選擇何時激活它們(通常在嘗試提交表單之后)。
      • 要重置表單的外觀(例如,在使用AJAX提交動態表單的情況下),請在提交后再次從form中移除.was-validated類。
      • As a fallback, .is-invalid and .is-valid 作為回退,.is-invalid and .is-valid類可以代替偽類用于服務器端驗證。它們不需要.was-validated的父類。
      • 由于CSS工作方式的限制,如果沒有自定義JavaScript的幫助,我們(目前)無法將樣式應用到DOM中表單控件之前的label。
      • 所有現代瀏覽器都支持 約束驗證API,這是一系列用于驗證表單控件的JavaScript方法。
      • 反饋消息可以利用 瀏覽器默認值(每個瀏覽器的默認值不同,通過CSS不可改變)或我們的自定義反饋樣式以及額外的HTML和CSS。
      • 您可以在JavaScript中使用setCustomValidity提供自定義有效性消息。

      考慮到這一點,請考慮以下演示,以了解我們的自定義表單驗證樣式、可選服務器端類和瀏覽器默認值。

      自定義樣式

      對于自定義Bootstrap表單驗證消息,需要將novalidate布爾屬性添加到form。這將禁用瀏覽器默認的反饋工具提示,但仍提供對JavaScript中表單驗證api的訪問。嘗試提交以下表格;我們的JavaScript將截獲提交按鈕并向您傳遞反饋。嘗試提交時,您將看到:invalid和:valid樣式應用于表單控件。

      自定義反饋樣式應用自定義顏色、邊框、焦點樣式和背景圖標來更好地傳達反饋。select的背景圖標僅適用于.form-select,而不適用于.form-control

      Looks good!
      Looks good!
      @
      Please choose a username.
      Please provide a valid city.
      Please select a valid state.
      Please provide a valid zip.
      You must agree before submitting.
      <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)
      })
      })()
      

      瀏覽器的默認值

      對自定義驗證反饋消息或編寫JavaScript來更改表單行為不感興趣?很好,你可以使用瀏覽器的默認值。試著提交下面的表格。根據您的瀏覽器和操作系統,您將看到略有不同的反饋風格。

      雖然這些反饋樣式不能用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>

      服務器端驗證

      我們建議使用客戶端驗證,但如果需要服務器端驗證,可以用.is-invalid和.is-valid指示無效和有效的表單字段。注意。這些類也支持無效反饋。

      對于無效字段,請確保使用aria-describedby將無效反饋/錯誤消息與相關表單字段相關聯(注意,如果該字段已指向其他表單文本,則此屬性允許引用多個id)。

      若要解決邊界半徑的問題,輸入組需要額外的.has-validation

      Looks good!
      Looks good!
      @
      Please choose a username.
      Please provide a valid city.
      Please select a valid state.
      Please provide a valid zip.
      You must agree before submitting.
      <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>

      支持的元素

      驗證樣式可用于以下表單控件和組件:

      • <input>和帶有.form-control<textarea>(在輸入組中最多包括一個.form-control)
      • 帶有.form-select<select>
      • .form-checks
      Please enter a message in the textarea.
      Example invalid feedback text
      More example invalid feedback text
      Example invalid select feedback
      Example invalid form file feedback
      <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>

      工具提示

      如果表單布局允許,可以將.{valid|invalid}-feedback類替換為.{valid|invalid}-tooltip類,以在樣式化的工具提示中顯示驗證反饋。確保在工具提示定位時有一個帶有position: relative的父級。在下面的示例中,我們的列類已經有了這種設置,但是您的項目可能需要另一種設置。

      Looks good!
      Looks good!
      @
      Please choose a unique and valid username.
      Please provide a valid city.
      Please select a valid state.
      Please provide a valid zip.
      <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

      Variables

      $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.73L.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

      Two mixins are combined together, through our loop, to generate our form validation feedback styles.

      @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 {
        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-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,
      .input-group .form-select {
      @include form-validation-state-selector($state) {
      z-index: 3;
      }
      }
      }
      

      Map

      This is the validation Sass map from _variables.scss. Override or extend this to generate different or additional states.

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

      Maps of $form-validation-states can contain three optional parameters to override tooltips and focus styles.

      Loop

      Used to iterate over $form-validation-states map values to generate our validation styles. 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, $data...);
      }
      

      Customizing

      Validation states can be customized via Sass with the $form-validation-states map. Located in our _variables.scss file, this Sass map is how we generate the default valid/invalid validation states. Included is a nested map for customizing each state’s color, icon, tooltip color, and focus shadow. While no other states are supported by browsers, those using custom styles can easily add more complex form feedback.

      Please note that we do not recommend customizing $form-validation-states values without also modifying the form-validation-state mixin.

      返回頂部
      主站蜘蛛池模板: 中文字幕精品一区影音先锋| 精品人妻一区二区三区毛片| 精品一区二区三区免费毛片| 国产成人久久精品麻豆一区| 人妻视频一区二区三区免费| 亚洲AV无码一区二区三区DV| 国产SUV精品一区二区88L| 黄桃AV无码免费一区二区三区| 无码人妻精品一区二区三区99性| 亚洲乱色熟女一区二区三区丝袜| 一区二区传媒有限公司| 国产综合一区二区| 婷婷国产成人精品一区二 | 全国精品一区二区在线观看| 久久无码人妻一区二区三区| 亚洲日韩激情无码一区| 亚洲一区二区三区在线播放 | 国产成人无码一区二区在线播放| 全国精品一区二区在线观看| 国产亚洲综合一区二区三区| 国产精品视频免费一区二区| 国产精品无码亚洲一区二区三区| 亚洲区精品久久一区二区三区| 精品无码av一区二区三区| 久久se精品一区精品二区| 成人无码AV一区二区| 精品日产一区二区三区手机| 亚洲日韩精品无码一区二区三区| 少妇人妻偷人精品一区二区| 国产免费一区二区三区不卡| 无码成人一区二区| 国产精品香蕉在线一区| 亚洲A∨精品一区二区三区下载| 国产精品乱码一区二区三| 色综合久久一区二区三区| 高清一区二区在线观看| 国产激情一区二区三区成人91 | 97一区二区三区四区久久| 精品无码av一区二区三区| 人妻精品无码一区二区三区| 精品日韩一区二区|