Modal

Utilice el complemento modal JavaScript de Bootstrap para agregar cuadros de diálogo a su sitio para cajas de luz, notificaciones de usuario o contenido completamente personalizado.

Cómo funciona

Antes de comenzar con el componente modal de Bootstrap, asegúrese de leer lo siguiente, ya que nuestras opciones de menú han cambiado recientemente.

  • Los modales se crean con HTML, CSS y JavaScript. Se colocan sobre todo lo demás en el documento y eliminan el desplazamiento <body> para que el contenido modal se desplace en su lugar.
  • Al hacer clic en el "telón de fondo" modal, se cerrará automáticamente el modal.
  • Bootstrap solo admite una ventana modal a la vez.Los modales anidados no son compatibles porque creemos que son experiencias de usuario deficientes.
  • Uso de modales position: fixed , que a veces puede ser un poco particular sobre su representación. Siempre que sea posible, coloque su HTML modal en una posición de nivel superior para evitar posibles interferencias de otros elementos. Es probable que tenga problemas al anidar un .modal dentro de otro elemento fijo.
  • Una vez más, debido a position: fixed , existen algunas advertencias sobre el uso de modales en dispositivos móviles. Consulte nuestros documentos de soporte del navegador para obtener más detalles.
  • Debido a cómo HTML5 define su semántica, el autofocus atributo HTML no tiene ningún efecto en los modales de Bootstrap. Para lograr el mismo efecto, use JavaScript personalizado:

  $('#myModal').on('shown.bs.modal', function () {
    $('#myInput').trigger('focus')
  })

El efecto de animación de este componente depende de la prefers-reduced-motion consulta de medios. Consulte la sección de movimiento reducido de nuestra documentación de accesibilidad .

Siga leyendo para ver demostraciones y pautas de uso.

Ejemplos

A continuación se muestra un ejemplo modal estático (lo que significa que position y display se han anulado). Se incluyen el encabezado modal, el cuerpo modal (requerido para padding ) y el pie de página modal (opcional). Le pedimos que incluya encabezados modales con acciones de descarte siempre que sea posible, o que proporcione otra acción de descarte explícita.


  <div class="modal" tabindex="-1">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h5 class="modal-title">Modal title</h5>
          <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
          </button>
        </div>
        <div class="modal-body">
          <p>Modal body text goes here.</p>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
          <button type="button" class="btn btn-primary">Save changes</button>
        </div>
      </div>
    </div>
  </div>

Demo en vivo

Alternar una demostración modal de trabajo haciendo clic en el botón de abajo. Se deslizará hacia abajo y aparecerá gradualmente desde la parte superior de la página.


  <!-- Button trigger modal -->
  <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal">
    Launch demo modal
  </button>
  
  <!-- Modal -->
  <div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
          <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
          </button>
        </div>
        <div class="modal-body">
          ...
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
          <button type="button" class="btn btn-primary">Save changes</button>
        </div>
      </div>
    </div>
  </div>

Telón de fondo estático

Cuando el fondo se establece en estático, el modal no se cerrará al hacer clic fuera de él. Haga clic en el botón de abajo para probarlo.


  <!-- Button trigger modal -->
  <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#staticBackdrop">
    Launch static backdrop modal
  </button>
  
  <!-- Modal -->
  <div class="modal fade" id="staticBackdrop" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h5 class="modal-title" id="staticBackdropLabel">Modal title</h5>
          <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
          </button>
        </div>
        <div class="modal-body">
          ...
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
          <button type="button" class="btn btn-primary">Understood</button>
        </div>
      </div>
    </div>
  </div>

Desplazamiento de contenido largo

Cuando los modales se vuelven demasiado largos para la ventana gráfica o el dispositivo del usuario, se desplazan independientemente de la página. Pruebe la demostración a continuación para ver lo que queremos decir.

También puede crear un modal desplazable que permita desplazarse por el cuerpo modal agregando .modal-dialog-scrollable a .modal-dialog.


  <!-- Scrollable modal -->
  <div class="modal-dialog modal-dialog-scrollable">
    ...
  </div>

Centrado verticalmente

Agregue .modal-dialog-centered a .modal-dialog para centrar verticalmente el modal.


  <!-- Vertically centered modal -->
  <div class="modal-dialog modal-dialog-centered">
    ...
  </div>
  
  <!-- Vertically centered scrollable modal -->
  <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
    ...
  </div>

Información sobre herramientas y ventanas emergentes

La información sobre herramientas y panecillos se pueden colocar dentro de modales, según sea necesario. Cuando los modales están cerrados, cualquier información sobre herramientas y ventanas emergentes dentro también se descartan automáticamente.


  <div class="modal-body">
    <h5>Popover in a modal</h5>
    <p>This <a href="#" role="button" class="btn btn-secondary popover-test" title="Popover title" data-content="Popover body content is set in this attribute.">button</a> triggers a popover on click.</p>
    <hr>
    <h5>Tooltips in a modal</h5>
    <p><a href="#" class="tooltip-test" title="Tooltip">This link</a> and <a href="#" class="tooltip-test" title="Tooltip">that link</a> have tooltips on hover.</p>
  </div>

Usando la cuadrícula

Utilice el sistema de cuadrícula Bootstrap dentro de un modal anidando .container-fluid dentro de .modal-body . Luego, use las clases normales del sistema de cuadrícula como lo haría en cualquier otro lugar.


  <div class="modal-body">
    <div class="container-fluid">
      <div class="row">
        <div class="col-md-4">.col-md-4</div>
        <div class="col-md-4 ml-auto">.col-md-4 .ml-auto</div>
      </div>
      <div class="row">
        <div class="col-md-3 ml-auto">.col-md-3 .ml-auto</div>
        <div class="col-md-2 ml-auto">.col-md-2 .ml-auto</div>
      </div>
      <div class="row">
        <div class="col-md-6 ml-auto">.col-md-6 .ml-auto</div>
      </div>
      <div class="row">
        <div class="col-sm-9">
          Level 1: .col-sm-9
          <div class="row">
            <div class="col-8 col-sm-6">
              Level 2: .col-8 .col-sm-6
            </div>
            <div class="col-4 col-sm-6">
              Level 2: .col-4 .col-sm-6
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>

Contenido modal variable

¿Tiene un montón de botones que activan el mismo modal con contenidos ligeramente diferentes? Use event.relatedTarget y atributos HTML data-* (posiblemente a través de jQuery ) para variar el contenido del modal según el botón en el que se hizo clic.

A continuación se muestra una demostración en vivo seguida de HTML y JavaScript de ejemplo. Para obtener más información, lea los documentos de eventos modales para obtener detalles sobre relatedTarget.


  <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" data-whatever="@mdo">Open modal for @mdo</button>
  <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" data-whatever="@fat">Open modal for @fat</button>
  <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" data-whatever="@getbootstrap">Open modal for @getbootstrap</button>
  
  <div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h5 class="modal-title" id="exampleModalLabel">New message</h5>
          <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
          </button>
        </div>
        <div class="modal-body">
          <form>
            <div class="form-group">
              <label for="recipient-name" class="col-form-label">Recipient:</label>
              <input type="text" class="form-control" id="recipient-name">
            </div>
            <div class="form-group">
              <label for="message-text" class="col-form-label">Message:</label>
              <textarea class="form-control" id="message-text"></textarea>
            </div>
          </form>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
          <button type="button" class="btn btn-primary">Send message</button>
        </div>
      </div>
    </div>
  </div>

  $('#exampleModal').on('show.bs.modal', function (event) {
    var button = $(event.relatedTarget) // Button that triggered the modal
    var recipient = button.data('whatever') // Extract info from data-* attributes
    // If necessary, you could initiate an AJAX request here (and then do the updating in a callback).
    // Update the modal's content. We'll use jQuery here, but you could use a data binding library or other methods instead.
    var modal = $(this)
    modal.find('.modal-title').text('New message to ' + recipient)
    modal.find('.modal-body input').val(recipient)
  })

Cambiar animación

La $modal-fade-transform variable determina el estado de transformación de .modal-dialog antes de la animación modal de aparición gradual, la $modal-show-transform variable determina la transformación de .modal-dialog al final de la animación modal de aparición gradual.

Si desea, por ejemplo, una animación con zoom, puede configurar $modal-fade-transform: scale(.8).

Quitar animación

Para los modales que simplemente aparecen en lugar de aparecer gradualmente en la vista, elimine la .fade clase de su marcado modal.


  <div class="modal" tabindex="-1" aria-labelledby="..." aria-hidden="true">
    ...
  </div>

Alturas dinámicas

Si la altura de un modal cambia mientras está abierto, debe llamar $('#myModal').modal('handleUpdate') para reajustar la posición del modal en caso de que aparezca una barra de desplazamiento.

Accesibilidad

Asegúrese de agregar aria-labelledby="..." , haciendo referencia al título modal, a .modal . Además, puede dar una descripción de su diálogo modal con aria-describedby on .modal . Tenga en cuenta que no necesita agregar, role="dialog" ya que ya lo agregamos a través de JavaScript.

Incrustar videos de YouTube

Incrustar videos de YouTube en modales requiere JavaScript adicional no en Bootstrap para detener automáticamente la reproducción y más. Consulte esta publicación útil de Stack Overflow para obtener más información.

Tamaños opcionales

Los modales tienen tres tamaños opcionales, disponibles a través de clases de modificadores para colocar en un .modal-dialog . Estos tamaños se activan en ciertos puntos de interrupción para evitar las barras de desplazamiento horizontales en vistas más estrechas.

Talla Clase Ancho máximo modal
Pequeña .modal-sm 300px
Defecto Ninguna 500px
Grande .modal-lg 800px
Extra grande .modal-xl 1140px

Nuestro modal predeterminado sin clase modificadora constituye el modal de tamaño "mediano".


  <div class="modal-dialog modal-xl">...</div>
  <div class="modal-dialog modal-lg">...</div>
  <div class="modal-dialog modal-sm">...</div>

  <!-- Button trigger modal -->
  <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModalFs">
    Full screen modal
  </button>
  
  <!-- Modal -->
  <div class="modal fade modal-full-screen" id="exampleModalFs" tabindex="-1" aria-labelledby="exampleModalFsLabel" aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content modal-full-screen-content modal-dialog-scrollable">
        <div class="modal-header">
          <h5 class="modal-title h4" id="exampleModalFsLabel">Full screen modal</h5>
          <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
          </button>
        </div>
        <div class="modal-body">
          ...
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
          <button type="button" class="btn btn-primary">Save changes</button>
        </div>
      </div>
    </div>
  </div>

Uso

El complemento modal alterna su contenido oculto a pedido, a través de atributos de datos o JavaScript. También se suma .modal-open al <body> para anular el comportamiento de desplazamiento predeterminado y genera un .modal-backdrop para proporcionar un área de clic para descartar los modales mostrados al hacer clic fuera del modal.

A través de atributos de datos

Activa un modal sin escribir JavaScript. Establecer data-toggle="modal" en un elemento de controlador, como un botón, junto con data-target="#foo" o href="#foo" para apuntar a un modal específico para alternar.


  <button type="button" data-toggle="modal" data-target="#myModal">Launch modal</button>

Vía JavaScript

Llame a un modal con id myModal con una sola línea de JavaScript:


  $('#myModal').modal(options)

Opciones

Las opciones se pueden pasar a través de atributos de datos o JavaScript. Para los atributos de datos, agregue el nombre de la opción a data- , como en data-backdrop="".

Nombre Tipo Defecto Descripción
fondo booleano o la cadena 'static' cierto Incluye un elemento de fondo modal. Alternativamente, especifique static un fondo que no cierre el modal al hacer clic.
teclado booleano cierto Cierra el modal cuando se presiona la tecla Escape
atención booleano cierto Pone el foco en el modal cuando se inicializa.
show booleano cierto Muestra el modal cuando se inicializa.

Métodos

Transiciones y métodos asincrónicos

Todos los métodos API son asincrónicos e inician una transición . Vuelven a la persona que llama tan pronto como se inicia la transición, pero antes de que finalice . Además, se ignorará una llamada a un método en un componente en transición .

Consulte nuestra documentación de JavaScript para obtener más información .

.modal(options)

Activa tu contenido como modal. Acepta opciones opcionales object.


  $('#myModal').modal({
    keyboard: false
  })

.modal('toggle')

Cambia manualmente un modal. Vuelve a la persona que llama antes de que el modal realmente se haya mostrado u ocultado (es decir, antes de que ocurra el evento shown.bs.modal o hidden.bs.modal).


  $('#myModal').modal('toggle')

.modal('show')

Abre manualmente un modal. Vuelve a la persona que llama antes de que se haya mostrado realmente el modal (es decir, antes de shown.bs.modal que ocurra el evento).


  $('#myModal').modal('show')

.modal('hide')

Oculta manualmente un modal. Vuelve a la persona que llama antes de que el modal se haya ocultado realmente (es decir, antes de hidden.bs.modal que ocurra el evento).


  $('#myModal').modal('hide')

.modal('handleUpdate')

Reajuste manualmente la posición del modal si la altura de un modal cambia mientras está abierto (es decir, en caso de que aparezca una barra de desplazamiento).


  $('#myModal').modal('handleUpdate')

.modal('dispose')

Destruye el modal de un elemento.

Eventos

La clase modal de Bootstrap expone algunos eventos para conectarse a la funcionalidad modal. Todos los eventos modales se disparan en el propio modal (es decir, en el <div class="modal">).

Tipo de evento Descripción
show.bs.modal Este evento se activa inmediatamente cuando show se llama al método de instancia. Si es causado por un clic, el elemento seleccionado está disponible como relatedTarget propiedad del evento.
mostrado.bs.modal Este evento se activa cuando el modal se ha hecho visible para el usuario (esperará a que se completen las transiciones CSS). Si es causado por un clic, el elemento seleccionado está disponible como relatedTarget propiedad del evento.
hide.bs.modal Este evento se activa inmediatamente cuando hide se llama al método de instancia.
hidden.bs.modal Este evento se activa cuando el modal ha terminado de ocultarse al usuario (esperará a que se completen las transiciones CSS).
hidePrevented.bs.modal Este evento se activa cuando se muestra el modal, su telón de fondo es static y se realiza un clic fuera del modal o se realiza una pulsación de tecla de escape con la opción de teclado o data-keyboard configurada en false.

  $('#myModal').on('hidden.bs.modal', function (e) {
    // do something...
  })