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.
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.
$(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);
});
Ç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".
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).
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')
Génial ! Vous pouvez mettre sur le dialogue....open:function () {$('body').addClass('stop-scrolling');}, beforeClose:function (){$('body').removeClass('stop-scrolling');}.....
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.
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') ;".
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.
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 .
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.
@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 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.
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