Les modaux Bootstrap continuent d'ajouter du rembourrage au corps après la fermeture

101

J'utilise bootstrap et Parse Framework pour créer une petite application Web. Mais ces modaux Bootstrap continuent d'ajouter du rembourrage au corps après la fermeture. Comment résoudre ça?

J'ai essayé de mettre ce code dans mon javascript:

$('.modal').on('hide.bs.modal', function (e) {
    $("element.style").css("padding-right","0");
});


Mais ça ne marche pas. Est-ce que quelqu'un sait comment réparer ceci?

Mon code:

        <button type="button" class="btn btn-lg btn-default" data-toggle="modal" data-target="#loginModal">Admin panel</button>

         <div id="loginModal" class="modal fade" role="dialog">
                  <div class="modal-dialog modal-sm">

                    <!-- Modal content -->
                    <div class="modal-content">

                      <!-- header -->
                      <div class="modal-header"> 
                        <button type="button" class="close" data-dismiss="modal">&times;</button>
                        <h4 class="modal-title">Login</h4>
                      </div>

                      <!-- body -->
                      <div class="modal-body text-center" >
                          <input class='form-control' type="text" id="userName" placeholder="Username" ng-model='username'>
                          <input class='form-control' type="password" id="password" placeholder="Password" ng-model='password'>

                      <div class="modal-footer">
                        <button type="button" class="btn btn-default" id="loginButton" ng-click="goToAdminPanel()">Login</button>
                        <button type="button" class="btn btn-default" data-dismiss="modal" id="closeButton">Close</button>
                      </div>

                    </div>

                 </div>
                </div>
           </div>

        <div id="adminPanel" class="modal fade" role="dialog">
                  <div class="modal-dialog modal-lg">

                    <!-- Modal content -->
                    <div class="modal-content">

                      <!-- header -->
                      <div class="modal-header"> 
                        <button type="button" class="close" data-dismiss="modal">&times;</button>
                        <h4 class="modal-title">Admin Panel</h4>
                      </div>

                      <!-- body -->
                      <div class="modal-body" >

                        </div>

                      <div class="modal-footer">
                        <button type="button" class="btn btn-default" id="saveButton">Save</button>

                        <button type="button" class="btn btn-default" data-dismiss="modal" id="closeButton">Close</button>



                    </div>

                 </div>
                </div>
           </div>


    $scope.goToAdminPanel = function(){
    Parse.User.logIn($scope.username,$scope.password,{
        success: function(user){
            $('#loginModal').modal('hide');
            $('#adminPanel').modal();
        },
        error: function(user, error) {
            alert('Wrong username and/or password');
        }
    });
}

J'utilise bootstrap et Parse Framework pour créer une petite application Web. Mais ces modaux Bootstrap continuent d'ajouter du rembourrage au corps après la fermeture. Comment résoudre ça?

phuwin
la source
2
Son non seulement ajouter , padding-rightmais aussi ajouter la classe comme modal-openpour overflow: hiddenson juste pour cacher la barre de défilement .
vivekkupadhyay
@vivekkupadhyay Salut, j'ai essayé de remplacer le modal-openavec padding-right:0 !important;mais cela ne fonctionne pas, savez-vous pourquoi?
phuwin
Veuillez vérifier ma réponse ci-dessous, cela vous aidera sûrement.
vivekkupadhyay
Vous l'avez presque compris. Vous déclenchez la padding-rightmise à jour de la propriété css sur l'événement correct, mais vous la déclenchez sur le mauvais élément. Il doit être tiré sur l' bodyélément. Veuillez consulter ma réponse ci-dessous.
Sam Malayek

Réponses:

62

Cela pourrait être un problème de Bootstrap modal. D'après mes tests, il semble que le problème est que l' #adminPanelinitialisation est en cours alors qu'elle #loginModaln'a pas encore été totalement fermée. Les solutions de contournement peuvent être de supprimer l'animation en supprimant la fadeclasse sur #adminPanelet / #loginModalou en définissant un délai d'expiration (~ 500 ms) avant d'appeler $('#adminPanel').modal();. J'espère que cela t'aides.

orlland
la source
10
J'ai enlevé la classe .fadede #loginModalet il fonctionne.
phuwin
8
Que faire si je veux résoudre ce problème et maintenir l'animation modale en même temps?
Leonardo Montenegro
@LeonardoMontenegro Je voulais aussi cela et récemment j'ai également posté la même question que le problème était que l'animation avait été supprimée, mais je l'ai résolu en supprimant d'abord la classe de fondu juste avant de la cacher et en l'ajoutant à nouveau juste après cela, cela fonctionnait bien que ce soit une solution de contournement pas une bonne solution à moins que bootstrap ne le corrige dans le fichier lui
Kramer
121

Je viens d'utiliser le correctif css ci-dessous et cela fonctionne pour moi

body { padding-right: 0 !important }
Ngatia Frankline
la source
1
Vous avez la propriété css correcte, mais celle-ci doit être déclenchée lors de l' hide.bs.modalévénement d'amorçage. Veuillez consulter ma réponse ci-dessous.
Sam Malayek
59
.modal-open {
    padding-right: 0px !important;
}

Juste changé en

.modal {
    padding-right: 0px !important;
}
Suge
la source
6
C'est la vraie bonne réponse - "ne pas utiliser la fonction de fondu" est un compromis, pas une solution.
Tasgall
1
J'ai fait la même chose, mais il pourrait être nécessaire d'ajouter également "overflow: auto! Important" car lorsque le modal est affiché, la barre de défilement est également masquée.
Jaigus
J'ai utilisé le sélecteur ".modal.fade.show" pour cibler tous mes modaux avec la classe de fondu.
Andrew Schultz
L'ajout des mêmes styles à .modal.fade.show fonctionne aussi
Rami Zebian
Merci! J'avais besoin des deux, car à la fois le modalpanneau et body.modal-openle rembourrage. Mais cela a résolu le problème
Oliver Schimmer
20

Une solution pure css qui conserve la fonctionnalité d'amorçage comme elle se doit.

body:not(.modal-open){
  padding-right: 0px !important;
}

Le problème est causé par une fonction dans le jQuery bootstrap qui ajoute un peu de padding-right lorsqu'une fenêtre modale s'ouvre, s'il y a une barre de défilement sur la page. Cela empêche le contenu de votre corps de se déplacer lorsque le modal s'ouvre, et c'est une fonctionnalité intéressante. Mais cela cause ce bug.

Un grand nombre des autres solutions proposées ici interrompent cette fonctionnalité et font légèrement changer votre contenu lorsque le modal s'ouvre. Cette solution préservera la fonctionnalité du modal bootstrap sans déplacer le contenu, mais corrigera le bogue.

chasmani
la source
1
Je ne sais pas pourquoi quelqu'un ne voudrait pas de solution CSS. Je ne veux pas de solution JS. Celui-ci a l'air bien.
Csaba Toth
1
J'en avais besoin car si je rejetais le modal ( après un Asyc-Postback à l'intérieur du modal), il conserverait toujours cet étrange rembourrage. Cependant, j'avais toujours besoin de la réponse @Benjamin Oats pour que tout fonctionne lorsque j'avais des barres de défilement sur la page.
MikeTeeVee
16

Si vous êtes plus préoccupé par le padding-rightproblème, vous pouvez le faire

jQuery :

$('#loginModal').on('show.bs.modal', function (e) {
     $('body').addClass('test');
});

cette volonté addClassà votre bodypuis en utilisant ceci

CSS :

.test[style] {
     padding-right:0 !important;
 }

et cela vous aidera à vous en débarrasser padding-right.

Mais si vous êtes également préoccupé par la dissimulation, scrollvous devez également ajouter ceci:

CSS :

.test.modal-open {
    overflow: auto;
 }

Voici le JSFiddle

Jetez un œil, cela fera l'affaire pour vous.

vivekkupadhyay
la source
On dirait que ça ne marche pas. Ou j'ai fait quelque chose de mal. Il ajoute encore padding-rightà bodyet augmente la quantité de padding-rightpar 15px chaque fois que je ferme le panneau d' administration.
phuwin
Je viens de vérifier votre lien, il semble que votre code ne s'exécute pas car il n'est pas nécessaire $(document).ready(function(){de mettre votre code à l' intérieur.
vivekkupadhyay
essayez de mettre une alerte à l'intérieur de votre code puis vous pouvez vérifier que votre code n'est pas en cours d'exécution. cela fonctionne bien sur violon et ne fonctionnera sur votre page que si vous l'utilisez en conséquence
vivekkupadhyay
Pour une raison, le code ne s'exécute pas lorsque le modal est affiché.
phuwin
1
@vivekkupadhyay Merci beaucoup pour vos efforts. Bonne journée.
phuwin
13

Ouvrez simplement bootstrap.min.css

Trouver cette ligne (par défaut)

.modal-open{overflow:hidden;}

et changez-le comme

.modal-open{overflow:auto;padding-right:0 !important;}

Cela fonctionnera pour chaque modal du site. Vous pouvez faire un débordement: auto; si vous souhaitez conserver la barre de défilement telle quelle lors de l'ouverture de la boîte de dialogue modale.

Ashok Sen
la source
@Ashok Pouvez-vous expliquer la cause du problème?
dude
6
Cette solution m'a orienté dans la bonne direction. Mais, au lieu de modifier bootstrap.min.css, j'ai mis .modal-open {overflow: auto; padding-right: 0! Important;} dans ma feuille de style de thème principal et cela a fonctionné!
Pratyush Deb
3
Ne modifiez jamais directement le CSS de bootstrap. Ajoutez toujours les remplacements au CSS dans votre propre feuille de style. Tout comme @PratyushDeb l'a suggéré.
dotnetengineer
Ce n'est pas une excellente solution car cela permet de faire défiler le contenu derrière le modal. Le modal grise ce contenu car l'utilisateur est censé interagir avec lui et uniquement avec lui.
ubiquibacon
11

J'ai eu ce même problème pendant TRES longtemps. Aucune des réponses ici n'a fonctionné! Mais ce qui suit l'a corrigé!

$(document.body).on('hide.bs.modal,hidden.bs.modal', function () {
    $('body').css('padding-right','0');
});

Il y a deux événements qui se déclenchent à la fermeture d'un modal, d'abord c'est hide.bs.modal, puis c'est hidden.bs.modal. Vous devriez pouvoir en utiliser un seul.

Sam Malayek
la source
3
Cela ne fonctionnait pas pour moi lorsque j'ai ajouté un auditeur pour les deux hide.bs.modalet hidden.bs.modal. Mais a parfaitement fonctionné lorsque j'ai retiré hide.bs.modalde l'auditeur. :)
HariV
Pour le contre-votant: Veuillez laisser des critiques constructives dans un commentaire afin que je puisse améliorer cette réponse.
Sam Malayek
3

solution facile

ajouter cette classe

.modal-open {
    overflow: hidden;
    padding-right: 0 !important;
}

C'est un remplacement mais fonctionne

Avoine Benjamin
la source
1
Cette classe, combinée à la réponse publiée par @Chasmani, a apporté une solution totale et complète pour moi. Également +1 pour avoir dit " ajouter cette classe ". C'est fou de lire les réponses de tout le monde ici suggérant de remplacer le fichier Bootstrap.css. Laissez ce fichier seul, et ayez votre propre fichier CSS dans lequel vous appliquez les " Overrides Bootstrap ". Ceci est important afin que vous puissiez tous les documenter au même endroit, ne pas les perdre lors de la mise à jour / mise à niveau de Bootstrap, et les examiner (pour voir si vous avez toujours besoin des solutions de contournement) après la mise à niveau vers une nouvelle version de Bootstrap.
MikeTeeVee
1
J'accepte @MikeTeeVee que vous ne devriez certainement pas modifier le css bootstrap. Je n'ai pas inclus cela dans ma réponse parce que je pensais que c'était un peu hors de portée pour répondre à cette question
chasmani
2

Je viens de supprimer la fadeclasse et de modifier l'effet de fondu de classe avec animation.css. J'espère que cela aidera.

febriana andringa
la source
2

removeAttr ne fonctionnera pas, vous supprimerez la propriété CSS comme ceci:

        $('.modal').on('hide.bs.modal', function (e) {
            e.stopPropagation();
            $('body').css('padding-right','');
        }); 

Sans valeur de propriété, la propriété est supprimée.

jcdsr
la source
2

Je charge le CSS par défaut bootstrap 3.3.0 et j'ai un problème similaire. Résolu en ajoutant ce CSS:

body.modal-open { overflow:inherit; padding-right:inherit !important; }

L'important est que le javascript modal bootstrap ajoute 15px de remplissage vers la droite par programme. Je suppose que c'est pour compenser la barre de défilement, mais je ne veux pas cela.

gauravbhai daxini
la source
2

Avec Bootstrap 4, cela a fonctionné pour moi:

$(selector).on('hide.bs.modal', function (e) {
    $('body').css('padding-right','0');
});
michal.jakubeczy
la source
1

J'ai le même problème avec Bootstrap 3.3.7 et ma solution pour la barre de navigation fixe: ajouter ce style à votre css personnalisé.

.modal-open {
    padding-right: 0px !important;
    overflow-y: scroll;
}

cela rendra votre modal affiché pendant que la fenêtre de défilement fonctionnera toujours. merci, j'espère que cela vous aidera aussi

Debrian Ruhut Saragih
la source
1

Je sais que c'est une vieille question, mais aucune des réponses d'ici n'a supprimé le problème dans mes situations similaires et j'ai pensé qu'il serait utile que certains développeurs lisent également ma solution.

J'utilise pour ajouter du CSS au corps lorsqu'un modal est ouvert, dans les sites Web où il est encore utilisé bootstrap 3.

body.modal-open{
            padding-right: 0!important;
            overflow-y:scroll;
            position: fixed;
        }
Madalina Taina
la source
1

Ma solution ne nécessite aucun CSS supplémentaire.

Comme indiqué par @Orland, un événement se produit toujours lorsque l'autre démarre. Ma solution consiste à démarrer le deuxième événement (en affichant le adminPanelmodal) uniquement lorsque le premier est terminé (en masquant le loginModalmodal).

Vous pouvez accomplir cela en attachant un auditeur à l' hidden.bs.modalévénement de votre loginModalmodal comme ci-dessous:

$('#loginModal').on('hidden.bs.modal', function (event) {
    $('#adminPanel').modal('show');
}

Et, si nécessaire, masquez simplement le loginModalmodal.

$('#loginModal').modal('hide');

De couse vous pouvez implémenter votre propre logique à l'intérieur de l'auditeur afin de décider d'afficher ou non le adminPanelmodal.

Vous pouvez obtenir plus d'informations sur les événements modaux Bootstrap ici .

Bonne chance.

Cleber de Souza Alcântara
la source
1

Les modèles Bootstrap ajoutent ce rembourrage directement au corps si le corps déborde.

Sur bootstrap 3.3.6 (la version que j'utilise), c'est la fonction chargée d'ajouter ce padding-right à l'élément body: https://github.com/twbs/bootstrap/blob/v3.3.6/dist/js /bootstrap.js#L1180

Une solution rapide consiste simplement à remplacer cette fonction après avoir appelé le fichier bootstrap.js:

$.fn.modal.Constructor.prototype.setScrollbar = function () { };

Cela a résolu le problème pour moi.

Scottx
la source
1
body.modal-open{
  padding-right: 0 !important;
}
tian
la source
1

C'est ce qui a fonctionné pour moi:

body.modal-open {
    overflow: auto !important;
}

// Bootstrap uses JS to set the element style so you can
// override those styles like this
body.modal-open[style] {
    padding-right: 0px !important;
}
Jack Vial
la source
1
Fonctionne dans Chrome! Merci.
Gene Kelly
0

Retirez simplement le data-targetdu bouton et chargez le modal en utilisant jQuery.

<button id='myBtn' data-toggle='modal'>open modal</button>

jQuery:

$("#myBtn").modal('show');
Edison D'souza
la source
0

J'ai creusé dans le javascript bootstrap et j'ai trouvé que le code Modal définit le bon remplissage dans une fonction appelée adjustDialog()qui est définie sur le prototype Modal et exposée sur jQuery. Placer le code suivant quelque part pour remplacer cette fonction pour ne rien faire a fait l'affaire pour moi (même si je ne sais pas quelle est la conséquence de ne pas encore définir cela !!)

$.fn.modal.Constructor.prototype.adjustDialog = function () { };

Phil
la source
0

Cela peut résoudre le problème

.shop-modal.modal.fade.in {
    padding-right: 0px !important;
}
Dinoart
la source
0

Ceci est un bogue d'amorçage et corrigé dans v4-dev: https://github.com/twbs/bootstrap/pull/18441 jusqu'à ce que l'ajout de la classe CSS ci-dessous devrait aider.

.fixed-padding {
  padding-right: 0px !important;
}
Ruchita Kasliwal
la source
0

J'ai eu le même problème en utilisant les modaux et ajax. C'était parce que le fichier JS était référencé deux fois, à la fois dans la première page et dans la page appelée par ajax, donc lorsque modal a été fermé, il a appelé l'événement JS deux fois qui, par défaut, ajoute un padding-right de 17px.

Lucas Almeida
la source
0
body {
    padding-right: 0 !important;
    overflow-y: scroll!important;
}

A travaillé pour moi. Notez que la barre de défilement est forcée dans le corps - mais si vous avez de toute façon une page "défilante", cela n'a pas d'importance (?)

user3666136
la source
0
$('.modal').on('hide.bs.modal,hidden.bs.modal', function () {
 setTimeout(function(){
  $('body').css('padding-right',0);
 },1000);
});

Essaye ça

Il ajoutera le padding right 0px au corps après la fermeture modale.

sibaspage
la source
0

Cela se produit lorsque vous ouvrez un modal que le modal précédent n'est pas encore complètement fermé. Pour résoudre ce problème, ouvrez simplement un nouveau modal au moment où tous les modaux sont complètement fermés, vérifiez les codes ci-dessous:

  showModal() {
    let closeModal = $('#your-modal');

    closeModal.modal('hide');
    closeModal.on('hidden.bs.modal', function() {
      $('#new-open-modal').modal('show');
    });
  }
Sakata Gintoki
la source
0

Je maintenant cela est vieux, et toutes les solutions proposées ici peuvent fonctionner. J'ajoute simplement quelque chose de nouveau au cas où cela pourrait aider quelqu'un: j'ai eu le même problème et j'ai remarqué que l'ouverture du modal ajoutait une marge droite à mon sidenav (probablement une sorte d'héritage du rembourrage ajouté au corps). Ajouter {margin-right: 0! Important;} à mon sidenav a fait l'affaire.

Lo Bellin
la source
-1

(Bootstrap v3.3.7) De mon inspecteur de navigateur, j'ai vu que cela est directement défini dans la propriété de style d' élément , la sorcière remplace les propriétés de classe.

J'ai essayé de `` réinitialiser '' la valeur paddig-right lorsque le modal est affiché avec:

$("#myModal").on('shown.bs.modal', function(){
    $(this).css({paddingRight:""});
});

Mais il revient dès que la fenêtre est redimensionnée :( (probablement à partir du script pluggin).

Cette solution a fonctionné pour moi:

var modal_needfix=true;
$("#myModal").on('shown.bs.modal', function(){
    var modalscope=$(this);
    modalscope.css({paddingRight:""});
    if(modal_needfix){
        window.addEventListener("resize",function(){
            requestAnimationFrame(function(){// be sure to act after the pluggin script
                modalscope.css({paddingRight:""});
            });
        });
        modal_needfix=false;
    }
});
Yorg
la source
-1

Comme le dit @Orland, si vous utilisez un effet comme le fondu, nous devons attendre avant d'afficher le modal, c'est un peu piraté mais cela fera l'affaire.

function defer(fn, time) {
    return function () {
        var args = arguments,
            context = this;

        setTimeout(function () {
            fn.apply(context, args);
        }, time);
    };
}

$.fn.modal.Constructor.prototype.show = defer($.fn.modal.Constructor.prototype.show, 350);
Netomo
la source
-2

J'espère qu'il y a encore quelqu'un qui a besoin de cette réponse. Il existe une fonction appelée resetScrollbar () dans bootstrap.js, pour une raison stupide, les développeurs ont décidé d'ajouter les dimensions de la barre de défilement à la droite de remplissage du corps. Donc, techniquement, si vous définissez simplement le remplissage à droite sur une chaîne vide, cela résoudra le problème

Wkirk
la source