1. Come puoi posizionare il modale verticalmente al centro quando non conosci l'altezza esatta del modale?
Per centrare in modo assoluto Bootstrap 3 Modal senza dichiarare un'altezza, dovrai prima sovrascrivere il CSS Bootstrap aggiungendolo al foglio di stile:
.modal-dialog-center { /* Edited classname 10/03/2014 */
margin: 0;
position: absolute;
top: 50%;
left: 50%;
}
Ciò posizionerà l'angolo superiore sinistro della finestra di dialogo modale al centro della finestra.
Dobbiamo aggiungere questa media query oppure il margine modale a sinistra è errato su piccoli dispositivi:
@media (max-width: 767px) {
.modal-dialog-center { /* Edited classname 10/03/2014 */
width: 100%;
}
}
Ora dovremo adattare la sua posizione con JavaScript. Per fare ciò diamo all'elemento un margine superiore e sinistro negativo pari alla metà della sua altezza e larghezza. In questo esempio useremo jQuery poiché è disponibile con Bootstrap.
$('.modal').on('shown.bs.modal', function() {
$(this).find('.modal-dialog').css({
'margin-top': function () {
return -($(this).outerHeight() / 2);
},
'margin-left': function () {
return -($(this).outerWidth() / 2);
}
});
});
Aggiornamento (01/10/2015):
Aggiungendo la risposta di Finik . Crediti a Centering in the Unknown .
.modal {
text-align: center;
padding: 0!important;
}
.modal:before {
content: '';
display: inline-block;
height: 100%;
vertical-align: middle;
margin-right: -4px; /* Adjusts for spacing */
}
.modal-dialog {
display: inline-block;
text-align: left;
vertical-align: middle;
}
Notare il margine negativo giusto? Ciò rimuove lo spazio aggiunto dal blocco inline. Questo spazio fa sì che il modale salti in fondo alla pagina @media larghezza <768px.
2. È possibile avere il modale centrato e avere un overflow: auto nel corpo modale, ma solo se il modale supera l'altezza dello schermo?
Questo è possibile dando al modale un overflow-y: auto e un'altezza massima. Questo richiede un po 'più di lavoro per farlo funzionare correttamente. Inizia aggiungendo questo al tuo foglio di stile:
.modal-body {
overflow-y: auto;
}
.modal-footer {
margin-top: 0;
}
Useremo di nuovo jQuery per ottenere l'altezza della finestra e impostare prima l'altezza massima del contenuto modale. Quindi dobbiamo impostare l'altezza massima del corpo modale, sottraendo il contenuto modale con l'intestazione modale e il footer modale:
$('.modal').on('shown.bs.modal', function() {
var contentHeight = $(window).height() - 60;
var headerHeight = $(this).find('.modal-header').outerHeight() || 2;
var footerHeight = $(this).find('.modal-footer').outerHeight() || 2;
$(this).find('.modal-content').css({
'max-height': function () {
return contentHeight;
}
});
$(this).find('.modal-body').css({
'max-height': function () {
return (contentHeight - (headerHeight + footerHeight));
}
});
$(this).find('.modal-dialog').css({
'margin-top': function () {
return -($(this).outerHeight() / 2);
},
'margin-left': function () {
return -($(this).outerWidth() / 2);
}
});
});
Puoi trovare una demo funzionante qui con Bootstrap 3.0.3: http://cdpn.io/GwvrJ
EDIT: consiglio invece di utilizzare la versione aggiornata per una soluzione più reattiva: http://cdpn.io/mKfCc
Aggiornamento (30/11/2015):
function setModalMaxHeight(element) {
this.$element = $(element);
this.$content = this.$element.find('.modal-content');
var borderWidth = this.$content.outerHeight() - this.$content.innerHeight();
var dialogMargin = $(window).width() < 768 ? 20 : 60;
var contentHeight = $(window).height() - (dialogMargin + borderWidth);
var headerHeight = this.$element.find('.modal-header').outerHeight() || 0;
var footerHeight = this.$element.find('.modal-footer').outerHeight() || 0;
var maxHeight = contentHeight - (headerHeight + footerHeight);
this.$content.css({
'overflow': 'hidden'
});
this.$element
.find('.modal-body').css({
'max-height': maxHeight,
'overflow-y': 'auto'
});
}
$('.modal').on('show.bs.modal', function() {
$(this).show();
setModalMaxHeight(this);
});
$(window).resize(function() {
if ($('.modal.in').length != 0) {
setModalMaxHeight($('.modal.in'));
}
});
(Aggiornato il 30/11/2015 http://cdpn.io/mKfCc con la modifica sopra)