Bootstrap modal
ajoute automatiquement la classe modal-open
au corps lorsqu'une boîte de dialogue modale est affichée et la supprime lorsque la boîte de dialogue est masquée. Vous pouvez donc ajouter ce qui suit à votre CSS:
body.modal-open {
overflow: hidden;
}
Vous pourriez faire valoir que le code ci-dessus appartient à la base de code CSS Bootstrap, mais c'est une solution simple pour l'ajouter à votre site.
Mise à jour du 8 février 2013
Cela a maintenant cessé de fonctionner dans Twitter Bootstrap v. 2.3.0 - ils n'ajoutent plus la modal-open
classe au corps.
Une solution de contournement consisterait à ajouter la classe au corps lorsque le modal est sur le point d'être affiché et à la supprimer lorsque le modal est fermé:
$("#myModal").on("show", function () {
$("body").addClass("modal-open");
}).on("hidden", function () {
$("body").removeClass("modal-open")
});
Mise à jour du 11 mars 2013 Il
semble que la modal-open
classe reviendra dans Bootstrap 3.0, explicitement dans le but d'empêcher le défilement:
Réintroduit .modal-open sur le corps (afin que nous puissions y faire barrage)
Voir ceci: https://github.com/twitter/bootstrap/pull/6342 - regardez la section Modal .
modal-open
sera de retour dans Bootstrap 3, donc quand cela se lancera, il devrait être sûr de supprimer le code ci-dessus.La réponse acceptée ne fonctionne pas sur mobile (iOS 7 avec Safari 7, au moins) et je ne veux pas que MOAR JavaScript s'exécute sur mon site lorsque CSS le fera.
Ce CSS empêchera la page d'arrière-plan de défiler sous le modal:
Cependant, il a également un léger effet secondaire de défilement essentiellement vers le haut.
position:absolute
résout ce problème, mais réintroduit la possibilité de faire défiler sur mobile.Si vous connaissez votre fenêtre ( mon plugin pour ajouter une fenêtre à la
<body>
), vous pouvez simplement ajouter une bascule CSS pour laposition
.J'ajoute également ceci pour empêcher la page sous-jacente de sauter vers la gauche / droite lors de l'affichage / masquage des modaux.
cette réponse est un x-post.
la source
position: fixed
le corps.Cachez simplement le débordement du corps et cela ne fait pas défiler le corps. Lorsque vous masquez le modal, rétablissez-le en mode automatique.
Voici le code:
la source
Vous pouvez essayer de définir la taille du corps sur la taille de la fenêtre avec débordement: masqué lorsque le modal est ouvert
la source
Vous devez aller au-delà de la réponse de @ charlietfl et prendre en compte les barres de défilement, sinon vous risquez de voir un document refluer.
Ouverture du modal:
body
largeurbody
débordement surhidden
Définissez explicitement la largeur du corps à ce qu'elle était à l'étape 1.
Fermeture du modal:
body
débordement surauto
Définissez la
body
largeur surauto
Inspiré par: http://jdsharp.us/jQuery/minute/calculate-scrollbar-width.php
la source
$body.css("overflow", "auto");
dans la dernière étape :)Avertissement: L'option ci-dessous n'est pas pertinente pour Bootstrap v3.0.x, car le défilement dans ces versions a été explicitement limité au modal lui-même. Si vous désactivez les événements de roue, vous risquez d'empêcher par inadvertance certains utilisateurs d'afficher le contenu dans des modaux dont la hauteur est supérieure à la hauteur de la fenêtre d'affichage.
Encore une autre option: les événements de roue
L' événement de défilement n'est pas annulable. Cependant, il est possible d'annuler les événements de roue de souris et de roue . La grande mise en garde est que tous les navigateurs hérités ne les prennent pas en charge, Mozilla n'a ajouté que récemment la prise en charge de ces derniers dans Gecko 17.0. Je ne connais pas la propagation complète, mais IE6 + et Chrome les prennent en charge.
Voici comment les exploiter:
JSFiddle
la source
overflow:hidden
c'est mieux pour l'instant.la source
Impossible de le faire fonctionner sur Chrome simplement en changeant CSS, car je ne voulais pas que la page défile vers le haut. Cela a bien fonctionné:
la source
Essaye celui-là:
ça a marché pour moi. (prend en charge IE8)
la source
position: fixed
.J'espère que cela t'aides...
la source
Ajouter la classe 'is-modal-open' ou modifier le style de la balise body avec javascript est correct et cela fonctionnera comme supposé. Mais le problème auquel nous devrons faire face est lorsque le corps devient trop plein: caché, il sautera vers le haut, (scrollTop deviendra 0). Cela deviendra un problème d'utilisation plus tard.
Comme solution à ce problème, au lieu de changer le débordement de la balise body: caché, changez-le sur la balise html
la source
Je ne suis pas sûr de ce code, mais ça vaut le coup.
Dans jQuery:
Comme je l'ai déjà dit, je ne suis pas sûr à 100% mais essayez quand même.
la source
Depuis novembre 2017, Chrome a introduit une nouvelle propriété css
overscroll-behavior: contain;
ce qui résout ce problème même si, au moment de la rédaction, la prise en charge de plusieurs navigateurs est limitée.
voir les liens ci-dessous pour plus de détails et la prise en charge du navigateur
la source
La meilleure solution est la solution CSS uniquement
body{overflow:hidden}
utilisée par la plupart de ces réponses. Certaines réponses fournissent un correctif qui empêche également le «saut» causé par la barre de défilement disparue; cependant, aucun n'était trop élégant. J'ai donc écrit ces deux fonctions, et elles semblent fonctionner assez bien.Consultez ce jsFiddle pour le voir en cours d'utilisation.
la source
open modal
largeur des boutons. Chrome le 8Beaucoup suggèrent "débordement: caché" sur le corps, ce qui ne fonctionnera pas (du moins pas dans mon cas), car cela fera défiler le site vers le haut.
C'est la solution qui fonctionne pour moi (à la fois sur les téléphones portables et les ordinateurs), en utilisant jQuery:
Cela fera fonctionner le défilement du modal et empêchera le site Web de défiler en même temps.
la source
Vous pouvez utiliser la logique suivante, je l'ai testée et cela fonctionne (même dans IE)
la source
Je ne suis pas sûr à 100% que cela fonctionnera avec Bootstrap mais ça vaut le coup d'essayer - cela a fonctionné avec Remodal.js qui peut être trouvé sur github: http://vodkabears.github.io/remodal/ et cela aurait du sens pour les méthodes être assez similaire.
Pour arrêter le saut de page vers le haut et également empêcher le déplacement correct du contenu, ajoutez une classe au
body
moment du déclenchement du modal et définissez ces règles CSS:C'est le
position:static
et leheight:auto
qui se combinent pour arrêter le saut de contenu vers la droite. L'overflow-y:hidden;
empêche la page de défiler derrière le modal.la source
Basé sur ce violon: http://jsfiddle.net/dh834zgw/1/
l'extrait de code suivant (à l'aide de jquery) désactivera le défilement de la fenêtre:
Et dans votre css:
Maintenant, lorsque vous supprimez le modal, n'oubliez pas de supprimer la classe noscroll sur la balise html:
la source
overflow
régler surhidden
? +1, car cela a fonctionné pour moi (en utilisanthidden
).J'ai eu une barre latérale qui a été générée par un piratage de case à cocher. Mais l'idée principale est de sauvegarder le document scrollTop et de ne pas le changer lors du défilement de la fenêtre.
Je n'ai tout simplement pas aimé le saut de page lorsque le corps devient «débordement: caché».
la source
Malheureusement, aucune des réponses ci-dessus n'a résolu mes problèmes.
Dans ma situation, la page Web a à l'origine une barre de défilement. Chaque fois que je clique sur le modal, la barre de défilement ne disparaîtra pas et l'en-tête se déplacera un peu à droite.
Ensuite, j'ai essayé d'ajouter
.modal-open{overflow:auto;}
(ce que la plupart des gens ont recommandé). Il a en effet résolu les problèmes: la barre de défilement apparaît après avoir ouvert le modal. Cependant, un autre effet secondaire se dégage qui est que "l'arrière-plan sous l'en-tête se déplacera un peu vers la gauche, avec une autre longue barre derrière le modal"Heureusement, après avoir ajouté
{padding-right: 0 !important;}
, tout est parfaitement réglé. L'en-tête et l'arrière-plan du corps n'ont pas bougé et le modal conserve toujours la barre de défilement.J'espère que cela peut aider ceux qui sont toujours aux prises avec ce problème. Bonne chance!
la source
La plupart des pièces sont ici, mais je ne vois pas de réponse qui rassemble tout cela.
Le problème est triple.
(1) empêcher le défilement de la page sous-jacente
(2) et retirez la barre de défilement
(3) nettoyer lorsque le modal est rejeté
Si le modal n'est pas plein écran, appliquez les liaisons .modal à une superposition plein écran.
la source
Ma solution pour Bootstrap 3:
car pour moi le seul
overflow: hidden
de labody.modal-open
classe n'a pas empêché la page de se déplacer vers la gauche à cause de l'originalmargin-right: 15px
.la source
Je viens de le faire de cette façon ...
Mais lorsque le scroller a disparu, il a tout déplacé à 20 pixels, j'ai donc ajouté
juste après.
Travaille pour moi.
la source
Si les modales sont à 100% hauteur / largeur, "mouseenter / Leave" fonctionnera pour activer / désactiver facilement le défilement. Cela a vraiment fonctionné pour moi:
la source
travaillé pour moi
la source
Pourquoi ne pas faire ça comme Bulma? Lorsque modal est actif, ajoutez à html leur classe .is-clipped qui est en débordement: caché! Important; Et c'est tout.
Edit: Okey, Bulma a ce bug, vous devez donc ajouter d'autres choses comme
la source
Étant donné que pour moi ce problème se présente principalement sur iOS, je fournis le code pour le corriger uniquement sur iOS:
la source
Aucune des réponses ci-dessus ne fonctionnait parfaitement pour moi. J'ai donc trouvé un autre moyen qui fonctionne bien.
Ajoutez simplement un
scroll.(namespace)
écouteur et un ensemblescrollTop
dedocument
fichiers au dernier de sa valeur ...et supprimez également l'écouteur dans votre script de fermeture.
mise à jour
semble, cela ne fonctionne pas bien sur le chrome. une suggestion pour le réparer?
la source
Cela a fonctionné pour moi:
la source
Pour ceux qui se demandent comment obtenir l'événement de défilement pour le modal bootstrap 3:
la source