Abschnitt 14 · Lektion 5
Synthese: das Kontaktformular
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
<p class="etikett">daneben</p>
<div class="feld feld--daneben">
<label for="a">Deine E-Mail-Adresse</label>
<input type="email" id="a">
</div>
<p class="etikett">darüber</p>
<div class="feld feld--drueber">
<label for="b">Deine E-Mail-Adresse</label>
<input type="email" id="b">
</div>
<p class="hinweis">
Schon auf dieser Breite bleibt oben für das Feld
kaum etwas übrig, denn das Label behält seine
Breite. Unten passiert nichts, weil beide die volle
Breite für sich haben. Noch schmaler wird es im
Vollbild über die Leiste mit den Gerätebreiten.
</p> *,
*::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
<form class="formular">
<div class="feld"><label>Name</label><input type="text"></div>
<div class="feld"><label>E-Mail</label><input type="email"></div>
<div class="feld feld--breit"><label>Nachricht</label><textarea rows="3"></textarea></div>
</form>
<p class="hinweis">
Name und E-Mail sind kurz und teilen sich eine Zeile.
Die Nachricht geht über beide Spalten, weil ein
halbbreites Textfeld niemandem hilft. Zwei Spalten
sind es hier bei jeder Breite, nur schmalere; das
Umschalten auf eine Spalte kommt erst in der
Aufgabe. Wie es mit Luft aussieht, siehst du, wenn
du ins Vollbild gehst.
</p> *,
*::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
<div class="aktionen">
<button class="knopf knopf--sekundaer" type="button">Abbrechen</button>
<button class="knopf knopf--primaer" type="button">Absenden</button>
</div>
<p class="hinweis">
Wird der Platz zu eng, rutscht der zweite Knopf in
eine neue Zeile, statt dass beide zusammengedrückt
werden. Die Voreinstellung Handy ist dafür noch zu
breit: trag in der Leiste darüber eine Breite von
Hand ein, etwa 280.
</p> *,
*::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, kostenlosZu 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.