Twitter bootstrap modale scorrevole


84

Sto usando il bootstrap di Twitter per un progetto su cui sto lavorando.

Ho una finestra modale che ha una forma un po 'più lunga e non mi è piaciuto che quando la finestra diventava troppo piccola il modale non scorreva (se semplicemente scompariva dalla mia pagina che non è scorrevole).

Per risolvere questo problema ho usato il seguente css

.modal {
    overflow-y:auto;
    max-height:90%;
    margin-top:-45%;
}

Funziona esattamente come voglio in Chrome (ovvero, il modulo è a grandezza naturale quando la finestra è abbastanza grande, ma quando la finestra si restringe, il modale si restringe e diventa scorrevole). Il problema è che in IE il modale è fuori dallo schermo. Qualcuno ha una soluzione migliore a questo problema?

Il mio esempio può essere trovato su tinyhousemap.com (fai clic su "Aggiungi una voce alla mappa" nella finestra di navigazione per visualizzare il modale)

Grazie


Ho trovato e ho utilizzato questa soluzione. È molto semplice nel modo in cui consente lo scorrimento solo al modale bootstrap e non al contenuto in background. github.com/aroc/Bootstrap-Scroll-Modal
Richard Adleta

Risposte:


137

Che ne dici della soluzione di seguito? Ha funzionato per me. Prova questo:

.modal .modal-body {
    max-height: 420px;
    overflow-y: auto;
}

Dettagli:

  1. rimuovere overflow-y: auto;o overflow: auto;dalla classe .modal (importante)
  2. rimuovi max-height: 400px;dalla .modalclasse (importante)
  3. Aggiungi max-height: 400px;a .modal .modal-body (o cosa mai, può essere 420pxo meno, ma non andrebbe più di 450px)
  4. Aggiungi overflow-y: auto;a.modal .modal-body

Fatto, scorrerà solo il corpo.


5
Sono arrivato fin qui da solo, ma volevo davvero che fosse alto quanto la finestra lo permette, piuttosto che il minimo comune denominatore. Ma la specifica max-height: 80%;non funziona, si espande invece di scorrere. Devo usare gli eventi di ridimensionamento per effettuare la regolazione $(".modal")[0].style.maxHeight?
Peter ha vinto

18

Ho fatto una piccola soluzione usando solo jQuery.

Per prima cosa, devi aggiungere una classe aggiuntiva al tuo <div class="modal-body">I chiamato "ativa-scroll", quindi diventa qualcosa del genere:

<div class="modal-body ativa-scroll">

Quindi ora metti questo pezzo di codice sulla tua pagina, vicino al tuo caricamento JS:

<script type="text/javascript">
  $(document).ready(ajustamodal);
  $(window).resize(ajustamodal);
  function ajustamodal() {
    var altura = $(window).height() - 155; //value corresponding to the modal heading + footer
    $(".ativa-scroll").css({"height":altura,"overflow-y":"auto"});
  }
</script>

Funziona perfettamente per me, anche in modo reattivo! :)


1
Ottima soluzione, ma cambierei l'altezza in altezza massima
Oleg

1
Inoltre, potresti usare $ ('. Modal'). On ('show.bs.modal', function (e) {}); per attivare la funzione di dimensionamento. Questo calcolerà l'altezza solo se necessario, non su ogni ridimensionamento e caricamento. Devi solo controllare all'interno della funzione dell'evento se il modale corrente utilizza l'altezza di scorrimento personalizzata prima di calcolare / applicare il css. cioè var scrollModal = $ ('. modal-body.modal-scroll', this); if (scrollModal.length) ...
Robert Waddell

è questo per bootstrap 2 o 3?
spia il

17
/* Important part */
.modal-dialog{
    overflow-y: initial !important
}
.modal-body{
    max-height: calc(100vh - 200px);
    overflow-y: auto;
}

Funziona per Bootstrap 3 senza codice JS ed è reattivo.

fonte


è quel bootstrap 2 o 3? la domanda è stata molto probabilmente pubblicata per bootstrap 2
spia

@spy questo è per bootstrap 3
Guillaume Renoult

8

Prova a eseguire l'override di bootstrap:

 .modal {
position: fixed;

Con:

.modal {
position: absolute;

Ha funzionato per me.


1
Causa problemi di allineamento su IPad
Oleg

4

Ho anche aggiunto

.modal { position: absolute; }

al foglio di stile per consentire lo scorrimento della finestra di dialogo, ma se l'utente si è spostato in fondo a una pagina lunga, il modale può finire nascosto nella parte superiore dell'area visibile.

Capisco che questo non sia più un problema in bootstrap 3, ma alla ricerca di una soluzione relativamente rapida fino a quando non aggiorneremo, ho finito con quanto sopra più chiamando quanto segue prima di aprire il modale

$('.modal').css('top', $(document).scrollTop() + 50);

Sembra essere felice in FireFox, Chrome, IE10 8 e 7 (i browser che avevo a portata di mano)


1

Il tuo modale è nascosto in firefox, e questo è dovuto alla dichiarazione di margine negativo che hai all'interno del tuo foglio di stile generale:

.modal {
    margin-top: -45%; /* remove this */
    max-height: 90%;
    overflow-y: auto;
}

Rimuovi il margine negativo e tutto funziona perfettamente.


La rimozione del margine superiore ha migliorato il modale in modo che non sia così lontano dallo schermo in IE, ma ora è centrato (verticalmente) sullo schermo in una dimensione specifica della finestra. Tutte le altre dimensioni il modale trabocca dalla parte superiore o inferiore dello schermo.
Dan dot net

1
@Dandotnet il modale si posiziona automaticamente al 50% dalla parte superiore della finestra, puoi sovrascriverlo con qualcosa di inferiore come il 10%, ma se hai aggiunto un valore negativo uscirà dallo schermo come in IE. A proposito, lo stesso accade in Firefox.
Andres Ilich

1

In caso di utilizzo .modal {overflow-y: auto;}, creerebbe una barra di scorrimento aggiuntiva sulla destra della pagina, quando il corpo è già in overflow.

Il modo per aggirare questo è rimuovere temporaneamente l' overflow dal tag body e impostare modal overflow-y su auto .

Esempio:

$('.myModalSelector').on('show.bs.modal', function () {

        // Store initial body overflow value
        _initial_body_overflow = $('body').css('overflow');

        // Let modal be scrollable
        $(this).css('overflow-y', 'auto');
        $('body').css('overflow', 'hidden');


    }).on('hide.bs.modal', function () {

        // Reverse previous initialization
        $(this).css('overflow-y', 'hidden');
        $('body').css('overflow', _initial_body_overflow);
});

1

Il problema con la soluzione CSS di @grenoult (che funziona, per lo più), è che è completamente reattiva e su dispositivo mobile quando si apre la tastiera (cioè quando fanno clic su un input nella finestra di dialogo modale) la dimensione dello schermo cambia e la finestra di dialogo modale le dimensioni cambiano e può nascondere l'input su cui hanno appena cliccato in modo che non possano vedere cosa stanno digitando.

La soluzione migliore per me era usare jquery come segue:

$(".modal-body").css({ "max-height" : $(window).height() - 212, "overflow-y" : "auto" });

Non risponde alla modifica delle dimensioni della finestra, ma comunque non accade spesso.


1

Sono stato in grado di superare questo problema utilizzando la metrica "vh" con altezza massima sull'elemento .modal-body. 70vh sembrava giusto per i miei usi. Quindi imposta overflow-y su auto in modo che scorra solo quando necessario.

.modal-body {
   overflow-y: auto;
   max-height: 70vh;
}

0

Niente di tutto questo funzionerà come previsto .. Il modo corretto è cambiare position: fixed to position: absolute per la classe .modal


2
su cosa basi la tua conclusione?
Rafael Herscovici
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.