Personalmente, position: fixed
desplácese hacia arriba automáticamente . Bastante molesto !
Para evitar penalizar a otros dispositivos y versiones , aplico esta solución solo a las versiones apropiadas de iOS.
** VERSIÓN 1 - Se corrigen todos los modales **
Para 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");
}
});
Para el CSS
body.iosBugFixCaret.modal-open { position: fixed; width: 100%; }
** VERSIÓN 2 - Solo modales seleccionados **
Modifiqué la función para que se active solo para modales seleccionados con una clase .inputModal
Solo los modales con entradas deben verse afectados para evitar el desplazamiento hacia la parte superior.
Para 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);
}
});
}
})();
});
Para el CSS
body.iosBugFixCaret.modal-open { position: fixed; width: 100%; }
Para el HTML,
agregue la clase inputModal al modal
<div class="modal fade inputModal" tabindex="-1" role="dialog">
...
</div>
Nota bene
La función javascript ahora se invoca automáticamente
** ACTUALIZAR iOS 11.3 - Error corregido 😃🎉 **
A partir de iOS 11.3, se corrigió el error. No es necesario realizar la prueba OS 11_
eniOS11 = /OS 11_0|OS 11_1|OS 11_2/.test(ua);
Pero tenga cuidado, ya que iOS 11.2 todavía se usa ampliamente (a partir de abril de 2018). Ver
estadística 1
estadística 2