26/12/2022
Sådan deaktiverer du rulning med JavaScript
I webudvikling er der ofte situationer, hvor du midlertidigt ønsker at forhindre brugere i at rulle på en webside. Dette kan være nødvendigt, når en modalvindue er åbent, en indlæsningsskærm vises, eller når du vil sikre en bestemt brugerinteraktion uden utilsigtet scrolling. Heldigvis tilbyder JavaScript effektive metoder til at håndtere dette. Denne artikel vil guide dig igennem de mest almindelige og effektive måder at deaktivere og genaktivere rulning på.

Hvad betyder det at deaktivere eller låse rulning?
At deaktivere eller låse rulning betyder simpelthen at forhindre de standard browseradfærd, der tillader brugerne at rulle lodret og vandret på en webside. Ved at deaktivere disse standardhandlinger kan vi effektivt "låse" indholdet på plads i en given scrollposition. Dette kan være særligt nyttigt i situationer som:
- Når et modalvindue er åbent, for at forhindre baggrunden i at rulle.
- Under animationer eller overgange, hvor rulning kan forstyrre visuel kontinuitet.
- Når en indlæsningsskærm vises, for at give en ren og uforstyrret oplevelse.
- Ved interaktive elementer, hvor rulning kan interferere med brugerens handlinger, f.eks. et tegningsområde.
Metode 1: Brug af `window.onscroll` funktionen
En af de mest direkte metoder til at deaktivere rulning er at manipulere browserens indbyggede scroll-hændelser. `window.onscroll` er en event-handler, der udløses, hver gang brugeren forsøger at rulle på siden. Ved at tilsidesætte denne funktion og bruge `window.scrollTo()` kan vi effektivt sætte en fast scrollposition og dermed deaktivere yderligere scroll-effekter.
For at implementere dette skal vi først gemme den aktuelle scrollposition. Dette gøres ved at tilgå `window.pageYOffset` (for lodret position) og `window.pageXOffset` (for vandret position). Alternativt kan `document.documentElement.scrollTop` og `document.documentElement.scrollLeft` bruges, især i ældre browsere eller specifikke renderings-modes.
Sådan deaktiveres rulning:
Når en bruger forsøger at rulle, vil vores `window.onscroll` funktion blive kaldt. Inden i denne funktion kalder vi `window.scrollTo(scrollLeft, scrollTop)`, hvor `scrollLeft` og `scrollTop` er de værdier, vi gemte, da vi deaktiverede rulningen. Dette tvinger effektivt siden tilbage til den oprindelige position, hver gang et scroll-forsøg registreres.
Sådan genaktiveres rulning:
For at genaktivere rulningen skal vi blot fjerne vores tilsidesættelse af `window.onscroll`. Dette gøres ved at sætte `window.onscroll` til en tom funktion (`function() {}`).
Eksempel på `window.onscroll` metoden:
<!DOCTYPE html> <html> <head> <title>Deaktiver Rulning med JavaScript</title> <style> .scrollable-place { height: 1000px; background-color: lightblue; padding: 20px; } </style> </head> <body> <h1>JavaScript Rulningskontrol</h1> <p>Klik på knapperne for at aktivere eller deaktivere rulning.</p> <div class="scrollable-place"> <p>Dette er indhold, der gør siden scrollbar.</p> <button onclick="disableScroll()">Deaktiver Rulning</button> <button onclick="enableScroll()">Genaktiver Rulning</button> </div> <script> let scrollTopPosition; let scrollLeftPosition; function disableScroll() { scrollTopPosition = window.pageYOffset || document.documentElement.scrollTop; scrollLeftPosition = window.pageXOffset || document.documentElement.scrollLeft; // Forhindrer scroll-handlinger window.onscroll = function() { window.scrollTo(scrollLeftPosition, scrollTopPosition); }; console.log("Rulning deaktiveret."); } function enableScroll() { // Genaktiverer scroll-handlinger ved at fjerne tilsidesættelsen window.onscroll = function() {}; console.log("Rulning genaktiveret."); } </script> </body> </html>En anden effektiv og ofte simplere metode er at bruge CSS til at kontrollere, hvordan indholdet opfører sig, når det overskrider containerens dimensioner. Ved at sætte `overflow`-egenskaben til `hidden` på et element, vil alt indhold, der stikker ud over elementets grænser, blive afskåret og usynligt, og selve scrollingen forhindres.

Denne metode involverer typisk at skabe en CSS-klasse, der indeholder stilarter som `height: 100%` og `overflow: hidden`. Når du ønsker at deaktivere rulning, tilføjer du blot denne klasse til `
`-elementet ved hjælp af JavaScript (`document.body.classList.add("classname")`). For at genaktivere rulningen fjerner du simpelthen klassen igen (`document.body.classList.remove("classname")`).Det er vigtigt at bemærke, at denne metode deaktiverer rulning for hele siden, hvis den anvendes på `
`. Hvis du kun vil deaktivere rulning for et specifikt element, skal du anvende klassen på det pågældende element.Eksempel på CSS `overflow: hidden` metoden:
<!DOCTYPE html> <html> <head> <title>Deaktiver Rulning med CSS</title> <style> .scrollable-place { height: 1000px; background-color: lightgreen; padding: 20px; } .stop-scrolling { overflow: hidden; height: 100vh; /* Sikrer at body dækker hele viewport */ } </style> </head> <body> <h1>JavaScript Rulningskontrol med CSS</h1> <p>Klik på knapperne for at aktivere eller deaktivere rulning.</p> <div class="scrollable-place"> <p>Dette er indhold, der gør siden scrollbar.</p> <button onclick="disableScrollCSS()">Deaktiver Rulning</button> <button onclick="enableScrollCSS()">Genaktiver Rulning</button> </div> <script> function disableScrollCSS() { document.body.classList.add("stop-scrolling"); console.log("Rulning deaktiveret via CSS."); } function enableScrollCSS() { document.body.classList.remove("stop-scrolling"); console.log("Rulning genaktiveret via CSS."); } </script> </body> </html>Håndtering af touch-events og specifikke elementer
Når du arbejder med touch-enheder, kan du støde på situationer, hvor berøringsbevægelser utilsigtet udløser side-scrolling, især når du interagerer med specifikke elementer som et tegneområde (canvas). Dette kan forringe brugeroplevelsen betydeligt på mobile enheder.
Problemkontekst
Forestil dig, at du udvikler en webapplikation med en interaktiv tegneflade. Når brugerne tegner på et canvas med touch-events, kan lodrette bevægelser ikke kun tegne, men også få hele siden til at rulle. Dette er især problematisk for applikationer som tegneværktøjer, hvor en flydende interaktion er afgørende.
Praktiske løsninger
Metode 1: CSS `touch-action` Egenskaben
En af de simpleste måder at forhindre standard scroll-adfærd på er at bruge CSS `touch-action`-egenskaben. Ved at sætte denne egenskab til `none` på dit element (f.eks. et canvas), vil touch-interaktioner på dette element ikke udløse standard scrolling, selv når passive event listeners er aktive. Dette er en effektiv måde at bevare den tilsigtede funktionalitet uden at introducere yderligere JavaScript-kompleksitet.
canvas { touch-action: none; } Metode 2: JavaScript Touch Event Management
Hvis du har brug for mere kontrol over touch-interaktioner, især når der er flere elementer involveret, er en JavaScript-tilgang nyttig. Du kan forhindre scrolling ved at håndtere touch-events med en kombination af `ontouchstart`, `ontouchmove` og `ontouchend`.
Her er en implementering, der bruger rene JavaScript-hændelser:
let shouldBlockScroll = false; const sketchCanvas = document.getElementById('sketchCanvas'); // Antag at du har et canvas med id 'sketchCanvas' if (sketchCanvas) { sketchCanvas.addEventListener('touchstart', function(event) { // Tjek om touch-event'en startede inden for canvas-elementet if (event.target.closest('#sketchCanvas')) { shouldBlockScroll = true; console.log("Touch started on canvas, potentially blocking scroll."); } }); window.addEventListener('touchend', function() { if (shouldBlockScroll) { shouldBlockScroll = false; console.log("Touch ended, scroll blocking reset."); } }); window.addEventListener('touchmove', function(event) { // Hvis shouldBlockScroll er sand, forhindr standard scroll-adfærd if (shouldBlockScroll) { event.preventDefault(); console.log("Preventing default scroll due to touchmove on canvas."); // Her kan du tilføje din tegne-logik } }, { passive: false }); // Vigtigt at sætte passive til false for at preventDefault virker } I dette eksempel tjekker vi først, om `touchstart`-hændelsen stammer fra vores tegneområde (`#sketchCanvas`). Hvis det er tilfældet, sætter vi en flag til at blokere scrolling. `touchmove`-hændelsen vil derefter forhindre standardhandlingen, hvis flaget er sat til `true`, hvilket effektivt stopper scroll og tillader en flydende tegneoplevelse. Det er afgørende at tilføje `{ passive: false }` til `touchmove`-event listeneren, for at `event.preventDefault()` kan fungere korrekt. Uden dette vil browseren muligvis ignorere `preventDefault`.
Opsummering og Overvejelser
At kunne deaktivere og genaktivere rulning er en værdifuld teknik i webudvikling, der kan forbedre brugeroplevelsen markant i specifikke scenarier. Både `window.onscroll` metoden og CSS `overflow: hidden` er effektive, men de har forskellige anvendelsesområder:
| Metode | Fordele | Ulemper | Bedst til |
|---|---|---|---|
| `window.onscroll` | Fin kontrol, kan gemme og genoprette specifikke scrollpositioner. | Kan være mere kompleks at implementere korrekt, potentielle performance-overvejelser ved hyppige kald. | Midlertidig deaktivering under specifikke events, hvor præcis positionering er vigtig. |
| CSS `overflow: hidden` | Simpel at implementere, god performance. | Deaktiverer al scroll på det element, den anvendes på. Kan ikke gemme specifikke scrollpositioner. | Generel deaktivering af scroll på hele siden eller et stort element, f.eks. ved modaler. |
| `touch-action: none` | Meget simpel CSS løsning til touch-enheder. | Virker primært på touch-interaktioner og bestemte elementer. | Forhindre standard touch-scrolling på specifikke elementer som canvas. |
| JavaScript Touch Event Management | Giver fuld kontrol over touch-interaktioner, kan kombineres med andre handlinger. | Kræver omhyggelig håndtering af events og `preventDefault()`. | Komplekse touch-baserede interfaces, hvor standardadfærd skal overstyres. |
Når du vælger en metode, skal du overveje, hvad der passer bedst til dit specifikke behov. For de fleste almindelige use cases, som at forhindre baggrundsscrolling bag en modal, er CSS `overflow: hidden` ofte den nemmeste og mest performante løsning. Hvis du har brug for mere finkornet kontrol eller skal håndtere specifikke touch-interaktioner, er JavaScript-baserede metoder vejen frem.

Ofte Stillede Spørgsmål (FAQ)
Q: Hvordan forhindrer jeg standard scrolling i JavaScript?
A: Du kan forhindre standard scrolling ved at bruge `event.preventDefault()` på scroll-relaterede events, som f.eks. `touchmove`, eller ved at tilsidesætte `window.onscroll` og bruge `window.scrollTo()` til at fastholde en position.
Q: Hvordan deaktiverer jeg scrolling på mobil, når jeg interagerer med et canvas-element?
A: Du kan sætte CSS `touch-action`-egenskaben til `none` på canvas-elementet, eller du kan håndtere touch-events med JavaScript for at forhindre standard scroll-adfærd, som vist i eksemplerne ovenfor.
A: `window.onscroll` manipulerer browserens scroll-hændelser direkte i JavaScript, mens `overflow: hidden` er en CSS-regel, der visuelt afskærer indhold, der overskrider et elements grænser, og dermed forhindrer scrolling. `overflow: hidden` er generelt simplere og mere performant for simpel deaktivering.
Q: Er det sikkert at bruge `event.preventDefault()` på `touchmove`?
A: Ja, men det er vigtigt at angive `{ passive: false }` i event listenerens options-objekt for at `preventDefault()` kan fungere korrekt. Uden dette kan browseren ignorere kaldet, da den antager, at eventet ikke vil blive blokeret.
Ved at mestre disse teknikker kan du opnå præcis kontrol over brugerinteraktioner på dine websider og skabe mere polerede og brugervenlige oplevelser.
Hvis du vil læse andre artikler, der ligner Sådan deaktiverer du rulning med JavaScript, kan du besøge kategorien Teknologi.
