Grundreglerne
<form>
<fieldset>
<legend>Operation System</legend>
<label>
<input>
Windows
</label>
<label>
<input>
Mac
</label>
<label>
<input>
Linux
</label>
</fieldset>
</form>eller valgfrie..?
Placeholders as labels
It's difficult to remember what information belongs in a field, and to check for and fix errors
— nngroup
Grupper labels og inputs visuelt
Saml beslægtede felter
Naturlig eller logisk rækkefølge
Enkeltkolonne-layouts
Marker obligatoriske felter tydeligt
Hjælp brugeren med eksempler og tydelige krav til input
Tilpas feltlængde til forventet input
Brug ikke placeholder-tekst som instruktion eller label
Vis fejlmeddelelser tæt på relevante felter og på det rigtige tidspunkt
Fejl skal formidles multimodalt
- Grupper labels og inputs visuelt
- Saml beslægtede felter
- Naturlig eller logisk rækkefølge
- Enkeltkolonne-layouts
- Marker obligatoriske felter tydeligt
- Hjælp brugeren med eksempler og tydelige krav til input
- Tilpas feltlængde til forventet input
- Brug ikke placeholder-tekst som instruktion eller label
- Vis fejlmeddelelser tæt på relevante felter og på det rigtige tidspunkt
- Fejl skal formidles multimodalt
🤷♂️
🤷♂️
Lad os style vores formular...
Layout
Look & feel
Adfærd
Look & feel
Farver, kanter, typografi, osv.
Et levn fra en svunden tid
Ligesom <img>'s
147px (Chrome)
148px (Safari)
189px (Firefox)
img {
max-width: 100%;
}Vent, hvad..?
Vent, hvad..?
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
img {
max-width: 100%;
height: auto;
display: block;
}Fornuftige defaults, version 1
Det, vi gør nu
Måske? 🤷♂️
*,
::before,
::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
interpolate-size: allow-keywords;
font-family: system-ui, sans-serif;
line-height: 1.5;
-webkit-font-smoothing: antialiased;
}
h1,
h2 {
line-height: 1.25;
}
p,
li {
text-wrap: pretty;
}
img,
svg {
display: block;
width: 100%;
height: auto;
}
label {
display: block;
}
input,
button,
textarea,
select {
font: inherit;
color: inherit;
background-color: transparent;
font-size: max(1em, 16px);
}
textarea {
resize: none;
min-height: 4lh;
}
legend {
padding: 0;
}
select,
::picker(select) {
appearance: base-select;
}Fornuftige defaults, version 2
Det, vi gør om lidt
Et bedre udgangspunkt
Til input, textarea, select, button
- border
- border-radius
- padding
- evt. color, box-shadowbutton {
cursor: pointer;
}Til checkbokse, radioknapper
form {
accent-color: deeppink;
}øvelse 5
Få formularen til nogenlunde at ligne denne. Vent med mellemrum mellem felterne.
NB: Vores CSS Starter er tilføjet
(lad den være åben)
- Inputs,
- Button,
- Checkbox,
- Fejlbeskeder
Layout
Placering, gruppering, Grid, Flexbox, spacing, osv.
Elementer er inline
label {
display: block;
}Elementer er inline
Grupper labels og inputs visuelt
HUSK:
<form>
<div class="form-group">
<label for="name">Fulde navn</label>
<input type="text" id="name" name="full-name" />
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" />
</div>
<button>Send formular</button>
</form>Grupper felter
<form>
<div class="form-group">
<label for="name">Fulde navn</label>
<input type="text" id="name" name="full-name" />
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" />
</div>
<button>Send formular</button>
</form>Grupper felter
<form>
<div class="form-group">
<label for="name">Fulde navn</label>
<input type="text" id="name" name="full-name" />
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" />
</div>
<button>Send formular</button>
</form>gapGrupper felter
form {
display: grid;
gap: 2rem;
}
.form-group {
display: grid;
gap: 3px;
}<form>
<div class="form-group">
<label for="name">Fulde navn</label>
<input type="text" id="name" name="full-name" />
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" />
</div>
<button>Send formular</button>
</form>Brug Grid
form {
display: grid;
gap: 2rem;
}
.form-group {
display: grid;
gap: 3px;
}<form>
<div class="form-group">
<label for="name">Fulde navn</label>
<input type="text" id="name" name="full-name" />
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" />
</div>
<button>Send formular</button>
</form>Brug Grid
Checkbokse/Radioknapper
<form>
...
<label for="spiderman">
<input
type="radio"
id="spiderman"
name="superhero"
value="spiderman">
Spider-man
</label>
...
</form>
Brug Flexbox
<form>
...
<label for="spiderman">
<input
type="radio"
id="spiderman"
name="superhero"
value="spiderman">
Spider-man
</label>
...
</form>
label:has(input) {
display: flex;
align-items: center;
gap: .75ch;
}label:has(input) {
display: flex;
align-items: center;
gap: .75ch;
}Brug Flexbox
øvelse 6
Få formularen til nogenlunde at ligne denne ift. layoutet.
(lad den være åben)
- Grid,
- Flexbox,
- Reducer evt. afstand
For meget afstand?
For meget afstand?
For meget afstand?
For meget afstand?
Adfærd
Brugerhandlinger og input-state (tilstandsform)
spil-øvelse
Gennemfør alle 8 levels og bliv opmærksom på, hvor vigtige "focus states" er i forhold til keyboard accessibility (link på Fronter).
En CSS pseudo-klasse er et nøgleord tilføjet til en selector, der specificerer en særlig tilstand af det valgte element(er). For eksempel kan :hover bruges til at ændre en knaps farve, når brugerens markør er over den.
:hover
:focus-visible
:active
:user-valid
:user-invalid
:required
:hover
:focus-visible
:active
:user-valid
:user-invalid
:required
Brugerhandlinger
Input-state
(tilstandsform)
:focus-visible {
outline: 2px solid orange;
outline-offset: 1px;
/* evt. box-shadow */
}Fokus v/ tastatur-navigation
- input, textarea, select osv.
:focus-visible
:focus-visible {
/* Focus states */
}
button:hover {
/* Hover states */
}
button:active {
/* Pressed states */
}Generel interaktion
- button
øvelse 7
Tilføj regler for brugerhandlinger til hhv. input-felter og knappen.
(lad den være åben)
- :focus-visible
- outline
- :hover, :active (button)
- background, scale
:focus-visible
:focus-visible
:hover
:active
Form validation
Vis fejlmeddelelser tæt på relevante felter og på det rigtige tidspunkt
Hvad er der galt?
Skjul fejlmeddelelser før interaktion
.error-message {
display: none;
}"Hvis feltet ikke opfylder kriteriet, vis da fejlbesked"
Kriterie =
email-format
Browseren kan selv holde styr på, om e-mail-felter er udfyldt korrekt
via attributter som required og minlength
Vi skal fortælle formularen, hvilke inputs der er obligatoriske, samt hvilke kriterier de skal opfylde, så den kan give os den korrekte status.
"Hvis feltet ikke opfylder kriteriet, vis da fejlbesked"
Kriterie =
feltet er obligatorisk
*
*
"Feltet skal udfyldes"
<div>
<label>First name</label>
<input required />
<p>Please enter a value</p>
</div>"Hvis feltet ikke opfylder kriteriet, vis da fejlbesked"
Kriterie =
mindst 8 tegn (e.l.)
*
*
"Feltet skal udfyldes, og der skal mindst være 8 tegn"
<div>
<label>Password</label>
<input minlength="8" required />
<p>Please enter a value</p>
</div>:user-valid
:user-invalid
:required
.form-group:has(:required) {
label::after {
content: " *";
color: red;
}
}"Hvis .form-group har et obligatorisk felt,
så tilføj en stjerne til label"
.form-group:has(:user-invalid) {
input {
outline: 3px solid #f005;
border-color: darkred;
}
}"Hvis .form-group har et ugyldigt felt,
så tilføj rød kant omkring input-feltet"
.form-group:has(:user-invalid) {
input {
outline: 3px solid #f005;
border-color: darkred;
}
.error-message {
display: block;
}
}"Hvis .form-group har et ugyldigt felt,
så vis fejlmeddelelsen"
øvelse 8
Tilføj required i HTML og brug pseudo-klasserne til at style gyldige/ugyldige felter.
(lad den være åben)
- :user-valid,
- :user-invalid,
- :required
:user-invalid
:user-valid
Tilføj meddelelse
Tilføj stjerne