Personnellement, position: fixed
défilement automatique vers le haut . C'est assez ennuyeux !
Pour ne pas pénaliser les autres appareils et versions Je n'applique ce correctif qu'aux versions appropriées d'iOS.
**VERSION 1 - Correction de tous les modaux**
Pour le javascript/jQuery
$(document).ready(function() {
// Detect ios 11_x_x affected
// NEED TO BE UPDATED if new versions are affected
var ua = navigator.userAgent,
iOS = /iPad|iPhone|iPod/.test(ua),
iOS11 = /OS 11_0|OS 11_1|OS 11_2/.test(ua);
// ios 11 bug caret position
if ( iOS && iOS11 ) {
// Add CSS class to body
$("body").addClass("iosBugFixCaret");
}
});
Pour le CSS
/* Apply CSS to iOS affected versions only */
body.iosBugFixCaret.modal-open { position: fixed; width: 100%; }
**VERSION 2 - Modaux sélectionnés uniquement**
J'ai modifié la fonction pour qu'elle ne se déclenche que pour les modales sélectionnées avec une classe .inputModal
Seules les fenêtres modales avec des entrées devraient être touchées pour éviter le défilement vers le haut.
Pour le javascript/jQuery
$(document).ready(function() {
// Detect ios 11_x_x affected
// NEED TO BE UPDATED if new versions are affected
(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);
// ios 11 bug caret position
if ( iOS && iOS11 ) {
$(document.body).on('show.bs.modal', function(e) {
if ( $(e.target).hasClass('inputModal') ) {
// Get scroll position before moving top
scrollTopPosition = $(document).scrollTop();
// Add CSS to body "position: fixed"
$("body").addClass("iosBugFixCaret");
}
});
$(document.body).on('hide.bs.modal', function(e) {
if ( $(e.target).hasClass('inputModal') ) {
// Remove CSS to body "position: fixed"
$("body").removeClass("iosBugFixCaret");
//Go back to initial position in document
$(document).scrollTop(scrollTopPosition);
}
});
}
})();
});
Pour le CSS
/* Apply CSS to iOS affected versions only */
body.iosBugFixCaret.modal-open { position: fixed; width: 100%; }
Pour le HTML Ajouter la classe inputModal à la modale
<div class="modal fade inputModal" tabindex="-1" role="dialog">
...
</div>
Nota bene La fonction javascript est maintenant auto-invocante
**MISE A JOUR iOS 11.3 - Bug corrigé **
Depuis iOS 11.3, le bug a été corrigé. Il n'est pas nécessaire de tester la présence de OS 11_
en iOS11 = /OS 11_0|OS 11_1|OS 11_2/.test(ua);
Mais attention car iOS 11.2 est encore largement utilisé (en avril 2018). Voir
stat 1
stat 2
1 votes
Il s'agit d'un bogue avec Safari. Apple l'a corrigé en interne, mais la correction ne figure pas encore dans une version publique (ou même bêta) d'iOS. bugs.webkit.org/show_bug.cgi?id=176896