initClub · 1Úre Communauté Webflow Francophone

Updated 2 weeks ago

Disabling Body Scroll When Mobile Menu Is Open

Hello tout le monde 👋

J’utilise un hamburger menu en plein Ă©cran (100svh) sur tous mes breakpoints, y compris sur desktop.
Je souhaite désactiver le scroll du body quand le menu est ouvert.

Voici ce que j’utilise :

body:has(.nav_wrap .w-nav-button.w--open) {
overflow: hidden;
}

Ça fonctionne, mais j’obtiens un shift du layout à cause de la disparition de la barre de scroll.
J’ai tentĂ© ce contournement, mais la nav bar bouge toujours :

html {
scrollbar-gutter: stable;
}

Au final, je pense à l’appliquer au mobile uniquement et laisser le scroll sur desktop.

Auriez-vous une meilleure idée?

Merci d’avance pour votre aide 🙂

J
S
V
5 comments

Hello Sylvain !
Pas certain de pouvoir t’aider sur ton approche mais j’avais sauvegardĂ© cette vidĂ©o fs qui rĂ©sous ce problĂšme :) https://youtu.be/nNx1vBSWTeY?si=N24btZa0MUQbPXEO

Hello Jean,

Merci pour ta rĂ©ponse et le lien ! J’ai testĂ©, mais malheureusement, j’obtiens le mĂȘme rĂ©sultat : tout le body se dĂ©cale vers la droite lorsque la barre de scroll disparaĂźt.

Si tu as d’autres idĂ©es ou astuces, je suis preneur !

Merci encore pour ton aide 🙂

Customize la barre de scroll en css pour la rendre invisible

Merci Valentin pour ton idée de rendre la barre de scroll invisible.
Pour le body, mon CSS faisait déjà le job et la scrollbar disparaissait bien, mais la navbar se décalait toujours (car elle est en position fixed).

Au final, j’ai trouvĂ© une solution complĂšte en JavaScript pour gĂ©rer correctement le scroll du body et empĂȘcher la navbar de bouger.
J’avais besoin de calculer la largeur exacte de la scrollbar (pas possible en CSS).
Je vĂ©rifie encore qu’il n’y a aucun bug et je partagerai le code demain.

Encore merci pour vos retours 🙏

Hello tout le monde!

Comme promis, je pose mon code ici.
Petit rappel sur son utilitĂ© : DĂ©sactive le dĂ©filement de la page lorsqu’un hamburger menu est ouvert (en mode desktop) et empĂȘche le dĂ©placement du body et de la navbar vers la droite aprĂšs la disparition de la barre de dĂ©filement.
Une version de base et une version qui gùre aussi les liens vides et les liens d’ancrage (#id)

  1. Version de base sans garde-fou :

let scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;

$(".w-nav-button").on("click", function () {
 $(this).toggleClass("is-open");

 if ($(this).hasClass("is-open")) {
  $("html, body").css("overflow", "hidden");
  $(".w-nav, body").css({ "padding-right": scrollbarWidth + "px" });
 } else {
  $("html, body").css("overflow", "");
  $(".w-nav, body").css("padding-right", "");
 }
});

2. Version qui ferme systĂ©matiquement le menu si on reste sur la mĂȘme page aprĂšs avoir cliquĂ© sur un lien d’ancrage (venant du menu ou de la navbar) :

let scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;

$(".w-nav-button").on("click", function () {
 $(this).toggleClass("is-open");

 if ($(this).hasClass("is-open")) {
  $("html, body").css("overflow", "hidden");
  $(".w-nav, body").css({ "padding-right": scrollbarWidth + "px" });
 } else {
  restoreScroll();
 }
});

$(".w-nav a, .w-nav button").on("click", function () {
 if (!$(this).is(".w-nav-button")) {
  $(".w-nav-button").removeClass("is-open");
  restoreScroll();
 }
});

function restoreScroll() {
 $("html, body").css("overflow", "");
 $(".w-nav, body").css("padding-right", "");
}

J’utilise ici les classes gĂ©nĂ©rĂ©es par Webflow pour rendre le code “universel”, mais vous ĂȘtes libre d’adapter avec vos propres classes si besoin.

N’hĂ©sitez pas Ă  me dire ce que vous en pensez ou si vous voyez des amĂ©liorations possibles ! 🙂

Add a reply
Sign up and join the conversation on Slack