Interaktion & feedback

Varje klick förtjänar ett svar

En användare klickar på en knapp. Inget händer visuellt. Vad gör de?

De klickar igen. Och igen. Kanske dubbel- eller trippelklickar. Om det var ett formulär skickar de nu tre beställningar.

Det här är inte ett hypotetiskt scenario. Det händer varje dag på sidor som saknar interaktionsfeedback. Feedback är grundläggande kommunikation mellan gränssnitt och användare, och lika mycket en del av designen som typografin i förra delen. Sidan ska inte bara se trovärdig ut, den ska kännas trovärdig när man rör vid den.

States på interaktiva element

Varje interaktivt element, som en knapp, länk eller input, har flera states. De flesta stylar default och :hover, och glömmer resten. Det är begripligt: :focus och :active syns mer sällan och ger inte samma visuella effekt. Men det är precis de som avgör om sidan går att använda utan mus. Det som syns minst i din egen testning är avgörande för den som navigerar med tangentbord.

Default

Utgångsläget. Här sätter du grundutseendet, och ett löfte: cursor: pointer visar handen som säger “det här går att klicka på”. Webbläsaren gör det automatiskt för <a>, men inte för <button> och andra klickbara element, så sätt den själv.

.btn {
    background-color: #0057b8;
    color: white;
    padding: 0.75rem 1.5rem;
    border: 2px solid transparent;
    border-radius: 0.25rem;
    cursor: pointer;
}

:hover

Aktiveras när muspekaren vilar över elementet. Den vanligaste feedbacken, och en mörkare nyans räcker långt: den säger “jag hör dig”. Kom ihåg att hover inte finns på pekskärmar, så den får aldrig ensam bära viktig information.

.btn:hover {
    background-color: #004494;
}

:active

Aktiveras medan elementet hålls nedtryckt. En ännu mörkare nyans och en förflyttning på en enda pixel nedåt ger en fysisk tryckkänsla.

.btn:active {
    background-color: #003070;
    transform: translateY(1px);
}

:focus

Aktiveras när elementet har tangentbordsfokus. Det är den state som oftast glöms bort, och samtidigt den enda ledtråden om var på sidan en tangentbordsanvändare befinner sig. Den är så viktig att den får ett eget avsnitt.

:focus och :focus-visible

:focus aktiveras när ett element har tangentbordsfokus, det är den enda visuella ledtråden för tangentbordsanvändare om var de befinner sig på sidan.

:focus-visible är en modernare variant: den aktiveras bara när fokus kom via tangentbord, inte via musklick. Det gör att knappen inte får en synlig outline när du klickar på den med musen, men alltid visar den vid tangentbordsnavigering.

Den gamla metoden aktiveras alltid, även vid musklick:

.btn:focus {
    outline: 3px solid #0057b8;
}

Den moderna aktiveras bara vid tangentbordsfokus:

.btn:focus-visible {
    outline: 3px solid #0057b8;
    outline-offset: 3px;
}

Användbar kombo: nollställ webbläsarens standard och sätt ditt eget. Nollställningen får bara ske så här, i samma stund som ersättaren finns på plats:

.btn:focus {
    outline: none;
}

.btn:focus-visible {
    outline: 3px solid #0057b8;
    outline-offset: 3px;
}

Transitions

transition gör att state-ändringar sker mjukt istället för abrupt. En knapp som byter bakgrundsfärg direkt kan upplevas som ett fel. En mjuk övergång kommunicerar avsikt.

.btn {
    background-color: #0057b8;
    transition: background-color 0.2s ease;
}

.btn:hover {
    background-color: #004494;
}

Raden läses: animera background-color, under 0.2 sekunder, med mjuk easing. När hover byter färgen sker övergången gradvis i stället för omedelbart.

Du kan animera flera egenskaper:

.btn {
    transition:
        background-color 0.2s ease,
        transform 0.1s ease;
}

Animations-etik

Animationer ska tjäna kommunikationen, inte stjäla uppmärksamheten. En 0.2s transition på background-color är subtil och naturlig. En 2s rotation på knappen är ett hinder.

Som minimum: respektera prefers-reduced-motion. Vissa användare mår illa av rörliga gränssnitt. Du känner kanske igen blocket från CSS-reset-delens utmaning:

@media (prefers-reduced-motion: reduce) {
    * {
        transition: none !important;
        animation: none !important;
    }
}

Uppgift: Levande knappar

Ta knappen och kortet du byggde i de förra delarna och gör dem interaktiva.

  1. Lägg till :hover på knappen: en mörkare bakgrundsfärg och eventuellt en liten transform: translateY(-1px) (lyfteffekt).
  2. Lägg till :focus-visible med en synlig outline (minst 3px, kontrasterande färg) och outline-offset: 3px.
  3. Lägg till :active med en återgång till originalfärgen och translateY(1px) (nedtryckt-känsla).
  4. Lägg till transition: background-color 0.2s ease, transform 0.15s ease på knappens default-state.
  5. Lägg till :hover på kortkomponenten: en subtil box-shadow eller border-ändring.
  6. Test 1 (mus): hovra, klicka och håll ned. Ser det bra ut?
  7. Test 2 (tangentbord): Stäng musen. Navigera med Tab till knappen. Är focus-statet tydligt synligt?
  8. Vad händer om… du kommenterar bort :focus-visible-regeln och testar tangentbordsnavigering igen? Förstår du nu varför outline: none utan ersättare är ett problem?

Motivera & reflektera

Skriv i din readme.md varför feedback vid interaktion är en funktionell nödvändighet och inte bara estetik. Vilken av dina states var viktigast för en användare som inte kan använda mus, och hur testade du att den fungerar?

Nästa nivå

Gör tangentbordstestet på riktigt: dra ut musen ur datorn (eller lägg undan den) och navigera hela din sida med bara Tab, Enter och Space. Kan du nå varenda knapp och länk, och ser du alltid var du är? Lägg sedan till en @media (prefers-reduced-motion: reduce) som stänger av dina transitions, och slå på “reducera rörelse” i operativsystemets inställningar för att bekräfta att den slår till. Att en sida är fullt körbar utan mus och respekterar användarens rörelsepreferens är det lilla extra som skiljer en omsorgsfullt byggd sida från en som bara ser bra ut.