Pessoalmente, position: fixed
role para cima automaticamente . Um tanto irritante !
Para evitar penalizar outros dispositivos e versões , aplico esta correção apenas às versões apropriadas do iOS.
** VERSÃO 1 - Correção em todos os modais **
Para o 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 o CSS
body.iosBugFixCaret.modal-open { position: fixed; width: 100%; }
** VERSÃO 2 - Apenas modais selecionados **
Modifiquei a função para disparar apenas para modais selecionados com uma classe .inputModal
Apenas os modais com entradas devem ser impactados para evitar a rolagem para o topo.
Para o 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 o CSS
body.iosBugFixCaret.modal-open { position: fixed; width: 100%; }
Para o HTML
Adicione a classe inputModal ao modal
<div class="modal fade inputModal" tabindex="-1" role="dialog">
...
</div>
Nota bene
A função javascript agora é auto-invocada
** ATUALIZAR iOS 11.3 - Bug corrigido 😃🎉 **
No iOS 11.3, o bug foi corrigido. Não há necessidade de testar OS 11_
emiOS11 = /OS 11_0|OS 11_1|OS 11_2/.test(ua);
Mas tenha cuidado pois o iOS 11.2 ainda é amplamente usado (em abril de 2018). Vejo
stat 1
stat 2