bootstrap modal rimuove la barra di scorrimento


Risposte:


115

Questa è una caratteristica, la classe modal-openviene aggiunta all'HTMLbody quando mostri il modale e rimossa quando lo nascondi.

Questo fa scomparire la barra di scorrimento poiché il css bootstrap dice

.modal-open {
    overflow: hidden;
}

Puoi sovrascriverlo specificando

.modal-open {
    overflow: scroll;
}

nel tuo css.


puoi essere più specifico?
El Dude

1
Aggiunti alcuni dettagli in più. Meglio ora?
flup

14
È più appropriato usare overflow-y: scroll, che penso affronti meglio l'intento della domanda degli OP. Utilizzo di overflow: scroll aggiungerà una barra di scorrimento orizzontale nella parte inferiore dello schermo.
Scott

1
perfetto, funziona anche con i modali a cinghia angolare, può semplicemente includere il CSS sopra in un <style></style>interno in templateUrlmodo che non si applichi ad altri modali nell'app.
davidkonrad

2
Usa overflow: inherit; anziché. In questo modo il modale non rimuove lo scorrimento quando hai lo scorrimento e non aggiungi lo scorrimento quando non lo hai
Alisson Alvarenga

31

Penso che l' ereditarietà sia meglio dello scorrimento perché quando apri modal, si aprirà sempre con lo scorrimento, ma quando non hai alcuna pergamena avrai lo stesso problema. Quindi faccio solo questo:

.modal-open {
  overflow: inherit;
}

Questa è la vera risposta. lo scorrimento in eccesso ha ancora effetto su alcuni elementi nel mio caso.
Coisox

26

ero solito

.modal-open {
  overflow-y: scroll;
}

In questo caso si evita di visualizzare la barra di scorrimento orizzontale


potremmo combinarlo con la risposta di @Alisson Alvarenga e usare overflow-y: inherit;
duodvk

23

È meglio usare overflow-y: scorrere e rimuovere imbottitura dal corpo, imbottitura aggiunta modale bootstrap al corpo della pagina.

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

Compatibile con browser IE: browser IE che fa la stessa cosa per impostazione predefinita.


1
Grazie. Inoltre, se il popup modale deve scorrere e il genitore deve rimanere fermo .modal-body {max-height: calc (100vh - 210px); overflow-y: auto; } .modal-open {overflow: nascosto; overflow-y: scorrimento; padding-right: 0! important; }
Oracular Man

9

Grazie a Dio mi sono imbattuto in questo post! Mi stavo tirando fuori i capelli cercando di capire come recuperare le mie barre di scorrimento quando chiudevo la finestra usando il mio link vicino. Ho provato i suggerimenti per CSS ma semplicemente non funzionava correttamente. Dopo aver letto

class modal-open viene aggiunto al corpo HTML quando mostri il modal e rimosso quando lo nascondi. - @flup

Ho trovato una soluzione usando jquery, quindi nel caso in cui qualcun altro abbia lo stesso problema e i suggerimenti di cui sopra non funzionano -

<script>
            jQuery(document).ready(function () {
jQuery('.closeit').click(function () {
 jQuery('body').removeClass('modal-open');
                });
            });
        </script>

Ho avuto un problema in cui stavo sovrascrivendo l'evento hide.bs.modal in modo da poter eseguire del codice personalizzato quando il modal era nascosto, ma quello che non mi rendevo conto è che ha impedito la rimozione della classe modal-open dal corpo - quindi la mia barra di scorrimento non è tornata alla chiusura di questo modale specifico. Non rimuovo manualmente la classe modal-open nel mio codice hide.bs.modal e risolve il problema.
Jim,

1
Dovresti solo aggiungere un data-dismiss="modal"attributo al tuo link invece di fare qualcosa di personalizzato come questo. Bootstrap eseguirà tutte le azioni di chiusura appropriate quando si fa clic su quel collegamento.
nollidge

1
data-dismiss = "modal" non funziona nel mio caso perché sto chiamando una funzione nel controller angolare. La soluzione jQuery suggerita funziona molto bene per me.
gianni

5

Stavo solo giocando con questa "funzionalità" dei modali Bootstrap. Sembra che la .modalclasse lo abbia fattooverflow-y:auto; Quindi il wrapper modale ottiene la sua barra di scorrimento quando il modale stesso diventa troppo alto.

Se vuoi sempre una barra di scorrimento (spesso i designer lo fanno) Per prima cosa imposta il corpo

body {
    overflow-y:scroll;
}

Quindi gestisci .modal-open

.modal-open .modal {
    overflow-y:scroll; /* Force a navbar on .modal */
}

.modal-open .topnavbar-wrapper {
    padding-right:17px; /* Noticed that right aligned navbar content got overlapped by the .modal scrollbar */
}

In questo caso, lasciare la barra di scorrimento disabilitata sul corpo intatta

Tutte le altre risposte in questa pagina continuavano a far saltare i miei contenuti.

Dritta!

Sebbene questa soluzione abbia sempre funzionato per me, ieri ho avuto un problema con questa correzione quando il modale è trascinabile e troppo grande per adattarsi allo schermo (verticalmente). Potrebbe avere qualcosa a che fare con gli position:stickyelementi che ho aggiunto?


Quando ho aggiunto body {overflow-y: scroll;}, il mio problema è stato risolto. Grazie Signore.
FrenkyB

1

Meglio se creerai il tuo file css per personalizzare una certa parte del tuo bootrap.

Non alterare il file css di bootstrap perché cambierà tutto nel tuo bootstrap una volta che lo usi in altre parti della tua pagina.

Se la tua pagina è piuttosto lunga, fornirà automaticamente una barra di scorrimento. E quando il modale viene aperto, nasconderà la barra di scorrimento perché è quello che fa il bootstrap come impostazione predefinita.

Per evitare di nasconderlo quando modal è aperto, è sufficiente sovrascriverlo inserendo il codice css (sotto) sul proprio file css.

.modal-open {
    overflow: scroll;
}

solo un viceversa ...

.modal-open {
    overflow: hidden;
}

3
Questo sembra contenere le stesse informazioni dell'altra risposta a questa domanda. Se la tua risposta è diversa, modificala per chiarire cosa è esattamente diverso. Per favore aggiungi una nuova risposta solo se hai qualcosa di nuovo.
Jeffrey Bosboom

1
Contiene la stessa risposta ma ha un altro modo per spiegarla. A volte, la comprensione dipende da come viene spiegato.
NormanCabilatazan

1
Non tutti i lettori potrebbero avere la stessa idea. Meglio dare un altro modo di spiegarlo per farli capire chiaramente.
NormanCabilatazan

1

Inoltre, se il popup modale deve scorrere con il contenuto all'interno e il genitore deve rimanere fermo, aggiungi quanto segue al tuo Custom.css (sovrascrivendo css)

.modal-body {
    max-height: calc(100vh - 210px);
    overflow-y: auto;
}
.modal-open {
    overflow: hidden;
    overflow-y: scroll;
    padding-right: 0 !important;
}

0

il bootstrap modal aggiunge un padding una volta aperto in modo da poter provare questo codice nel proprio css

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

0

Ciò è probabilmente dovuto al fatto che la prima classe modale (quando chiusa) rimuove la classe modal-open dall'elemento body e la seconda non la aggiunge di nuovo quando si attiva l'apertura modale.

In questo caso, userei event per verificare se modal è stato chiuso / nascosto completamente e aprirne un altro

let modal1 = $('.modal1);
let modal2 = $('.modal2);
$modal1.on('hidden.bs.modal', function (e) {
   $modal2.modal('show');
});

Questo attenderà fino alla chiusura del primo modale per assicurarsi che l'apertura modale venga rimossa dal corpo e aggiunta nuovamente all'apertura.


0

Ho avuto questo problema da solo e trovare questa domanda rapidamente mi ha aiutato a capire cosa stava causando il comportamento. Quindi grazie.

Tuttavia, trovo queste soluzioni alternative CSS un po 'ineleganti. A meno che, cioè, tu non voglia specificamente mantenere le barre di scorrimento (anche se non riesco a pensare a una ragione per questo).

Essenzialmente Bootstrap applica il riempimento destro a determinati elementi per compensare la rimozione della barra di scorrimento.

Pertanto, tutto ciò che devi fare è inserire un wrapper extra con zero padding intorno al tuo elemento problematico (e spostare la classe a cui è indirizzata su di esso).

cioè cambia da questo ...

<div class="fixed-top p-1 bg-dark">
    ...this content will move as padding will be modified...
</div>

... a questa...

<div class="fixed-top p-0 bg-dark">
    <div class="p-1">
        ...this content won't move...
    </div>
</div>
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.