表單驗證(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一区二区三区| 无码国产精品久久一区免费 | 韩日午夜在线资源一区二区| 波多野结衣一区在线观看| 国产成人亚洲综合一区| 亚洲一区二区在线免费观看| 亚洲av无码一区二区三区不卡| 一区二区三区高清视频在线观看| 亚洲第一区二区快射影院| 国产suv精品一区二区33| 中文字幕精品一区二区精品| 亚洲熟妇av一区二区三区| 中文字幕在线无码一区| 中文字幕在线观看一区二区| 日本不卡一区二区三区视频| 久久亚洲国产精品一区二区| 中文字幕av无码一区二区三区电影| 久久精品视频一区二区三区| 精品伦精品一区二区三区视频 | 制服美女视频一区| 亚洲AV无码一区二区三区系列| 亚洲AV无码一区东京热久久| 精品一区二区三区影院在线午夜| 日本一区二区三区日本免费| 亚洲AV成人精品一区二区三区| 日本高清成本人视频一区| 成人精品视频一区二区三区不卡| 国产一区二区精品久久岳√| 中文字幕日韩一区二区不卡| 国产精品视频一区麻豆| 国内偷窥一区二区三区视频| 久久久无码一区二区三区| 一区二区三区伦理高清| 一区二区三区视频在线|