Safari iPad défilement provoque éléments HTML de disparaître et de réapparaître avec un retard
Je suis en train de développer une application web en utilisant html5 et jQuery pour iPad Safari. Je suis en cours d'exécution dans un problème où les grandes zones de défilement cause les éléments qui sont hors de l'écran apparaît après un délai lorsque je scroll vers le bas.
Ce que je veux dire par là, si j'ai une ligne d'images (ou même un div avec un dégradé) qui est à l'écran, quand je scroll vers le bas (ou le haut), le comportement attendu est celle de l'élément à apparaître à l'écran comme je suis de défilement pour elle.
Cependant, ce que je constate, c'est que l'élément ne semble pas jusqu'à ce que je lève mon doigt de l'écran et la molette termine toutes ses animations.
Ce qui provoque un super problème visible pour moi, faire toute chose regarder agitée, bien qu'il ne l'est pas. J'imagine que l'iPad Safari est en train de faire quelque chose pour économiser de la mémoire. Est-il de toute façon dans laquelle je ne peux empêcher cette hachée-ness de passe. En outre, j'apprécierais aussi si quelqu'un peut jeter de la lumière sur ce que l'iPad Safari est en train d'essayer de faire.
- Ce problème/solution m'a aidé à résoudre un problème avec la jPanelMenu 1.3 CSS Transforme version, qui s'est avéré tout sur mon site invisibie jusqu'à ce que j'ai ajouté de l'extrait ci-dessus.
- À l'aide de *:non(html) s'appliqueront de la translate3d à tous les autres aspects de votre site et je ne le recommande pas. Il va provoquer des images dans les onglets à disparaître comme vous le faites défiler vers le bas, etc, les bugs que vous pourriez utiliser à voir sur vos images 3d sera désormais présent dans d'autres aspects de votre site.
- J'ai eu un peu de
<svg>
éléments qui ont été en présentant similaire retard de dessin/rendu. Malheureusement,*:not(html) { ... }
conduit à toutes sortes de comportements bizarres, comme @JonathanTonge souligné peut se produire. Toutefois, en sélectionnant uniquement les<svg>
éléments et en utilisanttranslate3d(0, 0, 0,);
semble avoir résolu mon défilement des questions. - Sauf pour des cas d'utilisation spécifiques, c'est poubelle. Vraiment bousille les dispositions qui dépendent de la position absolue des éléments.
- S'il vous plaît poster des réponses que de réponses, pas de “MODIFIER”dans votre question. Je sais que vous aimez votre réponse meilleures, et c'est très bien, mais StackOverflow a un Q&Un format qui fonctionne le mieux lorsque les Q sont distincts l'Un de l'.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de tromper le navigateur pour utiliser l'accélération matérielle de manière plus efficace. Vous pouvez faire cela avec un vide de transformation 3d:
En particulier, vous aurez besoin de l'enfant, les éléments qui ont un
position:relative;
déclaration (ou, il suffit d'aller tous dehors et de le faire pour tous les éléments enfants).Pas une garantie de correction, mais assez réussi la plupart du temps.
Chapeau astuce: https://web.archive.org/web/20131005175118/http://cantina.co/2012/03/06/ios-5-native-scrolling-grins-and-gothcas/
.elem-affected{ -webkit-transform: translate3d(0, 0, 0);}
je n'ai pas besoin de l' :non(html) bits, vous ne savez pas si il est logique lors de l'application spécifique, par exemple. html de classe de toute façon.C'est la réponse complète à ma question. J'avais initialement marqué @Colin Williams réponse la bonne réponse, comme il m'a aidé à obtenir à la solution complète. Un membre de la communauté, @Slipp D. Thompson édité ma question, après environ 2,5 ans de m'avoir demandé, et m'a dit que j'abuse de SORTE Q & Un format. Il m'a aussi dit à la poste comme la réponse. Alors, voici la réponse qui a résolu mon problème:
@Colin Williams, merci!
Votre réponse et l'article que vous avez lié à m'a donné une avance d'essayer quelque chose avec les CSS.
Donc, j'ai été en utilisant translate3d avant. Il produit des résultats indésirables. Fondamentalement, il serait de couper et de ne PAS RENDRE les éléments qui ont été hors de l'écran, jusqu'à ce que j'ai interagi avec eux. Donc, en gros, en orientation paysage, la moitié de mon site qui était à l'écran n'a pas été montré. C'est un iPad web app, grâce à laquelle j'ai été dans un correctif.
L'application de translate3d à la position relative des éléments résolu le problème pour ces éléments, mais d'autres éléments arrêté rendu, une fois hors de l'écran. Les éléments que je ne pouvais pas interagir avec (œuvres d'art) ne serait jamais rendre de nouveau, sauf si j'ai rechargé la page.
La solution complète:
Maintenant, bien que cela pourrait ne pas être la meilleure solution, c'était le seul qui fonctionne. Le navigateur Safari Mobile ne rend pas les éléments qui sont hors de l'écran, ou rend parfois erratique, lors de l'utilisation de
-webkit-overflow-scrolling: touch
. À moins d'un translate3d est appliqué à tous les autres éléments qui pourraient aller à l'écran grâce à ce livre, ces éléments seront coupés après le défilement.Alors, encore merci, et espérons que cela aide certains autres, la perte de l'âme. Cela a certainement aidé moi beaucoup de temps!
*:not(html)
àbody *
-webkit-transform: translate3d(0, 0, 0);
pour le problème de l'élément a fonctionné pour moi. Dans mon cas, j'ai été en utilisant ScrollMagic$(window).width()
au lieu dewindow.innerWidth
en jQuery fait toute la différence pour iOS. Qui sait.Ciblant tous les éléments, mais en html :
*:not(html)
causé des problèmes sur d'autres éléments dans mon cas. Il a modifié le contexte d'empilement, provoquant un z-index à briser.
Nous devrions mieux essayer de cibler le bon élément et appliquer
-webkit-transform: translate3d(0,0,0)
à elle seule.Edit : parfois, le
translate3D(0,0,0)
ne fonctionne pas, on peut utiliser la méthode suivante, le ciblage de la droite de l'élément :body *
sélecteur au lieu de*:not(html)
. Il vous permettra de résoudre la question.Lorsque le translate3d ne fonctionne pas, essayez d'ajouter de la perspective. Il travaille toujours pour moi
http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-css
-webkit-perspective: 1000;
-webkit-perspective: 1000;
l'ai fait pour moi - merciAjoutant
-webkit-transform: translate3d(0,0,0)
à un élément statique ne fonctionne pas pour moi.J'applique cette propriété de manière dynamique. Par exemple, lorsque la page défile à l'écran, j'ai mis
-webkit-transform: translate3d(0,0,0)
sur un élément. Puis, après un court délai, je réinitialiser cette propriété, qui est,-webkit-transform: none
Cette approche semble fonctionner.
Merci, @Colin Williams pour me pointer dans la bonne direction.
J'ai eu le même problème avec iscroll 4.2.5 sur ios7. L'ensemble de défilement de l'élément de disparaître.
J'ai essayé d'ajouter
translate3d(0,0,0)
comme il a été suggéré ici, avoir résolu le problème, mais il a désactivé le iscroll "snap" effet.La solution est venue de donner
"position:relative; z-index:1000;display:block"
propriétés css pour l'ensemble du conteneur qui contient le défilement de l'élément et il n'est pas nécessaire de donner translate3d à l'enfant-éléments.<body>
élément est ce que j'ai utilisé pour le défilement et une version simplifiée de travail:body { position: relative; z-index: 0; }
Je suis sacrément sûr que je viens de résoudre ce avec:
(Probablement juste
overflow: auto;
serait trop de travail en fonction de vos besoins.)Il y a des cas où un rotation est appliqué et/ou un Z index est utilisé.
Rotation: Un existant déclaration de
-webkit-transform
pour faire pivoter un élément peut-être pas assez pour lutter contre l'apparition de problème (comme-webkit-transform: rotate(-45deg)
). Dans ce cas, vous pouvez utiliser-webkit-transform: translateZ(0px) rotateZ(-45deg)
comme un truc (l'esprit de la rotationZ).Z index: en collaboration avec la rotation vous pouvez définir un positif
z-index
propriété, commez-index: 42
. Les étapes ci-dessus décrites à la rubrique "Rotation" ont été dans mon cas assez pour résoudre le problème, même avec le videtranslateZ(0px)
. Je soupçonne cependant que les Z-index dans ce cas peut avoir causé qui disparaissent et réapparaissent en premier lieu. En tout cas, lez-index: 42
propriété doit être maintenu ---webkit-transform: translateZ(42px)
seul n'est pas suffisant.C'est un problème très commun rencontrés par les développeurs et qui est due principalement aux
Safari's
propriété de ne pas recréer des éléments définis commeposition : fixed
.Donc soit changer la position de la propriété ou certains hack doit être appliquée comme mentionné dans d'autres réponses.
Link1
Link2
Dans mon cas (un iOS app Phonegap), l'application de translate3d relative des éléments d'enfant n'a pas résolu le problème. Mon élément déroulant n'est pas la hauteur car il était absolument positionné et j'ai été de définir le haut et le bas. Qu'est-ce résolu pour moi a été l'ajout d'un min-height (de 100px).
J'ai eu le même problème en utilisant une ancienne version de Fancybox.
La mise à niveau vers v3 permettra de résoudre votre problème OU vous pouvez simplement ajouter: