21/06/2025
I en digital verden, hvor skærmplads er en kostbar ressource, og brugernes opmærksomhed er flygtig, er evnen til at præsentere information effektivt altafgørende. Lange tekstblokke kan virke overvældende og forstyrre et æstetisk design, især på mobile enheder. Dette fører os til behovet for tekstafkortning – en metode til at vise et uddrag af tekst og give læseren mulighed for at udvide indholdet med en 'læs mere'-knap, hvis de ønsker at fordybe sig. Tidligere krævede dette ofte komplekse JavaScript-løsninger, men heldigvis har CSS udviklet sig til at tilbyde mere elegante og native metoder. I denne omfattende guide vil vi udforske de bedste praksisser for at opnå flersidet tekstafkortning med CSS, adressere de udfordringer, du måtte støde på, og sikre, at dine løsninger er både funktionelle og tilgængelige.

Udfordringen med Flersidet Tekstafkortning
Mange kender sikkert til CSS-egenskaben text-overflow: ellipsis;, som elegant afkorter enkeltlinjet tekst med tre prikker (...). Problemet opstår, når vi har brug for at afkorte tekst, der strækker sig over flere linjer. Her kommer text-overflow: ellipsis; til kort, da den udelukkende er designet til at håndtere en enkelt tekstlinje. Dette har længe været en frustration for udviklere, der ønskede at opnå et rent og ryddeligt layout uden at skære for meget i indholdet.
Løsningen på dette dilemma findes i en mindre kendt, men utroligt nyttig CSS-egenskab: -webkit-line-clamp. Selvom præfikset -webkit- indikerer, at det oprindeligt var en WebKit-specifik egenskab (og teknisk set stadig er det, da den ikke er en del af en officiel W3C-standard endnu), er den i dag bredt understøttet i de fleste moderne browsere, herunder Chrome, Safari, Firefox og Edge. Denne egenskab giver dig mulighed for at angive præcis, hvor mange linjer tekst der skal vises, før den afkortes med en ellipse. For at -webkit-line-clamp skal fungere korrekt, skal den kombineres med et par andre CSS-egenskaber:
display: -webkit-box;-webkit-box-orient: vertical;overflow: hidden;
Disse egenskaber omdanner elementet til en fleksibel box, der kan orienteres vertikalt, og sikrer, at alt indhold ud over det angivne antal linjer skjules. Resultatet er en ren og pæn afkortning, der bevarer tekstens læsbarhed og dit designs integritet. Det er en elegant løsning, der har revolutioneret, hvordan vi håndterer flersidet tekst i CSS.
Den Smarte 'Læs Mere'-Knap med CSS-Hacket
At afkorte tekst er kun halvdelen af løsningen. For at give brugerne fuld kontrol over indholdet har vi brug for en 'læs mere'-knap, der kan udvide den afkortede tekst og afsløre det fulde indhold. Her bliver det lidt mere udfordrende, hvis vi ønsker at holde os til en CSS-only løsning. En traditionel <button> eller <a> tag er typisk afhængig af JavaScript for at udløse en tilstandsskift. Men med en smule kreativitet kan vi udnytte et velkendt CSS-trick, ofte kaldet 'checkbox hack', til at opnå denne funktionalitet uden JavaScript.
Kernen i 'checkbox hack' er brugen af et <input type="checkbox">-element i kombination med et <label>-element. Når du klikker på et <label>, der er forbundet med en checkbox (via for-attributten og checkboxens id), toggler det automatisk checkboxens tjekkede tilstand. Denne tilstand kan vi derefter udnytte i CSS ved hjælp af pseudo-klassen :checked og den tilstødende søskende-vælger (+) eller generelle søskende-vælger (~).

Forestil dig følgende HTML-struktur:
<div class="tekst-boks"> <input type="checkbox" id="udvidTekst"> <p>Her er en lang tekst, der skal afkortes over flere linjer. Denne tekst vil kun vise et par linjer i starten for at spare plads og give et rent look på siden. Når brugeren klikker på 'læs mere'-knappen, vil hele indholdet blive synligt, hvilket giver fuld adgang til informationen.</p> <label for="udvidTekst" role="button">Læs mere</label> </div> Med denne struktur kan vi i CSS skrive følgende for at udvide teksten, når checkboxen er tjekket:
#udvidTekst:checked + p { -webkit-line-clamp: unset; /* Fjerner afkortningen og viser al tekst */ } #udvidTekst:checked ~ label::before { content: 'Vis mindre'; /* Ændrer knapteksten */ } Dette simple, men effektive trick gør, at når brugeren klikker på 'Læs mere'-labelen, toggles checkboxen, og teksten udvides, da -webkit-line-clamp sættes til unset. Det er en smart måde at opnå dynamisk indholdsvisning udelukkende med CSS.
Tilgængelighed (A11y) er Nøglen: Undgå Faldgruberne
Selvom 'checkbox hack' er en kraftfuld CSS-only løsning, har den ry for at være 'hacky' og potentielt utilgængelig, hvis den ikke implementeres korrekt. Den største faldgrube er at skjule checkboxen fuldstændigt med display: none; eller visibility: hidden;. Dette fjerner checkboxen fra DOM'ens tilgængelighedstræ, hvilket betyder, at brugere, der navigerer med tastatur eller skærmlæser, ikke kan interagere med den. Resultatet er en brudt brugeroplevelse for mange.
For at sikre, at din 'læs mere'-funktion er fuldt tilgængelig, skal du gøre checkboxen usynlig, men stadig interagerbar. Dette kan opnås ved at bruge en kombination af CSS-egenskaber:
input[type="checkbox"] { opacity: 0; /* Gør den fuldstændig gennemsigtig */ position: absolute; /* Tager den ud af det normale dokumentflow */ pointer-events: none; /* Forhindrer museklik på selve inputtet */ width: 1px; /* Minimal bredde */ height: 1px; /* Minimal højde */ overflow: hidden; /* Skjuler eventuelt overløb */ clip: rect(0 0 0 0); /* Klipper elementet til et rektangel med 0 dimensioner */ white-space: nowrap; /* Sikrer at indholdet forbliver på én linje */ } Disse egenskaber sikrer, at checkboxen stadig er til stede i DOM'en, fokusérbar med tastaturet, og kan læses af skærmlæsere, men den er ikke visuelt forstyrrende på siden. Den er en del af den semantisk korrekte struktur, selvom den er usynlig.
Det næste skridt er at give visuel feedback, når checkboxen er fokuseret. Da checkboxen er usynlig, har brugeren ingen indikation af, at de har navigeret til den med tastaturet. Løsningen er at overføre fokusstilen til dens tilhørende <label>. Dette kan gøres med CSS:
input[type="checkbox"]:focus ~ label { outline: -webkit-focus-ring-color auto 5px; /* Standard browser-fokusstil */ outline-offset: 2px; /* Lidt afstand til elementet */ } Nu vil labelen modtage en visuel fokusindikator, når den usynlige checkbox er fokuseret, hvilket giver en klar indikation til tastaturnavigatører. Dette er et kritisk skridt for at sikre en god brugervenlighed og tilgængelighed for alle brugere.

Dynamisk Visning af 'Læs Mere'-Knappen: Når CSS Ikke Rækker
Den CSS-only løsning, vi har beskrevet, er fremragende til at afkorte tekst og udvide den på klik. Men hvad hvis du ikke ved på forhånd, om teksten overhovedet er lang nok til at blive afkortet? Ideelt set ønsker vi kun at vise 'læs mere'-knappen, hvis teksten faktisk overskrider det angivne antal linjer. Desværre er dette et område, hvor ren CSS i øjeblikket kommer til kort.
CSS har ingen indbygget måde at detektere, om et element er 'truncated' (afkortet) på grund af line-clamp eller overflow: hidden;. Vi mangler en pseudo-klasse som :truncated, der kunne bruges til betinget at vise eller skjule knappen:
.laes-mere-knap { display: none; } p:truncated + .laes-mere-knap { display: block; } Da en sådan selector ikke eksisterer, er vi nødt til at ty til JavaScript for at opnå denne dynamiske funktionalitet. JavaScript kan sammenligne elementets scrollHeight (den samlede højde af indholdet, selvom det er skjult) med dets clientHeight eller contentRect.height (den synlige højde af elementet). Hvis scrollHeight er større end den synlige højde, betyder det, at indholdet er afkortet, og 'læs mere'-knappen skal vises.
En moderne og effektiv måde at gøre dette på er ved at bruge ResizeObserver API'et. Dette API giver dig mulighed for at reagere på ændringer i størrelsen af et elements indholdsboks, hvilket er perfekt til at tjekke, om teksten pludselig bliver for lang eller kort, f.eks. ved vinduesændringer. Ved at tilføje eller fjerne en CSS-klasse baseret på denne sammenligning kan du dynamisk styre visningen af 'læs mere'-knappen. Selvom det kræver JavaScript, er det en letvægtsløsning, der kun aktiveres, når det er nødvendigt, og den integreres problemfrit med din CSS-baserede afkortning.
Alternativer og Yderligere Overvejelser
Udover -webkit-line-clamp findes der andre CSS-egenskaber, der kan påvirke tekstvisning over flere linjer, omend i en anden kontekst. For eksempel, hvis du ønsker, at tekst inden i et element som en <input type="submit"> skal bryde linjer i stedet for at forblive på én linje (som ofte er standard for den type elementer), kan du bruge white-space: normal; kombineret med en fast width:
input[type="submit"] { white-space: normal; width: 100px; /* Eller anden passende bredde */ } Dette sikrer, at teksten inden i elementet flyder over på flere linjer, hvis den er for lang, i stedet for at blive afkortet eller løbe ud over elementets grænser.

Det er også værd at bemærke, at mens vi fokuserer på CSS-only (og 'næsten' CSS-only) løsninger, findes der utallige JavaScript-biblioteker og eksempler, der tilbyder avancerede 'læs mere'-funktioner. Disse kan være nyttige, hvis du har brug for mere kompleks logik, som f.eks. at tælle et specifikt antal ord, animere udvidelsen af teksten eller integrere med et specifikt frontend-framework. Vores mål her har dog været at demonstrere, hvor langt du kan komme med native browserfunktioner og CSS.
Sammenligning: CSS-Kun vs. CSS + JavaScript Løsning
Lad os opsummere fordele og ulemper ved de to primære tilgange i en tabel:
| Funktion | CSS-Kun Løsning | CSS + JavaScript Løsning |
|---|---|---|
| Flersidet afkortning | Ja (via -webkit-line-clamp) | Ja (stadig via -webkit-line-clamp) |
| 'Læs mere'-knap | Ja (via 'checkbox hack') | Ja (via 'checkbox hack' eller traditionel JS-toggle) |
| Tilgængelighed (A11y) | Kan opnås med omhyggelig implementering af fokus-states | Nemmere at implementere fuld A11y med korrekte ARIA-attributter og fokusstyring |
| Dynamisk knapvisning | Nej (kræver :truncated selector, som ikke findes) | Ja (ved at sammenligne scrollHeight og clientHeight/contentRect.height) |
| Kompleksitet | Middel (CSS hacks kan være finurlige at vedligeholde) | Middel til høj (afhængig af omfang og framework, men ofte mere eksplicit) |
| Ydeevne | Meget høj (native browser rendering) | Høj (minimal JS-overhead, især med ResizeObserver) |
| Browserkompatibilitet | God for -webkit-line-clamp, men kræver prefixes | Meget god (JS er universelt understøttet, og browser-API'er er standardiserede) |
Ofte Stillede Spørgsmål
- Er
-webkit-line-clampen officiel CSS-standard? - Nej, det er teknisk set en WebKit-specifik egenskab, selvom den er en del af CSS Overflow Module Level 3-udkastet. Den er dog så bredt understøttet i moderne browsere, at den i praksis kan anvendes.
- Kan jeg bruge en almindelig
<button>eller<a>til 'læs mere'-funktionen med CSS-only? - Ikke direkte. En ren CSS-only løsning, der toggler indhold, vil næsten altid kræve et form-element som en checkbox eller radio-knap, som du kan styre med CSS's
:checkedpseudo-klasse. - Hvordan sikrer jeg, at 'læs mere'-knappen kun vises, hvis teksten faktisk er afkortet?
- Dette kræver JavaScript. CSS har ingen indbygget mekanisme til at detektere overløb og betinget vise et element. Du skal sammenligne elementets fulde højde (
scrollHeight) med dets synlige højde (clientHeight). - Hvad hvis jeg vil have teksten til at 'vise mindre' igen efter udvidelse?
- Checkbox-hacket fungerer som en toggle. Når du klikker på 'læs mere'-labelen igen, vil checkboxen blive 'unchecked', og teksten vil vende tilbage til sin afkortede tilstand. Du kan også ændre labelens tekst (f.eks. til 'Vis mindre') ved at bruge
:checked ~ label::before { content: 'Vis mindre'; }. - Er der nogen ydeevneproblemer med disse løsninger?
- Den CSS-only løsning er yderst effektiv, da den udnytter browserens native rendering. JavaScript-løsningen, især med moderne API'er som
ResizeObserver, er også typisk meget performant, da den er optimeret til at køre effektivt og kun ved behov.
Konklusion
Evnen til at afkorte flersidet tekst med en 'læs mere'-funktion er en vigtig del af moderne webdesign, der bidrager til et rent layout og en forbedret brugeroplevelse. Som vi har set, kan du med de rette CSS-egenskaber som -webkit-line-clamp og en smart anvendelse af 'checkbox hack' opnå denne funktionalitet med minimal eller ingen JavaScript. Det er dog afgørende at huske på tilgængelighedsaspekterne og sikre, at dine løsninger er robuste for alle brugere, uanset deres navigationsmetode.
Mens CSS kan håndtere den grundlæggende afkortning og udvidelse, er JavaScript stadig nødvendigt for dynamisk at vise eller skjule 'læs mere'-knappen baseret på tekstens faktiske længde. Ved at kombinere det bedste fra begge verdener kan du skabe en problemfri og elegant løsning, der både er visuelt tiltalende og fuldt funktionel. Med denne viden er du nu klædt på til at implementere professionel tekstafkortning på dine websites og forbedre brugeroplevelsen markant.
Hvis du vil læse andre artikler, der ligner CSS Tekstafkortning: Mestr 'Læs Mere'-Funktionen, kan du besøge kategorien Tøj.
