167 votes

Procédure de programmation pour désactiver le défilement des pages avec jQuery

À l'aide de jQuery, je voudrais désactiver le défilement du corps:

Mon idée est de:

  1. Ensemble body{ overflow: hidden;}
  2. Récupérer l' scrollTop();/scrollLeft()
  3. Lier le corps de défilement événement, mis scrollTop/scrollLeft à la capture de la valeur.

Est-il un meilleur moyen?


Mise à jour:

Veuillez voir mon exemple, et pourquoi, au http://jsbin.com/ikuma4/2/edit

Je suis conscient que quelqu'un va penser "pourquoi n'est-il pas juste d'utiliser position: fixed sur le panneau?".

S'il vous plaît ne pas suggérer ce que j'ai d'autres raisons.

248voto

rednaw Points 3856

Ce sera complètement désactiver le défilement:

$('html, body').css({
    'overflow': 'hidden',
    'height': '100%'
})

La restauration:

$('html, body').css({
    'overflow': 'auto',
    'height': 'auto'
})

Testé sur Firefox et Chrome.

143voto

tfe Points 5789

Le seul moyen que j'ai trouvé à faire c'est similaire à ce que vous avez décrit:

  1. Prenez courant de la position de défilement (n'oubliez pas de l'axe horizontal!).
  2. Définir le débordement cachés (probablement souhaitez conserver précédente valeur de débordement).
  3. Faites défiler le document mémorisé la position de défilement avec scrollTo().

Puis lorsque vous êtes prêt à permettent de faire défiler à nouveau, annuler tout ça.

Edit: pas de raison que je ne peux pas vous donner le code depuis que je suis à la peine de creuser...

      // lock scroll position, but retain settings for later
      var scrollPosition = [
        self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
        self.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop
      ];
      var html = jQuery('html'); // it would make more sense to apply this to body, but IE7 won't have that
      html.data('scroll-position', scrollPosition);
      html.data('previous-overflow', html.css('overflow'));
      html.css('overflow', 'hidden');
      window.scrollTo(scrollPosition[0], scrollPosition[1]);


      // un-lock scroll position
      var html = jQuery('html');
      var scrollPosition = html.data('scroll-position');
      html.css('overflow', html.data('previous-overflow'));
      window.scrollTo(scrollPosition[0], scrollPosition[1])

46voto

cubbiu Points 51

essayez ceci

$('#element').on('scroll touchmove mousewheel', function(e){
  e.preventDefault();
  e.stopPropagation();
  return false;
})

28voto

JeanValjean Points 3518

Je viens d'offrir un peu de paramétrage de la solution en tfe. En particulier, j'ai ajouté un peu de contrôle supplémentaires pour s'assurer qu'il n'y a pas de changement du contenu de la page (aka page maj) lorsque la barre de défilement est réglé sur hidden.

Deux fonctions Javascript lockScroll() et unlockScroll() peuvent être définis, respectivement, de verrouiller et de déverrouiller le défilement des pages.

function lockScroll(){
    $html = $('html'); 
    $body = $('body'); 
    var initWidth = $body.outerWidth();
    var initHeight = $body.outerHeight();

    var scrollPosition = [
        self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
        self.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop
    ];
    $html.data('scroll-position', scrollPosition);
    $html.data('previous-overflow', $html.css('overflow'));
    $html.css('overflow', 'hidden');
    window.scrollTo(scrollPosition[0], scrollPosition[1]);   

    var marginR = $body.outerWidth()-initWidth;
    var marginB = $body.outerHeight()-initHeight; 
    $body.css({'margin-right': marginR,'margin-bottom': marginB});
} 

function unlockScroll(){
    $html = $('html');
    $body = $('body');
    $html.css('overflow', $html.data('previous-overflow'));
    var scrollPosition = $html.data('scroll-position');
    window.scrollTo(scrollPosition[0], scrollPosition[1]);    

    $body.css({'margin-right': 0, 'margin-bottom', 0});
}

d'où, je suppose que l' <body> n'a pas de marge initiale.

Notez que, bien que la solution ci-dessus fonctionne dans la plupart des cas pratiques, il n'est pas définitif car il a besoin d'une personnalisation supplémentaires pour les pages qui incluent, par exemple, un en-tête avec position:fixed. Let's go dans ce cas spécial, avec un exemple. Supposer

<body>
<div id="header">My fixedheader</div>
<!--- OTHER CONTENT -->
</body>

avec

#header{position:fixed; padding:0; margin:0; width:100%}

Ensuite, il faut ajouter les éléments suivants dans les fonctions lockScroll() et unlockScroll():

function lockScroll(){
    //Omissis   


    $('#header').css('margin-right', marginR);
} 

function unlockScroll(){
    //Omissis   

    $('#header').css('margin-right', 0);
}

Enfin, prendre soin de quelques-uns des possibles valeur initiale pour les marges ou les rembourrages.

27voto

mr.soroush Points 865

vous pouvez utiliser ce code:

$("body").css("overflow", "hidden");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X