What are 'hover' 'focus' & 'active' classes?

Forstå CSS :hover, :focus og :active

28/05/2022

Rating: 4.52 (15085 votes)
Indholdsfortegnelse

CSS Pseudo-klasser: Gør dine elementer levende

I webudviklingens verden er det ikke nok bare at præsentere information; det handler om at skabe en interaktiv og engagerende oplevelse for brugeren. CSS pseudo-klasser som :hover, :focus og :active er essentielle værktøjer i denne proces. De giver os mulighed for at ændre udseendet af HTML-elementer baseret på brugerens interaktioner, hvilket fører til en mere intuitiv og tilfredsstillende brugergrænseflade. Men hvordan fungerer de præcist, især når vi tager højde for den mangfoldighed af inputenheder, vi bruger i dag – fra traditionelle mus til tastaturer og touchskærme?

Hvad er Pseudo-klasser?

Før vi dykker ned i de specifikke pseudo-klasser, er det vigtigt at forstå, hvad en pseudo-klasse er. Mens almindelige CSS-selektorer vælger elementer baseret på deres eksisterende attributter i DOM'en (Document Object Model), giver pseudo-klasser os mulighed for at vælge elementer baseret på information, der ikke er direkte tilgængelig i DOM'en. Denne information ændrer sig ofte baseret på, hvordan en bruger interagerer med siden. Tænk på dem som dynamiske tilstande, der kan anvendes på dine elementer.

Why do you use 'hover' / 'focus'?
I mainly use the :hover/:focus for these kind of issues, because 1.) They're reliable. 2.) Cheap (in terms of kb). It takes only 2 rules and no external HTTP request to include a rule for a fully functioning menu, but several lines of JavaScript (or, the horror, jQuery) to create the same thing.

:hover – Når musen svæver

:hover pseudo-klassen, også kendt som "pointer hover pseudo-klassen", aktiveres, når en pegende enhed (typisk en mus) interagerer med et element uden nødvendigvis at aktivere det. Det mest almindelige eksempel er, når du fører musen hen over et link eller en knap, og det skifter farve eller får en understregning. CSS-reglen button:hover { background-color: #ffdb3a; } vil for eksempel gøre en knap gul, når musen holdes over den.

Specifikke overvejelser for :hover:

  • Mus: Fungerer som forventet. Når musen er over elementet, anvendes stilen.
  • Tastatur::hover udløses aldrig for tastaturbrugere, da tastaturet ikke betragtes som en pegende enhed.
  • Touchskærme: Her bliver det interessant. På touch-enheder kan "hover"-tilstanden blive "sticky" efter et enkelt tryk. Det betyder, at elementet kan forblive i hover-tilstand, selv efter brugeren har løftet fingeren, indtil et andet element aktiveres. Dette er ofte grunden til, at man ser menuer, der dukker op ved et tryk på en mobiltelefon, selvom den underliggende CSS bruger :hover. Dog er det ikke en garanti på tværs af alle touch-enheder og browsere. Mobil Safari er et kendt eksempel, hvor :hover opfører sig anderledes og ofte kræver et ekstra tryk for at "slippe" hover-tilstanden.

:focus – Når elementet er i centrum

:focus pseudo-klassen anvendes, når et element er klar til interaktion – det vil sige, når det har "fokus" fra inputenheden. Hvornår dette sker, varierer afhængigt af enheden:

Specifikke overvejelser for :focus:

  • Mus::focus anvendes, når brugeren begynder at aktivere elementet (f.eks. klikker på det) og fortsætter med at være aktiv, indtil brugeren aktiverer et andet element. Et klik på en knap vil gøre den gul, og den forbliver gul, indtil brugeren klikker et andet sted.
  • Tastatur: For tastaturbrugere er :focus meget lig :hover for musebrugere. Det signalerer en lignende hensigt om interaktion. Når en bruger navigerer med Tab-tasten, vil det element, der har fokus, ændre udseende. Man kan se :focus som en hover-tilstand for tastaturet.
  • Touchskærme: Ligesom med :hover, udløses :focus typisk ved et tryk på elementet. Igen er der undtagelser; mobil Safari kan opføre sig anderledes, og et enkelt tryk kan udløse både hover og focus, hvilket kan være problematisk, hvis man ønsker separate stilarter for disse tilstande.

:active – Når handlingen sker

:active pseudo-klassen anvendes i det korte øjeblik, hvor elementet rent faktisk bliver aktiveret. For en musebruger er det tiden mellem at trykke på museknappen og slippe den igen. For tastaturbrugere er det øjeblikket, hvor en tast trykkes ned.

Specifikke overvejelser for :active:

  • Mus & Tastatur: Fungerer ens. Stilen anvendes, mens handlingen sker. Hvis du klikker og holder nede på en knap, der er stylet med :active, vil du se effekten.
  • Touchskærme: Ligesom med :focus, udløses :active ved et tryk. Og igen, mobil Safari er en undtagelse, hvor denne pseudo-klasse ikke anvendes ved et enkelt tryk.

Kombination af Pseudo-klasser og Rækkefølge

Det er vigtigt at forstå, at disse tilstande ikke er gensidigt udelukkende. Når du klikker på en knap med musen, er elementet sandsynligvis i :hover, :focus og :active tilstand samtidigt. Dette kan udnyttes til at skabe komplekse stilarter, men det gør også rækkefølgen af dine CSS-regler afgørende.

CSS-specifikationerne bestemmer, at hvis flere regler gælder for et element, vinder den regel, der er defineret sidst i din CSS-fil, eller den med den højeste specificitet. Ved brug af pseudo-klasser i rækkefølge, skal du tænke på den typiske brugerinteraktion:

  1. :hover (brugeren fører musen hen over)
  2. :focus (brugeren klikker eller tabulerer til elementet)
  3. :active (brugeren holder nede/trykker)

Hvis du definerer dine stilarter i denne rækkefølge, sikrer du, at den mest specifikke interaktion (:active) overskriver de tidligere, hvis nødvendigt. Hvis du omvendt definerer :hover sidst, vil dens stil altid dominere, når musen er over elementet, selv når det er fokuseret eller aktivt.

Eksempel på korrekt rækkefølge:

button:hover { background-color: green; } button:focus { background-color: blue; } button:active { background-color: red; } 

I dette tilfælde vil knappen være grøn ved hover, blå når den får fokus, og rød når den er aktiv. Hvis rækkefølgen var omvendt, ville knappen kun blive grøn.

Hover-hacks på Touch-enheder: Er det værd at risikere?

Spørgsmålet om at bruge :hover til at vise menuer på touch-enheder er et klassisk dilemma. Som nævnt kan :hover udløses af et enkelt tryk på mange touch-enheder. Dette kan fungere som en workaround for at undgå JavaScript til simple dropdown-menuer.

What is hover CSS & how does it work?
This CSS feature allows us to target devices that support hover interactions while avoiding interference on touch devices. The first button uses a standard :hover style. On a touch device, once tapped, the hover state remains active, leaving the background color lighter than expected.

Fordele ved :hover-hack:

  • Simplicitet: Kan undgå behovet for JavaScript til simple UI-mønstre.
  • Potentiel performance: Mindre JavaScript kan betyde hurtigere indlæsning.

Ulemper og risici ved :hover-hack:

  • Inkonsistens: Som vi har set, opfører :hover sig forskelligt på tværs af enheder og browsere (f.eks. mobil Safari). At stole blindt på "sticky hover" kan føre til en dårlig brugeroplevelse på visse platforme.
  • Tilgængelighed: Brugerinteraktioner, der er afhængige af hover, kan være problematiske for brugere, der ikke kan bruge en mus eller har begrænset finmotorik.
  • Semantisk ukorrekthed::hover er designet til pegende enheder. At bruge det til et klik-lignende interaktion på touch kan være semantisk forvirrende.

Konklusion om :hover-hack: Selvom det kan virke som en smart genvej, er det generelt ikke anbefalet at stole udelukkende på :hover for kritiske funktioner som menuer på touch-enheder. Risikoen for inkonsistens og en dårlig brugeroplevelse er for stor. Det er mere bulletproof at bruge JavaScript til at håndtere klik-begivenheder på touch-enheder for at åbne og lukke menuer.

JavaScript som Løsning

Når du har brug for en pålidelig og konsistent løsning på tværs af alle enheder, er JavaScript ofte den bedste vej frem. Du kan lytte efter `touchstart` eller `click` begivenheder på touch-enheder og `mouseover` eller `click` begivenheder på desktop-enheder.

Et typisk JavaScript-setup kunne se således ud:

const buttons = document.querySelectorAll('.btn-with-menu'); buttons.forEach(button => { button.addEventListener('click', function() { // Tjek om det er en touch-enhed, eller om menuen allerede er synlig if ('ontouchstart' in window || this.classList.contains('menu-open')) { this.classList.toggle('menu-open'); } }); // For desktop, brug hover til at vise menuen button.addEventListener('mouseover', function() { if (!('ontouchstart' in window)) { this.classList.add('menu-open'); } }); button.addEventListener('mouseout', function() { if (!('ontouchstart' in window)) { this.classList.remove('menu-open'); } }); }); 

Og tilsvarende CSS:

.btn-with-menu { position: relative; } .menu { display: none; position: absolute; top: 100%; left: 0; /* Andre styling-regler */ } /* Desktop Hover */ .btn-with-menu:hover .menu { display: block; } /* Touch/JS controlled */ .btn-with-menu.menu-open .menu { display: block; } /* For at undgå at hover fortsætter efter tryk på touch */ .btn-with-menu:active .menu { display: block; /* Kan være nødvendigt for nogle touch-enheder */ } 

Denne tilgang kombinerer det bedste fra begge verdener: den intuitive hover-oplevelse på desktop og den pålidelige klik-oplevelse på touch.

Opsummering af Pseudo-klasse Adfærd

Her er en oversigt, der opsummerer, hvordan de forskellige pseudo-klasser typisk opfører sig på forskellige inputenheder:

Pseudo-klasseMus 🐭Tastatur ⌨️Touchskærm 📱
:hoverJaNejJa (ved tryk, kan være "sticky")
:focusJa (ved klik/aktivering, forbliver aktiv)Ja (ved navigation, fungerer som hover)Ja (ved tryk, kan være "sticky")*
:activeJa (ved tryk og hold)Ja (ved tryk)Ja (ved tryk)*

* Bemærk: Mobil Safari kan have begrænset eller ingen understøttelse af :focus og :active ved simple tryk.

Fejlfinding og Bedste Praksis

Når du arbejder med disse pseudo-klasser, er det vigtigt at teste grundigt på tværs af forskellige enheder og browsere. Brug browserens udviklerværktøjer til at inspicere elementer og simulere forskellige enheder. Husk altid at prioritere tilgængelighed og brugervenlighed. Hvis en funktion er essentiel, såsom at vise en menu, så brug den mest pålidelige metode, hvilket ofte indebærer JavaScript for touch-interaktioner.

Ved at forstå nuancerne i :hover, :focus og :active, og ved at anvende dem korrekt – og supplere med JavaScript, når det er nødvendigt – kan du skabe dynamiske, responsive og brugervenlige weboplevelser, der fungerer problemfrit for alle dine besøgende, uanset hvilken enhed de bruger.

Hvis du vil læse andre artikler, der ligner Forstå CSS :hover, :focus og :active, kan du besøge kategorien Teknologi.

Go up