Personnellement, position: fixed
faites défiler vers le haut automatiquement . Assez ennuyeux!
Pour éviter de pénaliser d'autres appareils et versions, j'applique ce correctif uniquement aux versions appropriées d'iOS.
** VERSION 1 - Tous les modaux corrigent **
Pour le 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");
}
});
Pour le CSS
body.iosBugFixCaret.modal-open { position: fixed; width: 100%; }
** VERSION 2 - Modaux sélectionnés uniquement **
J'ai modifié la fonction pour ne déclencher que pour les modaux sélectionnés avec une classe .inputModal
Seuls les modaux avec des entrées doivent être impactés pour éviter le défilement vers le haut.
Pour le 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);
}
});
}
})();
});
Pour le CSS
body.iosBugFixCaret.modal-open { position: fixed; width: 100%; }
Pour le HTML
Ajoutez la classe inputModal au modal
<div class="modal fade inputModal" tabindex="-1" role="dialog">
...
</div>
Nota bene
La fonction javascript est maintenant auto-appelante
** MISE À JOUR iOS 11.3 - Bug corrigé 😃🎉 **
Depuis iOS 11.3, le bogue a été corrigé. Il n'y a pas besoin de test OS 11_
dansiOS11 = /OS 11_0|OS 11_1|OS 11_2/.test(ua);
Mais soyez prudent car iOS 11.2 est toujours largement utilisé (en avril 2018). Voir
stat 1
stat 2