85 votes

iOS 11 Safari bootstrap zone de texte modale en dehors du curseur

Avec safari iOS 11, le curseur de la boîte de texte de saisie est en dehors de la boîte de texte de saisie. Nous n'avons pas compris pourquoi il y a ce problème. Comme vous pouvez le voir, ma zone de texte focalisée est une zone de saisie de texte d'email mais mon curseur est en dehors de cette zone. Ceci n'arrive qu'avec iOS 11 Safari

Problem

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

70voto

J'ai résolu le problème en ajoutant position:fixed dans le corps du texte lors de l'ouverture d'une fenêtre modale. J'espère que cela vous aidera.

6 votes

Note selon les réponses ci-dessous - Bootstrap ajoute .modal-open au corps lorsque la fenêtre modale est ouverte, vous pouvez donc simplement ajouter position : fixed à cette classe.

1 votes

Il se peut que vous deviez également ajouter width:100% pour limiter la largeur du corps à celle de l'appareil. Dans certains cas, en fonction du balisage existant, cela peut poser problème. J'aime aussi la solution proposée par @gentleboy (ci-dessous) afin de ne pas pénaliser les navigateurs qui n'ont pas ce problème, car lorsque la largeur du corps est fixe, le corps défile vers le haut, ce qui est quelque peu ennuyeux.

0 votes

Bizarrement, j'ai eu ce problème avec une application construite avec meteor-cordova. Il semble que tous les appareils iOS fonctionnant avec la version 11+ aient eu ce problème. Dans mon cas, j'avais déjà position:fixed dans le corps de l'application. Au lieu de cela, je l'ai remplacé par position:absolute sur le html et cela a résolu mon problème. Merci Jen !

42voto

micaball Points 839

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

0 votes

J'aime bien, mais vous pourriez aussi ajouter width:100%, qui contraindra le corps à 100% de la largeur de l'appareil. En fonction du balisage existant, cela peut poser problème.

2 votes

Un bon conseil. Je n'ai pas ce problème, mais je pense que cela pourrait être une réponse globale. Je l'ajouterai quand j'aurai fini mes bières.

0 votes

J'ai rencontré le même problème aujourd'hui, mais vous m'avez sauvé la mise.

15voto

Eric Shawn Points 151

Ce problème va au-delà de Bootstrap et de Safari. Il s'agit d'un bug d'affichage complet dans iOS 11 qui se produit dans tous les navigateurs. Le correctif ci-dessus ne résout pas ce problème dans tous les cas.

Le bogue est signalé en détail ici :

https://medium.com/@eirik.luka/how-to-fix-the-ios-11-input-element-in-fixed-modals-bug-aaf66c7ba3f8

Il semblerait qu'ils aient déjà signalé ce problème à Apple en tant que bogue.

0 votes

Cela semble être le problème pour moi, qui fonctionnait très bien avant la mise à jour vers IOS 11. Les utilisateurs d'Android n'ont pas ce problème.

11voto

Bug frustrant, merci de l'avoir identifié. Sinon, je serais en train de me taper l'iphone ou la tête contre le mur.

La solution la plus simple est la suivante (1 ligne de code modifiée) :

Il suffit d'ajouter la feuille de style CSS suivante au fichier html ou à un fichier CSS externe.

<style type="text/css">
.modal-open { position: fixed; }
</style>

Voici un exemple complet de fonctionnement :

.modal-open { position: fixed; }

<link href="https://getbootstrap.com/docs/3.3/dist/css/bootstrap.min.css" rel="stylesheet">

<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" data-whatever="@mdo">Open modal for @mdo</button>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" data-whatever="@fat">Open modal for @fat</button>
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" data-whatever="@getbootstrap">Open modal for @getbootstrap</button>
...more buttons...

<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title" id="exampleModalLabel">New message</h4>
      </div>
      <div class="modal-body">
        <form>
          <div class="form-group">
            <label for="recipient-name" class="control-label">Recipient:</label>
            <input type="text" class="form-control" id="recipient-name">
          </div>
          <div class="form-group">
            <label for="message-text" class="control-label">Message:</label>
            <textarea class="form-control" id="message-text"></textarea>
          </div>
        </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Send message</button>
      </div>
    </div>
  </div>
</div>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="https://getbootstrap.com/docs/3.3/dist/js/bootstrap.min.js"></script>

J'ai soumis un problème ici : https://github.com/twbs/bootstrap/issues/24059

0 votes

Ceci devrait être la réponse. Bootstrap ajoute la classe modal-open au corps de la page lorsqu'une fenêtre modale est visible. Il vous suffit de cibler cette classe.

1 votes

Je suis confronté à ce problème depuis un certain temps. Cette solution est inadéquate pour moi car l'ajout d'une position fixe fait défiler la page jusqu'en haut. Ainsi, lorsque l'utilisateur ferme la fenêtre modale, il se retrouve à une position de défilement différente. Cela conduit à une expérience utilisateur terrible

0 votes

Cette correction a fonctionné pour moi en utilisant Chrome sur mobile. J'étais confus au début car .modal-open n'apparaît pas dans le html modal, mais je l'ai quand même ajouté en CSS dans mon header et ça a fonctionné.

4voto

lfkwtz Points 375

Solution la plus simple et la plus propre :

body.modal-open { position: fixed; width: 100%; }

1 votes

C'est la solution la plus simple, et elle fonctionne, mais le seul problème est que le curseur disparaît complètement. Ce n'est pas aussi grave que la situation initiale, mais il y a un problème d'utilisation.

0 votes

Bizarre, je n'ai pas connu de disparition de curseur.

1 votes

J'ai également été confronté à la disparition du curseur, quelles sont les raisons de ce phénomène ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X