mitmario.dev

Synthese: das Kontaktformular

CSS Im Browser 3 Min Lesezeit 3 BeispieleLektion 5 von 6

Das Formular ist das letzte Stück des Portfolios. Neue Eigenschaften kommen keine dazu, dafür treffen sich hier fünf Abschnitte auf einmal: das Raster aus Abschnitt 10, die Haltepunkte aus 12, die Flexbox aus 9, die Zustände aus 14.2 und die Tokens aus 5.5.

Das Label gehört über das Feld

Label über dem Feld
*,
*::before,
*::after {
  box-sizing: border-box;
}

body {
  margin: 0;
  padding: 24px;
  font-family: system-ui, sans-serif;
  font-size: 16px;
  line-height: 1.5;
}

.etikett {
  margin: 0 0 8px 0;
  font-size: 14px;
  color: #52525b;
}

.feld {
  margin-bottom: 32px;
}

.feld--daneben {
  display: grid;
  grid-template-columns: auto 1fr;
  align-items: center;
  gap: 12px;
}

.feld--drueber {
  display: grid;
  gap: 4px;
}

input {
  width: 100%;
  padding: 10px 12px;
  border: 1px solid #d4d4d8;
  border-radius: 8px;
  font: inherit;
}

.hinweis {
  max-width: 60ch;
  color: #52525b;
}

Es gibt zwei Möglichkeiten, ein Label zu setzen, und die Entscheidung ist keine Geschmacksfrage.

Steht es daneben, brauchst du eine feste Spaltenbreite. Die muss zum längsten Label passen, und beim ersten längeren Text stimmt sie nicht mehr. Auf schmalen Bildschirmen bleibt für das Feld selbst kaum etwas übrig, und in einer Sprache mit längeren Wörtern bricht die Anordnung ganz.

Steht es darüber, hat es die volle Breite für sich. Es überlebt jede Bildschirmbreite, jede Textlänge und jede Übersetzung, und das Auge läuft in einer geraden Linie von oben nach unten durch das Formular. Deshalb ist das der Normalfall, und der andere die Ausnahme mit Begründung.

Das Raster

Zwei Spalten und ein breites Feld
*,
*::before,
*::after {
  box-sizing: border-box;
}

body {
  margin: 0;
  padding: 24px;
  font-family: system-ui, sans-serif;
  font-size: 16px;
  line-height: 1.5;
}

.formular {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
  max-width: 640px;
}

.feld {
  display: grid;
  gap: 4px;
}

.feld--breit {
  grid-column: span 2;
}

label {
  font-size: 14px;
  color: #3f3f46;
}

input,
textarea {
  width: 100%;
  padding: 10px 12px;
  border: 1px solid #d4d4d8;
  border-radius: 8px;
  font: inherit;
  resize: vertical;
}

.hinweis {
  max-width: 60ch;
  margin-top: 24px;
  color: #52525b;
}

Ein Formular ist ein Raster, kein Stapel. Auf breiten Bildschirmen teilen sich kurze Felder wie Vorname und Nachname eine Zeile, lange Felder bekommen die volle Breite.

Die Feldgruppe selbst ist dabei auch ein kleines Raster: Label und Feld untereinander, mit wenig Abstand. Das ist der übliche Fall, in dem zwei Raster ineinanderstecken, und keins von beiden weiß etwas vom anderen.

Über beide Spalten geht ein Feld mit grid-column: span 2. Das Nachrichtenfeld gehört dazu, denn ein halbbreites Textfeld hilft niemandem: Man schreibt dort mehrere Sätze, und die brauchen Zeilenlänge.

Ein Stolperstein dabei. Ist das Formular auf schmalen Bildschirmen einspaltig, darf span 2 dort nicht gelten. Ein Element, das zwei Spalten überspannen will, wo es nur eine gibt, lässt den Browser eine zweite anlegen, und plötzlich ist das Formular doch zweispaltig, nur schlechter. Beides gehört deshalb in dieselbe Media Query: die zweite Spalte und alles, was sie überspannt.

Die Knopfzeile

Die Knopfzeile rechts
*,
*::before,
*::after {
  box-sizing: border-box;
}

body {
  margin: 0;
  padding: 24px;
  font-family: system-ui, sans-serif;
  font-size: 16px;
  line-height: 1.5;
}

.aktionen {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 12px;
}

.knopf {
  min-height: 44px;
  padding: 10px 18px;
  border: 2px solid #2563eb;
  border-radius: 8px;
  font: inherit;
  cursor: pointer;
}

.knopf--primaer {
  color: #ffffff;
  background-color: #2563eb;
}

.knopf--sekundaer {
  color: #1d4ed8;
  background-color: transparent;
}

.hinweis {
  max-width: 60ch;
  margin-top: 24px;
  color: #52525b;
}

Am Ende stehen ein bis zwei Knöpfe, und dafür ist Flexbox richtig: Sie sollen nebeneinanderstehen, rechtsbündig, mit Abstand dazwischen, und nicht in ein Raster gezwängt werden. justify-content: flex-end schiebt sie ans Ende, gap hält sie auseinander.

flex-wrap: wrap gehört dazu. Wird es eng, rutscht der zweite Knopf in eine neue Zeile, statt dass beide so schmal werden, dass ihre Beschriftung umbricht.

Die Reihenfolge: Die wichtigste Aktion steht rechts außen, dort landet der Blick zuletzt und der Daumen zuerst. Abbrechen steht links davon und sieht ruhiger aus, damit niemand aus Versehen die falsche Taste trifft.

Was du dabei nicht siehst

Die Rückmeldung. Ein Formular sieht im Ruhezustand am besten aus und wird erst dann geprüft, wenn jemand es benutzt: der Fokusring beim Durchtabben, die rote Markierung nach einer falschen Eingabe, der gesperrte Knopf während des Absendens.

Geh dein Formular deshalb einmal komplett mit der Tastatur durch, bevor du es für fertig hältst. Das dauert zwanzig Sekunden und findet mehr Fehler als jeder zweite Blick auf das Layout.

Zum Mitnehmen

Das Kontaktformular ist das letzte Stück des Portfolios und der Baustein, in dem am meisten zusammenkommt: Raster für die Anordnung, Flexbox für die Knopfzeile, Zustände für die Rückmeldung und Tokens für alles Farbige.

Jetzt du

Basis Konto, kostenlos

Zu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.

Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.

Was in dieser Lektion steckt

  • Artikel mit 3 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe im Editor, direkt im Browser geprüft

    Öffnet sich mit dem Basis Konto.