Personalmente, position: fixed
scorri automaticamente verso l'alto . Piuttosto fastidioso!
Per evitare di penalizzare altri dispositivi e versioni, applico questa correzione solo alle versioni appropriate di iOS.
** VERSIONE 1 - Tutti i modali risolti **
Per javascript / jQuery
$(document).ready(function() {
var ua = navigator.userAgent,
iOS = /iPad|iPhone|iPod/.test(ua),
iOS11 = /OS 11_0|OS 11_1|OS 11_2/.test(ua);
if ( iOS && iOS11 ) {
$("body").addClass("iosBugFixCaret");
}
});
Per il CSS
body.iosBugFixCaret.modal-open { position: fixed; width: 100%; }
** VERSIONE 2 - Solo modali selezionati **
Ho modificato la funzione per sparare solo per modali selezionati con una classe .inputModal
Solo i modali con input dovrebbero essere influenzati per evitare lo scorrimento verso l'alto.
Per javascript / jQuery
$(document).ready(function() {
(function iOS_CaretBug() {
var ua = navigator.userAgent,
scrollTopPosition,
iOS = /iPad|iPhone|iPod/.test(ua),
iOS11 = /OS 11_0|OS 11_1|OS 11_2/.test(ua);
if ( iOS && iOS11 ) {
$(document.body).on('show.bs.modal', function(e) {
if ( $(e.target).hasClass('inputModal') ) {
scrollTopPosition = $(document).scrollTop();
$("body").addClass("iosBugFixCaret");
}
});
$(document.body).on('hide.bs.modal', function(e) {
if ( $(e.target).hasClass('inputModal') ) {
$("body").removeClass("iosBugFixCaret");
$(document).scrollTop(scrollTopPosition);
}
});
}
})();
});
Per il CSS
body.iosBugFixCaret.modal-open { position: fixed; width: 100%; }
Per l'HTML
aggiungere la classe inputModal al modal
<div class="modal fade inputModal" tabindex="-1" role="dialog">
...
</div>
Nota bene
La funzione javascript ora si richiama automaticamente
** AGGIORNA iOS 11.3 - Bug corretto 😃🎉 **
A partire da iOS 11.3, il bug è stato corretto. Non è necessario eseguire il test OS 11_
iniOS11 = /OS 11_0|OS 11_1|OS 11_2/.test(ua);
Ma fai attenzione perché iOS 11.2 è ancora ampiamente utilizzato (ad aprile 2018). Vedere
stat 1
stat 2