26/12/2021
Problematikken omkring :hover pseudo-klassen har været en vedvarende udfordring, siden touchskærmsenheder blev en integreret del af vores digitale liv. Selvom der har eksisteret forskellige løsningsforslag, har ingen hidtil tilbudt en komplet og elegant løsning. Med introduktionen af Level 4 Media Queries i CSS ser det dog ud til, at denne langvarige udfordring endelig er blevet løst.

Hvad er problemet med :hover på touchskærme?
Forestil dig, at du har tilføjet en simpel :hover-effekt til et element på din hjemmeside. På en traditionel desktop-enhed med en mus er dette ligetil: når musen svæver over elementet, aktiveres den definerede stil. Udfordringen opstår, når brugere interagerer med elementet på en touchskærm.
Efter et enkelt tryk på skærmen kan :hover-effekten blive "hængende" på elementet, selv efter at brugeren har fjernet fingeren. Dette kan ske, selv hvis elementet ikke blev aktivt trykket på, men blot berørt under scrolling. Hvis brugeren begynder at trække (drage) på elementet, aktiveres :hover-effekten også, da brugerens finger teknisk set befinder sig over det styled element. Dette kan føre til en uønsket interaktion for brugeren. Værre endnu, efter at trækningen er stoppet, kan :hover-effekten forblive aktiv, hvilket kan være forvirrende og skabe en dårlig brugeroplevelse.
Illustration af hover på desktop vs. touchscreen:
På desktop er hover-effekten dynamisk og kun til stede, mens musen er over elementet. På touchskærme kan effekten blive statisk efter en berøring eller et træk, hvilket skaber visuel støj og potentielt misforståelser.
Tidligere løsninger og deres begrænsninger
Før Level 4 Media Queries blev introduceret, var den mest udbredte løsning at anvende JavaScript. Denne metode indebar typisk at detektere, om enheden havde touch-kapaciteter. Baseret på denne detektion blev en klasse tilføjet til body-elementet. Derefter skulle alle :hover-effekter eksplicit referere til denne klasse for at undgå at blive vist på touchskærme.
Et eksempel på denne JavaScript-baserede tilgang kunne se således ud:
body.nontouch nav a:hover { background: yellow; }Selvom denne løsning kunne fungere, medførte den en række problemer:
- Vedligeholdelse og fremtidssikring: En JavaScript-detektionsskript, der fungerer i dag, er ikke nødvendigvis fremtidssikret. Nye teknologier som touchskærmslaptops eller styluspinde (f.eks. Apple Pencil) kunne opstå, hvilket kræver konstant opdatering af scriptet.
- Kompleksitet i komponentbaserede frameworks: I moderne JavaScript-frameworks med indkapslede styles kan denne globale klasse-løsning være meget besværlig. Hver gang en :hover-effekt anvendes, skal komponenten referere til denne globale klasse, hvilket bryder med principperne om indkapsling.
- Inkonsistens: To projekter, der anvender denne løsning, vil sandsynligvis ikke være identiske. En løsning, der virker på én specifik enhed, virker måske ikke på en anden. Der mangler en standardiseret tilgang.
Level 4 Media Queries: En ny standard
Media queries har revolutioneret webdesign og muliggjort responsivt webdesign. Med Level 4 Media Queries har W3C introduceret Interaction Media Features, som giver udviklere mulighed for at skelne mellem forskellige inputmetoder, herunder touchskærme.
De relevante media queries inkluderer:
@media(hover: hover): Denne query er sand, hvis den primære inputmetode understøtter hover-funktionalitet (f.eks. en mus).@media(any-hover: hover): Denne query er sand, hvis enhver tilgængelig inputmetode understøtter hover.@media(pointer: fine): Denne query er sand, hvis den primære inputmetode har høj præcision (f.eks. en mus).@media(pointer: coarse): Denne query er sand, hvis den primære inputmetode har begrænset præcision (f.eks. en finger på en touchskærm).@media(any-pointer: fine): Denne query er sand, hvis enhver tilgængelig inputmetode har høj præcision.@media(any-pointer: coarse): Denne query er sand, hvis enhver tilgængelig inputmetode har begrænset præcision.
Disse media features giver præcis den information, der er nødvendig for at håndtere :hover-effekter korrekt på tværs af forskellige enhedstyper.
Bemærk: Disse queries er i øjeblikket en "candidate recommendation", hvilket betyder, at de potentielt kan ændres eller fjernes. Det er vigtigt at overveje dette, men da alle større browsere (undtagen Internet Explorer) har implementeret dem, er fremtiden for disse specifikationer lovende.
Den ideelle løsning: CSS-only
Fra et udviklerperspektiv søger vi en løsning, der er nem at bruge og vedligeholde. Fra et brugeroplevelsesperspektiv ønsker vi en løsning, der er intuitiv og behagelig. Dette indebærer at undgå :hover-effekter på enheder, der udelukkende anvender touch, og at anvende dem på alle andre enheder.
Et særligt tilfælde er laptops med touchskærme. Her forventes det, at brugeren primært anvender mus eller touchpad. Selv hvis en :hover-effekt skulle blive hængende, kan brugeren nemt bruge musen til at rette op på det. Laptops med aftagelige touchskærme skifter til tablet-tilstand, når de afmonteres, hvilket media query'en korrekt håndterer.
Den mest effektive og elegante løsning kombinerer disse media queries for at målrette specifikke enheder:
@media (hover: hover) and (pointer: fine) { /* Her kommer dine :hover styles */ nav a:hover { background-color: yellow; text-decoration: underline; } .card:hover img { transform: scale(1.05); box-shadow: 0 4px 15px rgba(0,0,0,0.2); } } Denne kode sikrer, at :hover-effekter kun aktiveres på enheder, hvor der er en præcis pointer (som en mus) og hvor hover-funktionalitet er tilgængelig. Dette eliminerer problemet med "hængende" hover-effekter på touchskærme og giver en ren og forudsigelig brugeroplevelse.
Hvornår skal man bruge :hover?
Det er vigtigt at anvende :hover-effekter med omtanke. De er ideelle til at give brugeren feedback om interaktive elementer, som f.eks. knapper, links eller menupunkter, der kan aktiveres med en mus eller touchpad. Brug :hover til at:
- Fremhæve links eller knapper ved markering.
- Vise yderligere information eller tooltip-lignende indhold.
- Skabe subtile animationer eller visuelle ændringer, der forbedrer brugerens forståelse af grænsefladen.
Det er generelt en god praksis at undgå at placere kritisk information eller navigationselementer, der udelukkende er tilgængelige via :hover, da dette kan udelukke brugere på touchskærme, der ikke understøtter den traditionelle hover-interaktion.
Tabel: Media Queries for Interaktion
| Media Query | Beskrivelse | Anvendelse |
|---|---|---|
hover: hover | Primær pointer understøtter hover. | Aktiverer :hover på mus/touchpad-enheder. |
hover: none | Primær pointer understøtter IKKE hover. | Undgår :hover på touch-only enheder. |
pointer: fine | Primær pointer er præcis (f.eks. mus). | Sikrer :hover-effekter på enheder med præcis input. |
pointer: coarse | Primær pointer er upræcis (f.eks. finger). | Identificerer touch-enheder. |
any-hover: hover | Enhver pointer understøtter hover. | Mere generel hover-detektion. |
any-pointer: fine | Enhver pointer er præcis. | Identificerer enheder med mindst én præcis pointer. |
Ofte Stillede Spørgsmål (FAQ)
- Hvad er forskellen på 'hover' og 'media' i JavaScript?
- Dette spørgsmål synes at blande CSS og JavaScript. I CSS refererer
@media (hover: hover)til en media query, der tester for hover-kapacitet. I JavaScript bruges event listeners somonmouseoverogontouchstarttil at håndtere hover-lignende interaktioner. Selve begreberne 'hover' og 'media' er forskellige: 'hover' beskriver en tilstand (at svæve over noget), mens '@media' er en CSS-regel, der anvender stilarter baseret på enhedens egenskaber. - Er løsningen med @media(hover: hover) og (pointer: fine) fremtidssikret?
- Mens disse media queries er en "candidate recommendation" fra W3C, er de bredt implementeret i moderne browsere. De anses for at være den mest standardiserede og fremtidssikrede metode til at håndtere :hover på tværs af enheder. Det er dog altid en god idé at holde sig opdateret med de seneste webstandarder.
- Hvad hvis jeg absolut skal have en :hover-effekt på en touchskærm?
- Det anbefales generelt ikke at tvinge :hover-effekter på touchskærme på grund af den potentielle forvirring. Hvis det er absolut nødvendigt, kan du bruge JavaScript til at detektere et første tryk, tilføje en klasse, der simulerer hover, og derefter fjerne klassen ved et efterfølgende tryk eller et tryk et andet sted på siden. Denne tilgang er dog kompleks og kan stadig føre til en dårlig brugeroplevelse.
- Virker denne løsning på alle touchskærmsenheder?
- Løsningen med
@media(hover: hover) and (pointer: fine)er meget effektiv for de fleste moderne enheder. Der kan dog være visse uoverensstemmelser i, hvordan ældre browsere eller specifikke Android-browsere fortolker disse queries. Det er altid en god idé at teste på et bredt udvalg af enheder.
Konklusion
Med introduktionen af Level 4 Media Queries, specifikt @media(hover: hover) and (pointer: fine), har webudviklere endelig fået et kraftfuldt og standardiseret værktøj til at løse de langvarige problemer med :hover pseudo-klassen på touchskærme. Denne CSS-only løsning tilbyder en problemfri og intuitiv brugeroplevelse ved at sikre, at hover-effekter kun vises på enheder, hvor de giver mening. Ved at implementere denne tilgang kan du forbedre din websides tilgængelighed og æstetik på tværs af det stadigt voksende landskab af digitale enheder.
Hvis du vil læse andre artikler, der ligner CSS :hover på touchskærme: En moderne løsning, kan du besøge kategorien Teknologi.
