How do I prevent default scrolling?

Sådan deaktiverer du rulning med JavaScript

26/12/2022

Rating: 4.17 (5991 votes)

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å.

How to disable scrolling in JavaScript?
Add this class to the body with document.body.classList.add ("classname") to disable scrolling. Remove the class with document.body.classList.remove ("classname") to re-enable scrolling. Example:This example shows the implementation of the above-explained approach. How to disable scrolling temporarily using JavaScript?
Indholdsfortegnelse

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>

Metode 2: CSS `overflow: hidden`

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.

What does disable or lock scrolling mean?
When you disable or lock scrolling, we are preventing the default browser behaviors that allow scrolling vertically and horizontally when interacting with a webpage. For example: By disabling these default actions, we can effectively "lock" the content in place at a given scroll position. This can be useful in situations like:

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:

MetodeFordeleUlemperBedst 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 ManagementGiver 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.

Does Instagram's toolbar cover the bottom 44px when scrolling?
Here is a simple example where red is header, yellow is footer, blue is content. However, in iOS Safari (and some Android browsers I think too) when you scroll, there bottom 44px or so is covered by the toolbar. I read here and some others about workarounds, but no real "good" solution. However, is seems Instagram's website on iOS solved this:

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.

Q: Hvad er forskellen mellem `window.onscroll` og `overflow: hidden`?

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.

Go up