TL;DR
- Inputs, knapper,
selectogtextareaarver ikke altid styling, som man forventer. - En lille CSS-starter gør formularer mere forudsigelige.
- Start med fornuftige defaults før du går i detaljer.
- Tænk i læsbarhed, klikbarhed og konsistens.
Hvis du kun husker én ting: Små CSS-greb som bredde, padding og border gør ofte mere for form-controls end mange smarte effekter.
Form-controls er lidt specielle
Et input ligner ikke nødvendigvis resten af siden, selv om du har stylet tekst og layout omkring det.
Det skyldes, at browseren giver mange form-controls deres egne defaults. Derfor føles forms ofte som et sted, hvor CSS “opfører sig anderledes”.
En CSS-starter gør arbejdet lettere
I stedet for at starte helt fra bunden hver gang, kan det give mening at have nogle få defaults:
box-sizing: border-boxsom gør elementers størrelser mere forudsigeligefont: inheritsom får felterne til at arve font-familie, størrelse og farvecolor: inheritsom sikrer at tekstfarven også arvesdisplay: blockpå labels, så de ikke ligger på samme linje som felterne- plus diverse andre små tweaks, der gør det lettere at style videre
Starteren indeholder også en bevidst reset af browserens margin og padding. Det gør udgangspunktet ensartet, men betyder samtidig, at enkelte nyttige browser-defaults skal tilføjes igen længere nede.
Det er ikke hele designet. Det er et kontrolleret udgangspunkt, som du stadig skal style videre på.
Download starter.cssGennemgang af CSS-starteren
1. Box model og reset
Starteren begynder med at gøre elementernes box model ens og fjerne browserens standardafstande:
*,::before,::after { box-sizing: border-box; margin: 0; padding: 0;}box-sizing: border-box betyder, at et elements angivne bredde og højde også inkluderer padding og border. Det gør størrelser lettere at regne med. Pseudo-elementerne ::before og ::after får samme box model som almindelige elementer.
margin: 0 og padding: 0 er en bred reset. Den fjerner også nyttige browser-defaults fra fx fieldset, option og popovers. Derfor får de elementer kontrollerede værdier tilbage senere i starteren.
2. Typografi og læsbarhed
De første regler giver siden nogle mere rolige og forudsigelige tekst-defaults:
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;}font-family og line-height gør teksten mere læsbar.
h1 og h2 får en lidt strammere linjehøjde, så overskrifter ikke virker for luftige.
text-wrap: pretty prøver at lave pænere linjeskift i brødtekst.
interpolate-size: allow-keywords; gør det muligt at animere til og fra keyword-værdier som auto.
3. Billeder og SVG’er
Billeder og SVG’er får nogle sikre defaults:
img,svg { display: block; width: 100%; height: auto;}display: block fjerner noget af den luft, billeder ellers kan få som inline-elementer.
width: 100% og height: auto gør dem mere fleksible i layouts.
4. Labels og form-controls
Her starter den del, som er mest relevant for forms:
label { display: block;}
input,button,textarea,select { font: inherit; color: inherit; background-color: transparent; font-size: max(1em, 16px); padding: 0; margin: 0;}label { display: block; } gør, at label og felt nemmere kan stå under hinanden.
font: inherit og color: inherit gør, at felterne bedre passer sammen med resten af siden.
padding: 0 og margin: 0 nulstiller browserens egne defaults, så du lettere selv kan style videre.
font-size: max(1em, 16px) er især smart på mobil, fordi meget små input-felter kan give mærkelig zoom.
5. Checkbox, radio og textarea
Nogle form-controls opfører sig lidt anderledes og har derfor brug for ekstra regler:
input:where([type="checkbox"],[type="radio"]) { width: 1em; height: 1em;}
textarea { resize: none; min-height: 4lh;}Checkboxes og radio buttons får en mere ens størrelse.
textarea får en minimumshøjde, så den ikke starter alt for lille.
resize: none fjerner browserens resize-håndtag, hvis man ikke ønsker det i designet.
6. Små special cases
Her får enkelte native elementer kontrollerede defaults tilbage efter den brede reset:
fieldset { padding-block: 0.35em 0.625em; padding-inline: 0.75em;}
legend { padding: 0;}
option { padding-inline: 8px;}
[popover] { margin: revert;}
select,::picker(select) { appearance: base-select;}fieldset og option får noget af den luft tilbage, som reset-reglen fjernede, mens legend fortsat nulstilles.
margin: revert giver popovers browserens native margin tilbage, så deres standardplacering bevares.
appearance: base-select gør det lettere at style select og den tilhørende picker mere ensartet i browsere, der understøtter funktionen.
7. Hjælpeklasse til skærmlæsere
Den sidste regel er en klassisk utility class:
.visually-hidden { position: absolute; width: 1px; height: 1px; overflow: hidden; white-space: nowrap; border: 0; padding: 0; margin: -1px; clip-path: inset(50%);}Den bruges, når noget skal være skjult visuelt, men stadig kunne læses af fx en skærmlæser. margin: -1px trækker den 1×1 pixel store boks væk fra en mulig scrollkant, mens clip-path skjuler selve indholdet.
Style anbefalinger
Når du styler felter, er det ofte de samme properties, der går igen:
borderborder-radiuspadding- evt.
box-shadow
Det vigtigste er ikke at memorere alt, men at opdage, hvilke få properties der gør størst forskel.
Demoer
Start med at se, hvorfor formularfelter ikke altid arver som forventet:
Prøv derefter selv at style felterne herunder og læg mærke til, hvordan en baggrundsfarve ikke virker på checkboxes mens det påvirker tekst-feltets stil (som du ligner noget fra 90’erne):
Og brug til sidst nogle anbefalede styles til tekstfelter og knapper:
Med få properties kan du komme langt, og det er bedre at mestre dem, før du begynder at tilføje flere detaljer.