Zum Hauptinhalt springen Zur Dokumentennavigation springen
Check
in English

Validierung

Geben Sie Ihren Benutzern wertvolles, umsetzbares Feedback mit HTML5-Formularvalidierung, über Standardverhalten des Browsers oder benutzerdefinierte Stile und JavaScript.

Uns ist bewusst, dass derzeit nicht auf die clientseitigen benutzerdefinierten Validierungsstile und QuickInfos zugegriffen werden kann, da sie nicht für unterstützende Technologien verfügbar sind. Während wir an einer Lösung arbeiten, empfehlen wir, entweder die serverseitige Option oder die Standard-Browser-Validierungsmethode zu verwenden.

Wie es funktioniert

So funktioniert die Formularvalidierung mit Bootstrap:

  • Die HTML-Formularvalidierung wird über die beiden Pseudoklassen von CSS :invalidund :valid. Es gilt für <input>, <select>, und <textarea>Elemente.
  • Bootstrap ordnet die Stile :invalidund :validder übergeordneten .was-validatedKlasse zu, die normalerweise auf die <form>. Andernfalls wird jedes erforderliche Feld ohne Wert beim Laden der Seite als ungültig angezeigt. Auf diese Weise können Sie auswählen, wann sie aktiviert werden sollen (normalerweise nachdem versucht wurde, das Formular einzureichen).
  • Um das Erscheinungsbild des Formulars zurückzusetzen (z. B. bei dynamischen Formularübermittlungen mit AJAX), entfernen Sie die .was-validatedKlasse <form>nach der Übermittlung wieder aus der.
  • Als Fallback können statt der Pseudo-Klassen auch Klassen für die .is-invalidserverseitige Validierung verwendet werden . Sie benötigen keine Elternklasse ..is-valid.was-validated
  • Aufgrund von Einschränkungen bei der Funktionsweise von CSS können wir (derzeit) <label>ohne die Hilfe von benutzerdefiniertem JavaScript keine Stile auf ein anwenden, das vor einem Formularsteuerelement im DOM steht.
  • Alle modernen Browser unterstützen die Constraint Validation API , eine Reihe von JavaScript-Methoden zur Validierung von Formularsteuerelementen.
  • Feedback-Nachrichten können die Browser-Standardeinstellungen (je nach Browser unterschiedlich und nicht per CSS anpassbar) oder unsere benutzerdefinierten Feedback-Stile mit zusätzlichem HTML und CSS verwenden.
  • setCustomValiditySie können in JavaScript benutzerdefinierte Gültigkeitsmeldungen bereitstellen .

Betrachten Sie vor diesem Hintergrund die folgenden Demos für unsere benutzerdefinierten Formularvalidierungsstile, optionalen serverseitigen Klassen und Browserstandards.

Benutzerdefinierte Stile

Für benutzerdefinierte Bootstrap-Formularvalidierungsmeldungen müssen Sie das novalidateboolesche Attribut zu Ihrer <form>. Dadurch werden die standardmäßigen Feedback-QuickInfos des Browsers deaktiviert, es wird jedoch weiterhin Zugriff auf die Formularvalidierungs-APIs in JavaScript bereitgestellt. Versuchen Sie, das unten stehende Formular abzusenden; Unser JavaScript fängt die Senden-Schaltfläche ab und leitet das Feedback an Sie weiter. Wenn Sie versuchen zu senden, sehen Sie die auf Ihre Formularsteuerelemente angewendeten Stile :invalidund .:valid

Benutzerdefinierte Feedbackstile wenden benutzerdefinierte Farben, Rahmen, Fokusstile und Hintergrundsymbole an, um Feedback besser zu kommunizieren. Hintergrundsymbole für <select>s sind nur mit verfügbar .form-selectund nicht mit .form-control.

Sieht gut aus!
Sieht gut aus!
@
Bitte wählen Sie einen Benutzernamen.
Bitte geben Sie eine gültige Stadt an.
Bitte wählen Sie ein gültiges Bundesland aus.
Bitte geben Sie eine gültige Postleitzahl an.
Sie müssen vor dem Absenden zustimmen.
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)
  })
})()

Browser-Standardeinstellungen

Sie sind nicht an benutzerdefinierten Validierungs-Feedbacknachrichten oder dem Schreiben von JavaScript zum Ändern des Formularverhaltens interessiert? Alles gut, Sie können die Standardeinstellungen des Browsers verwenden. Versuchen Sie, das unten stehende Formular zu senden. Je nach Browser und Betriebssystem sehen Sie ein etwas anderes Feedback.

Obwohl diese Feedback-Stile nicht mit CSS gestaltet werden können, können Sie den Feedback-Text dennoch über JavaScript anpassen.

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

Serverseitig

Wir empfehlen die clientseitige Validierung, aber falls Sie eine serverseitige Validierung benötigen, können Sie ungültige und gültige Formularfelder mit .is-invalidund angeben .is-valid. Beachten Sie, dass .invalid-feedbackdies auch mit diesen Klassen unterstützt wird.

Stellen Sie bei ungültigen Feldern sicher, dass die ungültige Rückmeldung/Fehlermeldung mit dem entsprechenden Formularfeld verknüpft ist aria-describedby(beachten Sie, dass dieses Attribut die idReferenzierung auf mehr als eines zulässt, falls das Feld bereits auf zusätzlichen Formulartext verweist).

Um Probleme mit border radius zu beheben , benötigen Eingabegruppen eine zusätzliche .has-validationKlasse.

Sieht gut aus!
Sieht gut aus!
@
Bitte wählen Sie einen Benutzernamen.
Bitte geben Sie eine gültige Stadt an.
Bitte wählen Sie ein gültiges Bundesland aus.
Bitte geben Sie eine gültige Postleitzahl an.
Sie müssen vor dem Absenden zustimmen.
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>

Unterstützte Elemente

Validierungsstile sind für die folgenden Formularsteuerelemente und -komponenten verfügbar:

  • <input>s und <textarea>s mit .form-control(einschließlich bis zu einem .form-controlin Eingangsgruppen)
  • <select>s mit.form-select
  • .form-checks
Bitte geben Sie eine Nachricht in das Textfeld ein.
Beispiel für ungültigen Feedbacktext
Weiteres Beispiel für ungültigen Feedback-Text
Beispiel für ungültiges Auswahl-Feedback
Beispiel für ungültiges Formulardatei-Feedback
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>

Kurzinfos

Wenn Ihr Formularlayout dies zulässt, können Sie die .{valid|invalid}-feedbackKlassen gegen .{valid|invalid}-tooltipKlassen austauschen, um das Validierungsfeedback in einem formatierten Tooltip anzuzeigen. Stellen Sie sicher, dass ein übergeordnetes position: relativeElement für die Tooltip-Positionierung darauf steht. Im Beispiel unten haben unsere Spaltenklassen dies bereits, aber Ihr Projekt erfordert möglicherweise eine alternative Einrichtung.

Sieht gut aus!
Sieht gut aus!
@
Bitte wählen Sie einen eindeutigen und gültigen Benutzernamen.
Bitte geben Sie eine gültige Stadt an.
Bitte wählen Sie ein gültiges Bundesland aus.
Bitte geben Sie eine gültige Postleitzahl an.
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

Variablen

$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

Zwei Mixins werden durch unsere Schleife miteinander kombiniert , um unsere Formularvalidierungs-Feedbackstile zu generieren.

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

Karte

Dies ist die Validierungs-Sass-Karte von _variables.scss. Überschreiben oder erweitern Sie dies, um andere oder zusätzliche Zustände zu generieren.

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

Karten von $form-validation-stateskönnen drei optionale Parameter enthalten, um QuickInfos und Fokusstile zu überschreiben.

Schleife

$form-validation-statesWird verwendet, um über Kartenwerte zu iterieren , um unsere Validierungsstile zu generieren. Alle Änderungen an der obigen Sass-Karte werden über diese Schleife in Ihrem kompilierten CSS wiedergegeben.

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

Anpassen

Validierungszustände können über Sass mit der $form-validation-statesKarte angepasst werden. Diese Sass-Karte befindet sich in unserer _variables.scssDatei und ist die Art und Weise, wie wir die Standard- valid/ invalidValidierungszustände generieren. Enthalten ist eine verschachtelte Karte zum Anpassen der Farbe, des Symbols, der Tooltip-Farbe und des Fokusschattens jedes Zustands. Obwohl keine anderen Zustände von Browsern unterstützt werden, können diejenigen, die benutzerdefinierte Stile verwenden, problemlos komplexeres Formular-Feedback hinzufügen.