Bootstrap Modals sigue agregando relleno al cuerpo después de cerrado

100

Estoy usando bootstrap y Parse framework para construir una pequeña aplicación web. Pero esos modales de Bootstrap siguen agregando padding-right to body después de cerrado. ¿Cómo solucionar esto?

Traté de poner este código en mi javascript:

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


Pero no funciona. Sabe alguien cómo arreglar esto?

Mi código:

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

Estoy usando bootstrap y Parse framework para construir una pequeña aplicación web. Pero esos modales de Bootstrap siguen agregando padding-right to body después de cerrado. ¿Cómo solucionar esto?

phuwin
fuente
2
No es solo agregar, padding-rightsino también agregar clases, ya modal-openque overflow: hiddenes solo para ocultar la barra de desplazamiento .
vivekkupadhyay
@vivekkupadhyay Hola, traté de anular el modal-opencon padding-right:0 !important;pero no funciona, ¿sabes por qué?
phuwin
por favor revisa mi respuesta a continuación, seguramente te ayudará.
vivekkupadhyay
Casi lo tienes. Está activando la padding-rightactualización de la propiedad css en el evento correcto, pero la está activando en el elemento incorrecto. Debe dispararse sobre el bodyelemento. Por favor, mira mi respuesta a continuación.
Sam Malayek

Respuestas:

60

Esto podría ser un problema técnico de Bootstrap modal. Según mis pruebas, parece que el problema es que #adminPanelse está inicializando mientras #loginModalaún no se ha cerrado por completo. Las soluciones pueden ser la eliminación de la animación mediante la eliminación de la fadeclase a #adminPanely #loginModalo establecer un tiempo de espera (~ 500 ms) antes de llamar $('#adminPanel').modal();. Espero que esto ayude.

orlland
fuente
10
Quité la clase .fadede #loginModaly funciona.
phuwin
8
¿Qué pasa si quiero solucionar esto y mantener la animación modal al mismo tiempo?
Leonardo Montenegro
@LeonardoMontenegro También quería esto y recientemente también publiqué la misma pregunta, el problema fue que se eliminó la animación, pero lo solucioné eliminando primero la clase de desvanecimiento justo antes de ocultarla y volviéndola a agregar justo después de ocultarla, funcionó, aunque es una solución no adecuada solución a menos que bootstrap lo solucione en el archivo allí mismo
Kramer
121

Acabo de usar la corrección css a continuación y me está funcionando

body { padding-right: 0 !important }
Ngatia Frankline
fuente
1
Tiene la propiedad css correcta, pero debe activarse en el hide.bs.modalevento de arranque. Por favor, mira mi respuesta a continuación.
Sam Malayek
59
.modal-open {
    padding-right: 0px !important;
}

Acaba de cambiar a

.modal {
    padding-right: 0px !important;
}
Suge
fuente
6
Esta es la verdadera respuesta correcta: "no use la función de atenuación" es un compromiso, no una solución.
Tasgall
1
Hice lo mismo, pero podría ser necesario agregar "overflow: auto! Important" también porque cuando se muestra el modal, la barra de desplazamiento también está oculta.
Jaigus
Usé el selector ".modal.fade.show" para apuntar a todos mis modales con la clase fade.
Andrew Schultz
Agregar los mismos estilos a .modal.fade.show también funciona
Rami Zebian
¡Gracias! Necesitaba ambos, porque tanto el modalpanel como body.modal-opentenía el acolchado. Pero esto lo arregló muy bien
Oliver Schimmer
20

Una solución CSS pura que mantiene la funcionalidad de arranque como debería ser.

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

El problema es causado por una función en el bootstrap jQuery que agrega un poco de relleno a la derecha cuando se abre una ventana modal, si hay una barra de desplazamiento en la página. Eso evita que el contenido de su cuerpo cambie cuando se abre el modal, y es una buena característica. Pero está causando este error.

Muchas de las otras soluciones proporcionadas aquí rompen esa característica y hacen que su contenido cambie ligeramente cuando se abre el modal. Esta solución preservará la función del modal de arranque sin cambiar el contenido, pero corregirá el error.

chasmani
fuente
1
No sé por qué alguien no querría una solución CSS. No quiero ninguna solución JS. Este se ve bien.
Csaba Toth
1
Necesitaba esto porque si descartaba el Modal ( después de un Asyc-Postback dentro del Modal), aún conservaría ese relleno extraño. Sin embargo, todavía necesitaba la respuesta de @Benjamin Oats también para que todo funcionara cuando tenía barras de desplazamiento en la página.
MikeTeeVee
16

Si está más preocupado por lo padding-rightrelacionado, puede hacer esto

jQuery :

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

esta voluntad addClassa tu bodyy luego usar esto

CSS :

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

y esto te ayudará a deshacerte de él padding-right.

Pero si también te preocupa la ocultación scroll, debes agregar esto también:

CSS :

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

Aquí está el JSFiddle

Échale un vistazo, te servirá.

vivekkupadhyay
fuente
Parece que no funciona. O hice algo mal. Todavía añade padding-righta bodyy aumenta la cantidad de padding-rightpor 15 píxeles cada vez que cierro el panel de administración.
phuwin
Acabo de comprobar su enlace , parece que su código no se está ejecutando, ya que no está $(document).ready(function(){intentando poner su código dentro de él.
vivekkupadhyay
intente poner una alerta dentro de su código, luego puede verificar que su código no se esté ejecutando. funciona bien en el violín y también funcionará en tu página solo si lo usas en consecuencia
vivekkupadhyay
Por una razón, el código no se ejecuta cuando se muestra el modal.
phuwin
1
@vivekkupadhyay Muchas gracias por su esfuerzo. Que tengas un buen día.
phuwin
13

Simplemente abra bootstrap.min.css

Encuentra esta línea (predeterminada)

.modal-open{overflow:hidden;}

y cámbialo como

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

Funcionará para todos los modos del sitio. Puede hacer overflow: auto; si desea mantener la barra de desplazamiento como está mientras abre el diálogo modal.

Ashok Sen
fuente
@Ashok ¿Puede explicarnos la causa del problema?
amigo
6
Esta solución me indicó la dirección correcta. Pero, en lugar de modificar bootstrap.min.css, puse .modal-open {overflow: auto; padding-right: 0! Important;} en la hoja de estilo de mi tema principal y funcionó.
Pratyush Deb
3
Nunca edite el CSS de Bootstrap directamente. Siempre agregue las anulaciones al CSS en su propia hoja de estilo. Como sugirió @PratyushDeb.
dotnetengineer
Esta no es una gran solución porque permite desplazarse por el contenido detrás del modal. El modal atenúa ese contenido porque se supone que el usuario debe interactuar con él y solo con él.
ubiquibacon
11

Tuve este mismo problema durante mucho tiempo. ¡Ninguna de las respuestas aquí funcionó! ¡Pero lo siguiente lo solucionó!

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

Hay dos eventos que se activan al cerrar un modal, primero es hide.bs.modaly luego es hidden.bs.modal. Debería poder usar solo uno.

Sam Malayek
fuente
3
No funcionó para mí cuando agregué oyente para ambos hide.bs.modaly hidden.bs.modal. Pero funcionó perfectamente cuando lo quité hide.bs.modaldel oyente. :)
HariV
Para el votante en contra: Deje una crítica constructiva en un comentario para que pueda mejorar esta respuesta.
Sam Malayek
3

arreglo fácil

agrega esta clase

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

Es una anulación pero funciona

Benjamín Oats
fuente
1
Esta clase, combinada con la respuesta publicada por @Chasmani, fue una solución total y completa para mí. También +1 por decir " agregar esta clase ". Es una locura leer las respuestas de todos aquí sugiriendo anular el archivo Bootstrap.css. Deje ese archivo en paz y tenga su propio archivo CSS en el que aplique las " Anulaciones de Bootstrap ". Esto es importante para que pueda documentarlos todos en un solo lugar, no perderlos al actualizar / actualizar Bootstrap, y revisarlos (para ver si aún necesita las soluciones) después de actualizar a una nueva versión de Bootstrap.
MikeTeeVee
1
Estoy de acuerdo @MikeTeeVee en que definitivamente no deberías editar el CSS de arranque. No
incluí
2

Acabo de eliminar la fadeclase y cambiar el efecto de desvanecimiento de la clase con animation.css. Espero que esto sea de ayuda.

febriana andringa
fuente
2

removeAttr no funcionará, deberá eliminar la propiedad CSS de esta manera:

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

Sin valor de propiedad, la propiedad se elimina.

jcdsr
fuente
2

Estoy cargando el Bootstrap 3.3.0 CSS predeterminado y tuve un problema similar. Resuelto agregando este CSS:

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

Lo importante es que bootstrap modal javascript agrega 15px de relleno a la derecha de manera programática. Supongo que es para compensar la barra de desplazamiento, pero no quiero eso.

gauravbhai daxini
fuente
2

Con Bootstrap 4 esto funcionó para mí:

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

Tengo el mismo problema con Bootstrap 3.3.7 y mi solución para la barra de navegación fija: Agregar este estilo a su CSS personalizado.

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

hará que su modal se muestre mientras la ventana de desplazamiento aún funciona. gracias, espero que esto también te ayude

Debrian Ruhut Saragih
fuente
1

Sé que esta es una pregunta antigua, pero ninguna de las respuestas de aquí eliminó el problema en mis situaciones similares y pensé que sería útil que algunos desarrolladores también leyeran mi solución.

Utilizo para agregar algo de CSS al cuerpo cuando se abre un modal, en los sitios web donde todavía se usa bootstrap 3.

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

Mi solución no requiere CSS adicional.

Como señaló @Orland, un evento todavía está sucediendo cuando comienza el otro. Mi solución es iniciar el segundo evento (mostrando el adminPanelmodal) solo cuando el primero haya terminado (ocultando el loginModalmodal).

Puede lograrlo adjuntando un oyente al hidden.bs.modalevento de su loginModalmodal como se muestra a continuación:

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

Y, cuando sea necesario, simplemente oculte el loginModalmodal.

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

Por supuesto, puedes implementar tu propia lógica dentro del oyente para decidir si mostrar o no el adminPanelmodal.

Puede obtener más información sobre Bootstrap Modal Events aquí .

Buena suerte.

Cleber de Souza Alcântara
fuente
1

Los modelos Bootstrap agregan ese acolchado directamente al cuerpo si el cuerpo se desborda.

En bootstrap 3.3.6 (la versión que estoy usando), esta es la función responsable de agregar ese relleno directamente al elemento del cuerpo: https://github.com/twbs/bootstrap/blob/v3.3.6/dist/js /bootstrap.js#L1180

Una solución rápida es simplemente sobrescribir esa función después de llamar al archivo bootstrap.js:

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

Esto solucionó el problema para mí.

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

Esto es lo que funcionó para mí:

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
fuente
1
¡Funciona en Chrome! Gracias.
Gene Kelly
0

Simplemente elimine el data-targetdel botón y cargue el modal usando jQuery.

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

jQuery:

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

Busqué en el javascript bootstrap y descubrí que el código modal establece el relleno correcto en una función llamada adjustDialog()que está definida en el prototipo modal y expuesta en jQuery. Colocar el siguiente código en algún lugar para anular esta función y no hacer nada funcionó para mí (¡aunque no sé cuál es la consecuencia de no configurar esto todavía!)

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

Phil
fuente
0

Esto puede resolver el problema.

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

Tuve el mismo problema al usar modales y ajax. Fue porque se hizo referencia al archivo JS dos veces, tanto en la primera página como en la página llamada por ajax, por lo que cuando se cerró modal, llamó al evento JS dos veces que, por defecto, agrega un padding-right de 17px.

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

Trabajó para mi. Tenga en cuenta que la barra de desplazamiento está forzada en el cuerpo, pero si tiene una página de "desplazamiento" de todos modos, no importa (?)

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

Prueba esto

Agregará el relleno 0px a la derecha del cuerpo después del cierre modal.

sibaspage
fuente
0

Ocurre cuando abre un modal que el modal anterior aún no está completamente cerrado. Para solucionarlo, simplemente abra un nuevo modal en el momento en que todos los modales estén completamente cerrados, verifique los códigos a continuación:

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

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

Ahora esto es viejo, y todas las soluciones que se ofrecen aquí pueden funcionar. Solo estoy agregando algo nuevo en caso de que pueda ayudar a alguien: tuve el mismo problema y noté que al abrir el modal estaba agregando un margen derecho a mi sidenav (probablemente una especie de herencia del relleno agregado al cuerpo). Agregar {margin-right: 0! Important;} a mi navegación lateral hizo el truco.

Lo Bellin
fuente
-1

(Bootstrap v3.3.7) Desde el inspector de mi navegador, vi que esto se establece directamente en la propiedad de estilo del elemento , que anula las propiedades de la clase.

Intenté 'restablecer' el valor de paddig-right cuando el modal se muestra con:

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

Pero vuelve tan pronto como se cambia el tamaño de la ventana :( (probablemente desde el script del complemento).

Esta solución funcionó para mí:

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
fuente
-1

Como dice @Orland, si está usando algún efecto como el desvanecimiento, entonces tenemos que esperar antes de mostrar el modal, esto es un poco hacky, pero funcionará.

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
fuente
-2

Espero que todavía haya alguien que necesite esta respuesta. Hay una función llamada resetScrollbar () en bootstrap.js, por alguna estúpida razón, los desarrolladores decidieron agregar las dimensiones de la barra de desplazamiento al relleno del cuerpo a la derecha. entonces, técnicamente, si solo configura el relleno derecho en una cadena vacía, solucionará el problema

wkirk
fuente