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?


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.


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 }

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;
}

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.


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.


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 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.


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


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.


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.


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.


2

Avec Bootstrap 4, cela a fonctionné pour moi:

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

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


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;
        }

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.


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.


1
body.modal-open{
  padding-right: 0 !important;
}

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;
}

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');

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 () { };


0

Cela peut résoudre le problème

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


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.


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 (?)


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.


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');
    });
  }

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.


-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;
    }
});

-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);

-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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.