Bootstrap modal: el fondo salta a la parte superior al alternar


110

Tengo un problema con un modal. Tengo un botón en una página que cambia el modal. Cuando aparece el modal, la página salta a la parte superior.

Hice todo lo que pude para encontrar una solución / etc, pero estoy realmente perdido.

EDITAR:

También he probado con: $('#myModal').modal('show');pero tiene exactamente el mismo efecto.


Hola Benni. Sí, definitivamente lo soy. También probé con: $ ('# myModal'). Modal ('show'); pero tiene exactamente el mismo efecto.
FooBar

1
¿Puede esto ayudarlo? El mismo problema: stackoverflow.com/questions/12894570/…
Mark

@Mark, vea mi respuesta a continuación ...
Ravimallya

Me di cuenta de que si hago clic en cualquier lugar del, windowel modal se dispara. Eso parece extraño e inesperado. Quité la buttonvía devtools, y en cualquier lugar haciendo clic en la página todavía abierto la ventana modal. ¿Fue ese el comportamiento deseado? Me pregunto si no tiene el selector correcto para el evento de clic modal.
dward

Respuestas:


174

Cuando se abre el modal modal-open, se establece una clase en la <body>etiqueta. Esta clase se ajusta overflow: hidden;al cuerpo. Agregue esta regla a su hoja de estilo para anular el estilo bootstrap.css:

body.modal-open {
    overflow: visible;
}

Ahora el pergamino debería permanecer en su lugar.


@pstenstrm, tengo una duda. le dijo que anulara el CSS para la clase .modal-open. Pero, ¿qué pasa si hay divs de cierre adicionales y, en mi respuesta, no he anulado ninguna clase en mi resolución? Funciona bien después de eliminar 2 divs adicionales. bs modal agregando .modal-backdrop div que se confundirá donde debe cerrarse debido a etiquetas de cierre adicionales.
Ravimallya

4
No me funciona, tengo el modal dentro de un iframe y se está desplazando hacia la parte superior ... ¿alguna idea?
Cabuxa.Mapache

5
Esto me lo arregló. Solo para agregar la raíz de mi problema fue 'body {height: 100%}'.
PeteG

23
No funciona para mi. Tengo un modal de vainilla con el que estoy abriendo .modal('show')y todavía se desplaza hasta la parte superior de la página. Bootstrap v3.2.0
MandM

6
Tuve que agregar algo position: inherita esta clase, pero funcioné como un encanto después de eso.
adrian3martin

28

Si está llamando modal con etiqueta. Intente eliminar '#' del atributo href y llame al modal con atributos de datos.

<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
  Launch demo modal
</button>

Lo abro exactamente como lo ha publicado allí. Echa un vistazo al enlace
FooBar

5
si no usas el "<button>" sino <a>, como en mi caso, pierdes el ícono "finger button" cuando mueves el cursor del mouse sobre el objeto. Para superar esto, lo hice: ... href = "# mai_modal_id" data-toggle = "modal" ... y no
usé

3
@pagurix - Tu comentario funcionó mejor para mi escenario.
AlfredBr

Creo que @pagurix debería escribir su comentario como una respuesta separada. Lo único que ayudó. ¡Pulgares hacia arriba!
Vibhor Dube

14

si está utilizando la etiqueta de anclaje como <a href"#" ..> ... </a>y href="#"está creando un problema, elimínelo. Puedes leer más aquí


12
$('the thing you click on').click(function ($e) {
            $e.preventDefault();
});

Esto te ayudará a detener la barra de desplazamiento en la parte superior. Me funcionó


5

Posiblemente trabajando con modales anidados en algún lugar del código:

body.modal-open {
    overflow: visible;
    position: absolute;
    width: 100%;
    height:100%;
}

Para mí fue una combinación de posición, altura y desbordamiento.


4

No veo un error específico, pero le aconsejo que verifique su sintaxis html .

Una pequeña prueba con tu fuente me da errores como

Línea 127, columna 34: elemento no cerrado div.

              <div class="inner onlySides">

Esto podría ser un problema.


Gracias, investigaré esto, aunque me cuesta creer que esto pueda desencadenar el problema que estoy experimentando. Parece que está utilizando un complemento para rastrear esto, si es así; ¿cual?
FooBar

No uso plugin excepto firebug. Siempre es bueno verificar la validez de su página en validator.w3.org . Sería un problema porque si ha abierto div, tendrá un comportamiento extraño :)
billyJoe

4

La forma más sencilla de resolver el fondo de salto es definir dos parámetros:

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

3

Intenté replicar este problema en mi localhost y, por extraño que parezca, hay un conflicto con el archivo Bootstrap JS que estás usando.

Intenta comentar tu código de:

<script src="/min/?f=bootstrap.min.js,modernizr.js,bootstrap-datetimepicker.js,nprogress.js,feedback.js,select2.min.js,jquery.unveil.js,equalheights.jquery.js,hogan-v2.0.0.min.edu-custom.js,jquery.visible.min.js,handlebars-v1.2.0.js,typeahead.bundle.min.js,jquery.gridster.js,cookie.jquery.js,jquery.autosize.min.js,application.js&ver=1392814384"></script>    

Y en su lugar use Bootstrap 2.3.2:

<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>

Esto hizo que funcionara para mí.

Lo intenté con Bootstrap versión 3 pero no funcionó. Todavía no puedo identificar la parte del problema, pero en algún lugar Firebug me arrojó un e.preventDefault() is not a functionerror; supongo que esta debería ser la causa raíz, pero aún tengo que compararlo con los otros archivos JS.


3

Intenté colocar .modal top en el centro de la pantalla.

.modal {
    position: absolute;
    top: 50%;
}

Solo mis 2 centavos de pensamientos.


Suficientemente cerca. No votaré negativamente porque mi problema puede estar en otra parte, pero esto hizo que la mitad inferior de la pantalla se atenuara, pero el modal se colocó hacia el centro.
artesano

3

En bootstrap 3.1.1 resolví con esta solución:

body.modal-open {
    position: absolute !important;
}

2
Me salvaste el día @Filo Muchas gracias
vinothini

2

tiene 2 divetiquetas de cierre adicionales justo antes <div id="footer">o después del <div id="mainFrame" class="group">div. Estoy usando Visual Studio 2012 Express para inspeccionar esto.

Elimine estos 2 divs adicionales y háganos saber cómo funciona. Eliminé divs adicionales y eliminé todos los scripts personalizados. solo retuvo jquery core y bootstrap en el pie de página. aquí está la captura de pantalla del resultado final. aquí está el patio de recreo de jsbin para usted que está funcionando bien.

Le sugiero que use headjs para cargar todos los scripts y archivos css. Además, no es una buena práctica cargar los scripts dos veces.

ingrese la descripción de la imagen aquí


4
Las respuestas con votos negativos necesitan comentarios adecuados con razones.
Ravimallya

2

Intente usar esto para abrir modal y vea qué sucede:

<a href="#generalModal" class="btn btn-primary btn-lg" data-toggle="modal">
  Launch demo modal 
</a>

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

Necesitaba el atributo importante para que lo arreglara


Esto funcionó para mí, y tuve el problema de @ MandM (en los comentarios) de la respuesta de pstenstrm: "No funciona para mí. Tengo un modal de vainilla que estoy abriendo con .modal ('mostrar') y todavía se desplaza en la parte superior de la página. Bootstrap v3.2.0 ". El único efecto extraño que tiene es que ahora el fondo se desplazará si sigues desplazándote por un modal que sea más alto que la ventana, pero este es un problema menor para mí. Gracias.
dgig

1

Tuve el mismo problema al usar Bootstrap 2.3.2

Fue un problema para hacer clic en un enlace:

El truco era: devolver falso;

<a href="#" class="btn" onclick="openPositionPopup(${positionReport[0]}); return false;">
     <i class="icon-map-marker"></i>
</a>

y los js:

function openModal() {
    $('#myModal').modal('show');
}

1

Pasé horas en esto probando todo aquí y en otros lugares. Para el uso de material angularjs, resultó que tuve que deshabilitar la animación en el objeto de configuración uibModal.open arg.

Por ejemplo:

  $uibModal.open(
    {
      animation: false,
      component: 'myDialogComponent',
      size: 'lg',
      resolve: {
        details: function() {
          return detailsCollection;
        }
      }
    }
  );

Espero que esto ayude a alguien más.


1

Si enfrenta este problema en un programa Angular, agregue el siguiente código en la primera línea del archivo .scss.

::ng-deep {   
     body.modal-open {
          overflow: visible !important;
          position: absolute !important;   
     } 
}

0

Tuve el mismo problema y creo que lo he resuelto. ¡Solo necesita colocar el HTML modal como hijo directo de la etiqueta del cuerpo ! Sin embargo, puede colocar el código HTML para el botón que activa el modal donde lo necesite. Creo que esto evita la herencia de CSS y los problemas de posición que desencadenan este problema.

Ejemplo:

<body>
    <!-- All your other HTML code -->
    <div>
        <!-- Button trigger modal -->
        <button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
            Launch demo modal
        </button>
    </div>

    <!-- Modal -->
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            <h4 class="modal-title" id="myModalLabel">Modal title</h4>
          </div>
          <div class="modal-body">
            ...
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
            <button type="button" class="btn btn-primary">Save changes</button>
          </div>
        </div>
      </div>
    </div>
</body>

0

Finalmente descubrí este. NO envuelva el botón que apunta al modal en una etiqueta de anclaje.

Malo

<a href"#">
    <button type="button" class="btn"
data-toggle="modal" data-target="#myModal">See Detail</button>
</a>

Bueno

<button type="button" class="btn"
    data-toggle="modal" data-target="#myModal">See Detail</button>

0

Este lo hizo por mi

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

Estaba teniendo un problema similar con la barra de navegación y el contenedor saltando cuando se abrió el modal. Esto es lo que estaba buscando.
Awhitey98

¡Me alegro de que haya ayudado!
warkitty

0

Después de leer docenas de respuestas durante varias horas, copié el código original del archivo de arranque nuevamente y depuré paso a paso para ver qué causaba que siempre saltara a la parte superior. Porque la última versión real de Bootstrap 3 muestra el modal en la posición en la que se encuentra ahora. Me enteré de eso -webkit-transform: translate3d(0,0,0);y height: 100%en mi etiqueta de cuerpo css causó este comportamiento. Quizás esto ayude a alguien.


0

Para mí funciona cuando cambié la versión de 3.1.1 a 3.3.7

Si no tiene que usar la versión 3.3.1, intente reemplazarla.

Después del cambio, es bueno comprobar que el resto de la función funciona correctamente.

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> 

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

0

body.modal-open { position: inherit; }

Esto funcionó de maravilla para mí.


0

Probé todos los ejemplos anteriores, esto es lo único que funcionó para mí:

.modal-open {

            padding-right: 0 !important;

        }

Quitar el acolchado del lado derecho del modelo: evita el salto.


0

altura: el 100% es resolver el problema, pero debe agregar el "div" correcto


0

Tengo el mismo problema y ninguna de las respuestas me ayudó. Encontré una solución que parece estúpida pero funciona al menos en mi caso.

Descubrí que la página se desplaza hacia la parte superior solo una vez y, después de eso, los siguientes modales abiertos funcionan como se esperaba. Entonces descubrí que ocultar cualquier elemento en el DOM inicia el mismo desplazamiento extraño. Así que simplemente creé un div ficticio después de la carga de la página que ocultarlo y eliminarlo y esto resolvió el problema.

var $dummy= $("<div>");
$("body").append($dummy);
$dummy.hide().remove();

0

Estaba enfrentando el mismo problema. El problema era que estaba agregando la clase .modal-open a html y elementos del cuerpo. Simplemente agregue esta clase al cuerpo y todo funcionará como se esperaba.


-1

Prueba esto, funciona perfectamente

/* fix body.modal-open overflow:hidden */
body.modal-open {
    height: auto;
}


-3

Si la respuesta de pstenstrm no funciona para usted, intente combinarla con este HTML de botón de reemplazo:

<a class="btn btn-primary btn-lg" data-toggle="modal" data-target="#generalModal" id="launchbutton" href="#launchbutton"> Launch demo modal </a>

Esto debería mantener el botón en pantalla.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.