11/07/2023
Forstå JavaScript Scroll Events
Forestil dig at besøge en hjemmeside, hvor indholdet flyder ubesværet, og nye billeder dukker op, efterhånden som du scroller ned. Eller en navigationsbjælke, der elegant gemmer sig, når du scroller ned og dukker op igen, når du scroller op. Disse dynamiske effekter er ofte muliggjort af JavaScript scroll events. I denne artikel vil vi dykke ned i, hvad disse events er, hvordan de fungerer, og hvordan du kan bruge dem til at forbedre brugeroplevelsen på dine egne webprojekter.

Hvad er en Scroll Event?
En scroll event i JavaScript udløses, hver gang brugeren ændrer scrollpositionen i et element eller på hele websiden. Dette kan være både en lodret og en vandret ændring. For at kunne reagere på disse ændringer kan vi benytte os af JavaScripts event listeners eller event handler-egenskaber. Når vi taler om at læse scroll-begivenheder på desktop eller touch-begivenheder på mobile enheder, kan en scroll event handler betragtes som en funktion, der kaldes, hver gang en scroll-handling registreres.
Da "scroll" er en standard JavaScript-event, kan vi knytte en event listener til næsten ethvert Document Object Model (DOM) -element for at fange disse begivenheder.
Anvendelser af Scroll Events
Scroll events åbner op for en verden af muligheder for at skabe mere engagerende og interaktive weboplevelser. Her er et par eksempler på, hvordan de kan anvendes:
1. Udløsning af Animationer
Mange moderne hjemmesider bruger scroll events til at animere elementer, efterhånden som brugeren scroller ned på siden. Tænk på parallax-scrolling, hvor baggrundselementer bevæger sig langsommere end forgrundselementer, hvilket skaber en illusion af dybde. Eller animationer, der gradvist fader ind eller bevæger sig ind på skærmen, når de bliver synlige. Disse effekter gør hjemmesiden mere visuelt tiltalende og kan forbedre fortællingen.
2. Dynamisk Navigation og UI-elementer
Et klassisk eksempel er navigationsbjælken (navbar). Mange sider, som f.eks. Pitchfork.com, viser en navbar, der gemmer sig, når brugeren scroller ned, og dukker op igen, når de scroller op. Dette gøres ved at lytte til scroll-retningen og tilføje eller fjerne en CSS-klasse til navigationsbjælken baseret på scrollpositionen. Dette giver en renere brugeroplevelse, især på mindre skærme, hvor pladsen er begrænset.
3. "Infinite Scrolling" og Lazy Loading
Pinterest er et fremragende eksempel på "infinite scrolling". Når brugeren når bunden af siden, indlæses flere billeder automatisk, hvilket giver en problemfri oplevelse uden at skulle klikke på en "næste side"-knap. Dette opnås ved at overvåge scrollpositionen og, når brugeren nærmer sig bunden af det synlige område, udløse en funktion til at indlæse mere indhold. Dette kaldes ofte lazy loading, hvor indhold kun indlæses, når det er nødvendigt.
Sådan Lytter du til Scroll Events
Der er primært to måder at lytte til scroll events på i JavaScript:
Metode 1: Brug af `window.onscroll` Egenskaben
Den mest direkte måde at lytte til scroll events på hele vinduet er ved at bruge `window.onscroll`-egenskaben. Du tildeler simpelthen en funktion til denne egenskab, som så vil blive udført, hver gang et scroll-event finder sted.
For at kunne se dette i aktion, skal du først sikre dig, at der er en scrollbar på din side. Du kan gøre dette ved at tilføje en stor mængde tekst eller et element med en fast højde og `overflow: auto` eller `overflow: scroll`.

window.onscroll = () => { console.log("Brugeren scroller!"); };Når du scroller op og ned på siden, vil du se beskeden blive logget til browserens konsol. Det er dog vigtigt at bemærke, at scroll events kan fyre meget hurtigt. Hvis du udfører komplekse operationer i din event handler, kan det føre til performance-problemer. Teknikker som debouncing eller throttling kan være nødvendige for at optimere dette.
Metode 2: Brug af `addEventListener`
Den anbefalede og mere fleksible metode er at bruge `addEventListener`. Denne metode giver dig mulighed for at tilføje flere event listeners til det samme element og giver mere kontrol over event-håndteringen.
window.addEventListener("scroll", () => { console.log("Brugeren scroller via addEventListener!"); });Her er det første argument navnet på eventet ("scroll"), og det andet argument er den callback-funktion, der skal eksekveres, når eventet finder sted.
Fordele ved `addEventListener` inkluderer:
- Mulighed for at tilføje flere event handlers til det samme event.
- Bedre adskillelse af bekymringer (separation of concerns), hvilket gør koden mere organiseret.
- Mere kontrol over event-propagation (f.eks. bubbling og capturing).
Scroll Events på Specifikke Elementer
Udover at lytte til scroll events på hele vinduet, kan du også lytte til scroll events på specifikke HTML-elementer, der har en scrollbar. Dette er nyttigt, hvis du har et bestemt indholdsområde, der kan scrolles i.
Lad os sige, vi har en div med en bestemt højde og `overflow: auto;`:
HTML Eksempel:
<div class="scroll-container"> <p>Lang tekst her, der får elementet til at scrolle...</p> </div>CSS Eksempel:
.scroll-container { width: 300px; height: 200px; overflow: auto; border: 1px solid black; } .scroll-container p { height: 500px; /* Gør indholdet højere end containeren */ width: 400px; } JavaScript Eksempel:
const container = document.querySelector('.scroll-container'); container.addEventListener('scroll', (event) => { console.log('Scroll i containeren!'); // Du kan få adgang til scroll-positionen via event.target.scrollTop og event.target.scrollLeft console.log('Scroll Top:', event.target.scrollTop); console.log('Scroll Left:', event.target.scrollLeft); });Når du scroller inden i `.scroll-container` elementet, vil "Scroll i containeren!" blive logget til konsollen, sammen med den aktuelle vertikale scrollposition (`scrollTop`). For vinduet bruges `window.scrollY` og `window.scrollX` i stedet for `scrollTop` og `scrollLeft`.
Adgang til Scroll-positionen
Når et scroll-event udløses, kan du få adgang til den aktuelle scrollposition. Som nævnt tidligere, for vinduet, bruger du:
- `window.scrollY`: Den aktuelle lodrette scrollposition (i pixels).
- `window.scrollX`: Den aktuelle vandrette scrollposition (i pixels).
For specifikke elementer bruger du egenskaberne på event.target:
- `event.target.scrollTop`: Den aktuelle lodrette scrollposition for elementet.
- `event.target.scrollLeft`: Den aktuelle vandrette scrollposition for elementet.
Optimering af Scroll Events
Scroll events kan fyre mange gange per sekund, hvilket kan være ressourcekrævende, især hvis din event handler udfører tunge beregninger eller DOM-manipulationer. For at undgå performance-problemer kan du anvende følgende teknikker:
Debouncing
Debouncing sikrer, at din event handler kun kaldes, efter at en bestemt periode er gået, siden den sidste gang eventet blev udløst. Hvis eventet udløses igen inden for denne periode, nulstilles timeren.
Throttling
Throttling sikrer, at din event handler højst kaldes én gang inden for et bestemt tidsinterval. Dette er ofte mere passende for scroll events, da du typisk ønsker at opdatere UI'en løbende, men ikke for ofte.

Her er et simpelt eksempel på throttling med `setTimeout`:
let isThrottled = false; window.addEventListener('scroll', () => { if (!isThrottled) { console.log('Throttled scroll event!'); // Udfør dine scroll-relaterede opgaver her isThrottled = true; setTimeout(() => { isThrottled = false; }, 100); // Kør igen efter 100ms } });Scrollend Event
Mens scroll-eventet er nyttigt til at spore løbende scroll-aktivitet, er der også et nyere event kaldet scrollend. Dette event udløses, når brugerens scroll-handling er afsluttet. Dette kan være nyttigt, hvis du kun behøver at reagere, når brugeren er færdig med at scrolle, f.eks. for at indlæse data eller opdatere UI'en én gang efter scroll-sessionen.
Eksempel med `scrollend`
const element = document.querySelector('#scroll-box'); const output = document.querySelector('#output'); element.addEventListener('scrollend', () => { output.textContent = 'Scrolling completed!'; setTimeout(() => { output.textContent = 'Waiting for scroll to end...'; }, 1000); });Ofte Stillede Spørgsmål (FAQ)
Hvornår udløses et scroll event?
Et scroll event udløses, hver gang brugeren ændrer scrollpositionen i et element eller på hele siden.
Hvordan kan jeg finde ud af, om brugeren har scrollet til bunden af siden?
Du kan sammenligne den aktuelle scrollposition (`window.scrollY` eller `element.scrollTop`) med elementets samlede højde minus viewportens højde. Hvis de er ens eller meget tæt på hinanden, er brugeren ved bunden.
Hvorfor bruger jeg `scrollY` og `scrollX` for vinduet, men `scrollTop` og `scrollLeft` for elementer?
Dette skyldes, hvordan browser-API'erne er designet. `window` objektet har dedikerede egenskaber (`scrollY`, `scrollX`) til at spore sidens overordnede scrollposition, mens individuelle DOM-elementer bruger `scrollTop` og `scrollLeft` til at spore deres egne interne scrollpositioner.
Hvad er forskellen på `onscroll` og `addEventListener('scroll', ...)`?
`onscroll` er en ældre metode, der kun tillader én event handler pr. element. `addEventListener` er den moderne og mere fleksible metode, der tillader flere event handlers og giver bedre kontrol.
Konklusion
JavaScript scroll events er et kraftfuldt værktøj til at skabe dynamiske og responsive weboplevelser. Ved at forstå, hvordan man lytter til disse events, og hvordan man optimerer deres udførelse, kan du implementere funktioner som "infinite scrolling", animerede effekter og interaktive UI-elementer. Husk at overveje performance og brug teknikker som throttling eller debouncing, når det er nødvendigt.
Prøv at eksperimentere med disse koncepter i dine egne projekter, og se hvilke kreative løsninger du kan finde på!
Hvis du vil læse andre artikler, der ligner Forstå JavaScript Scroll Events, kan du besøge kategorien Teknologi.
