50 votes

IOS 7 - css - html height - 100% = 692px

J'ai un bug bizarre sur l'iPad iOS7 en mode paysage.

Ce que j'ai pu vérifier, c'est que dans iOS7, window.outerHeight est 692px et que window.innerHeight 672px ; alors que dans les versions précédentes les deux valeurs sont 672px.

Même si mon <html> y <body> les balises ont une hauteur de 100 %, il semble y avoir de l'espace pour le défilement, et ce qui est bizarre, c'est que ce problème ne se pose que sur les paysages.

Vous pouvez voir ce dont je parle en visitant t.cincodias.com, par exemple, dans un iPad iOS 7 la barre de bas de page (ou l'en-tête parfois) sera coupée. Mais sur les versions précédentes d'iOS, le contenu s'affiche bien en plein écran.

Même lorsque je règle la hauteur des deux balises sur height: 672px !important y position:absolute; bottom: 0; Vous pouvez toujours faire défiler le contenu verticalement en touchant une iframe (les publicités sont des iframes).

J'utilise la version Release Candidate d'iOS7.

Merci pour toute aide.

16voto

czuendorf Points 735

J'ai utilisé cette solution JavaScript pour résoudre ce problème :

if (
    navigator.userAgent.match(/iPad;.*CPU.*OS 7_\d/i) && 
    window.innerHeight != document.documentElement.clientHeight
) {
    var fixViewportHeight = function() {
        document.documentElement.style.height = window.innerHeight + "px";
        if (document.body.scrollTop !== 0) {
            window.scrollTo(0, 0);
        }
    };

    window.addEventListener("scroll", fixViewportHeight, false);
    window.addEventListener("orientationchange", fixViewportHeight, false);
    fixViewportHeight();

    document.body.style.webkitTransform = "translate3d(0,0,0)";
}

15voto

ururk Points 158

Je pense que c'est un bug dans iOS 7 - si vous le faites pivoter en mode portrait, il définit les deux (innerHeight/outerHeight) à la même valeur. Si ce n'est pas un bug, alors le mode portrait en a un car le comportement n'est pas cohérent.

Vous pourriez détecter iOS 7/mobile Safari et utiliser window.innerHeight si iOS 7.

7voto

agfa555 Points 119

Je vais combiner les réponses. Merci à tous !

Vous pouvez faire quelque chose comme ça :

if (navigator.userAgent.match(/iPad;.*CPU.*OS 7_\d/i)) {
    $('#yourDivID').height(window.innerHeight);
    window.scrollTo(0, 0);
}

La fonction window.scrollTo résout le problème du chevauchement de la barre en paysage lors de la rotation.

A la vôtre !

1voto

Eric Chen Points 210

Je reproduis le même problème dans iOS 8.

Voici ma solution.

J'ai écouté redimensionner , défilement , changement d'orientation pour s'assurer que lorsque l'utilisateur déclenche le changement de taille de l'écran, la fonction de réinitialisation de la hauteur sera appelée.

J'ai écrit un rebondissement pour éviter les appels multiples.

Et c'est dans un fermeture y pas de dépendance (sans jQuery).

(function(){
  var setViewportHeight = (function(){
    function debounced(){
      document.documentElement.style.height = window.innerHeight + "px";
      if (document.body.scrollTop !== 0) {
          window.scrollTo(0, 0);
      }
    }
    var cancelable = null;

    return function(){
      cancelable && clearTimeout(cancelable);
      cancelable = setTimeout(debounced, 100);
    };
  })();

  //ipad safari
  if(/iPad/.test(navigator.platform) && /Safari/i.test(navigator.userAgent)){  
    window.addEventListener("resize", setViewportHeight, false);
    window.addEventListener("scroll", setViewportHeight, false);
    window.addEventListener("orientationchange", setViewportHeight, false);
    setViewportHeight();
  }
})();

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