56 votes

désactiver le défilement du navigateur lorsque la boîte de dialogue modale de jQuery UI est ouverte

Est-il possible de désactiver le défilement dans le navigateur (uniquement pour les barres de défilement du navigateur) lorsqu'un dialogue modal jQuery UI est ouvert ?

Remarque : je veux que le défilement soit activé dans la boîte de dialogue.

0 votes

Comment avez-vous activé le défilement dans votre boîte de dialogue en utilisant la bonne réponse ?

0 votes

Pour l'instant, je règle la css position:fixed pour le div de dialogue, de sorte que même si le navigateur défile, le dialogue reste fixe, et à l'intérieur du dialogue, le défilement fonctionne avec la css par défaut (overflow : auto).

0 votes

Référence JSBin pour le débordement css jsbin.com/yicidecodu/1/edit?html,css,output

76voto

airtonix Points 1048
$(formObject).dialog({
 create: function(event, ui) {
  $("body").css({ overflow: 'hidden' })
 },
 beforeClose: function(event, ui) {
  $("body").css({ overflow: 'inherit' })
 }
});

Ou comme je le dis dans le commentaire ci-dessous :

var dialogActiveClassName="dialog-active";
var dialogContainerSelector="body";

$(formObject).dialog({
 create: function(event, ui) {
   $(dialogContainerSelector).addClass(dialogActiveClassName);
 },
 beforeClose: function(event, ui) {
   $(dialogContainerSelector).removeClass(dialogActiveClassName);
 }
});

Mais en fait, pour être honnête, vous devriez vous assurer que la création d'un dialogue fait bouillonner un événement jusqu'à votre objet fenêtre où vous surveillez lesdits événements, en gros quelque chose comme ce pseudo :

var dialogActiveClassName="dialog-active";
var dialogContainerSelector="body";
$(window).on("event:dialog-opened", function(){
    $(dialogContainerSelector).addClass(dialogActiveClassName);
});
$(window).on("event:dialog-closed", function(){
    $(dialogContainerSelector).removeClass(dialogActiveClassName);
});

3 votes

Cela ne fait que masquer les barres de défilement, cela n'empêche pas le défilement.

9 votes

Ça a aussi marché pour moi. Si vous voulez ouvrir la boîte de dialogue plus tard (et non au chargement de la page), liez le masquage de la barre de défilement à l'événement "open" au lieu de "create".

2 votes

Au début, il ne fonctionnait pas pour mon projet lorsque j'utilisais IE8. Cependant, j'ai réussi à le faire fonctionner en remplaçant le sélecteur ci-dessus par $("html, body") afin que le style soit appliqué à la fois à l'élément body et à l'élément HTML. Pour une raison quelconque, cela a commencé à fonctionner pour moi ! Je le mentionne ici au cas où quelqu'un d'autre rencontrerait ce problème.... en espérant que cela fera gagner du temps à quelqu'un. Le seul problème que je rencontre avec cette solution globale est que lorsque la barre de défilement de l'axe Y disparaît, cela crée une légère oscillation horizontale de l'écran. (Lorsque la boîte de dialogue jquery s'ouvre et lorsqu'elle se ferme).

47voto

hallodom Points 1848

J'avais besoin de faire exactement la même chose, de le faire simplement en ajoutant une classe au corps :

.stop-scrolling {
  height: 100%;
  overflow: hidden;
}

Ajoutez la classe puis supprimez-la lorsque vous voulez réactiver le défilement. Testé dans IE, FF, Safari et Chrome.

$('body').addClass('stop-scrolling')

4 votes

Ce site vraiment devrait être la réponse !

0 votes

/golf clap ::single_nod: :

0 votes

Génial ! Vous pouvez mettre sur le dialogue....open:function () {$('body').addClass('stop-scrolling');}, beforeClose:function (){$('body').removeClass('stop-scrolling');}.....

28voto

Naveen Points 4316

Référence JS Bin pour le débordement CSS

Ajouter simplement

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

à votre fonction que montre la modalité .

Et

$('body').css('overflow','scroll');

à votre fonction que ferme la modale.

2 votes

Je n'ai jamais assez apprécié une solution simple. Merci !

0 votes

La meilleure solution !

0 votes

Pour ceux qui utilisent des primefaces et qui veulent empêcher le corps du site de défiler pendant l'affichage de la boîte de dialogue modale, il suffit d'insérer ces deux éléments dans les attributs onHide et onShow de p:dialog, par exemple onHide="$('body').css('overflow','scroll') ;" onShow="$('body').css('overflow','hidden') ;".

7voto

Craig Nakamoto Points 635

Voici ce que j'ai pu trouver de mieux pour résoudre ce problème (j'ai eu le même problème) en utilisant les fonctions référencées dans la réponse de JasCav ci-dessus ( ces fonctions ) :

dialogClass: 'dialog_fixed',
create: function(event, ui) {
    disable_scroll(); // disable while dialog is visible
    $('#dialog_form').hover(
        function() { enable_scroll(); }, // mouse over dialog
        function() { disable_scroll(); } // mouse not over dialog
    );
},
beforeClose: function(event, ui) {
    enable_scroll(); // re-enable when dialog is closed
},

le css est :

.dialog_fixed { position:fixed !important; }

et cela permet de garder le dialogue fixé sur la page, ce dont nous n'avons peut-être plus besoin.

Cela permet le défilement de la souris lorsque celle-ci se trouve au-dessus de la boîte de dialogue, mais pas lorsqu'elle se trouve en dehors de celle-ci. Malheureusement, la page principale continue de défiler lorsque la souris se trouve au-dessus de la boîte de dialogue et que vous dépassez la fin du contenu à l'intérieur de la boîte de dialogue (dans IE immédiatement, dans Safari et Firefox après un court délai). J'aimerais bien savoir comment résoudre ce problème.

Je l'ai testé dans Safari 5.1.5, Firefox 12 et IE 9.

4voto

JasCav Points 18931

Vous ne pouvez pas désactiver complètement le défilement, mais vous pouvez arrêter le défilement avec la molette de la souris et les boutons qui effectuent généralement le défilement.

Jetez un coup d'œil à cette réponse pour comprendre comment cela se passe. Vous pouvez appeler ces fonctions sur le créer un événement et tout revenir à la normale, sur fermer .

19 votes

C'est une bonne solution, mais elle désactive également le défilement dans la boîte de dialogue. Or, si je comprends bien la question, nous voulons que le défilement fonctionne dans la boîte de dialogue, mais pas ailleurs.

0 votes

@CraigNakamoto, je pense que vous pouvez attacher l'eventListener au dialogue après. Ainsi, le défilement sera désactivé au niveau du document, mais la boîte de dialogue aura toujours un écouteur d'événements pour le défilement. Ce sera quelque chose comme $(document).('on', '.dialog', function(){ /*scroll code*/ });

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