Webkit animation est de quitter l'ordure pixels derrière l'écran

Le code suivant met une boîte blanche sur l'écran. Si vous exécutez ce code sur un iPad (vous pouvez ajuster les pixels de l'exécuter sur un iPhone, un de trop), lorsque vous touchez la boîte, il va filer hors de l'écran, et laissez une trace de blanc-ish pixels le long de son bord inférieur.

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-height, user-scalable=no, maximum-scale=1, minimum-scale=1" />
    <title>Line Bug Demo</title>
    <style>
body {
  background: black;
}
.panel {
  background: white;
  position: absolute;
  z-index: 2;
  width: 1000px;
  height: 500px;
  top: 34px;
  left: 12px;
  -webkit-border-radius: 20px;
  -webkit-transition: left 0.333s ease-in-out;
}
.panel.hide {
  left: -1000px;
}
    </style>
  </head>
  <body>
    <div class="panel" onclick="this.setAttribute('class', 'panel hide')"></div>
  </body>
</html>

La clé pour obtenir le bug est à l'aide d'un rayon des frontières, et de faire de l'animation. Si vous venez de sauter hors de l'écran, pas de sentier. Si il n'y a pas de frontière rayon, pas de sentier.

Voici les solutions de rechange que j'ai trouvé jusqu'à présent:

.panel.hide { -webkit-border-radius: 0; }

Laid, et pas vraiment pratique pour ma demande, parce que je suis d'animer le panneau à la fois dans et à l'extérieur, et je veux vraiment les coins arrondis quand il est sur l'écran.

L'autre:

.panel { -webkit-transform: translateZ(0); }

Qui met le panneau dans le matériel de pipeline, ce qui ne le compositing correctement. Bien que cela fonctionne avec cette simple démonstration, en utilisant le matériel de pipeline dans mon application web causes de mémoire des erreurs. (De la drastiques, énorme, immédiate de la variété.)

Toutes les autres idées de comment je pourrais me débarrasser de ce sentier?

  • Avez-vous essayé -webkit-backface-visibility: hidden;?
  • C'est équivalent à l'utilisation de translateZ(0). Il met les images dans le matériel de pipeline, ce qui résout le problème, mais les causes de mémoire dans mon application.
  • Probablement un ios bug. Avez-vous essayé d'animation avec jquery?
  • Bien sûr c'est un bug. Il n'a pas d'importance comment vous faire de l'animation.
  • C'est peut-être un bug bizarre avec l'interprétation de la CSS. Essayez de changer l' ".panneau {" dans votre CSS ".panneau .panel_hide {" puis changer ".le panneau.masquer {" à ".panel_hide {". Je suis curieux de voir si il fait une actualisation complète de la classe css "panneau de configuration" lorsque vous effectuez "ce.setAttribute ("class", panneau "cacher")". Peut-être le modifier: "cette.className = 'panel_hide';". Laissez-moi savoir comment cela fonctionne! (Je n'ai pas un appareil iOS T_T)
  • Non, ce n'est pas un problème de CSS. C'est un simple bug dans le moteur de composition. Dans certains cas, ils oublient de redessiner les pixels du contour quand les choses sont à animer. Depuis que j'ai posté cette question l'année dernière, j'ai vu plusieurs cas comme celui-ci. À la fois sous iOS et au bureau de Safari. Quelqu'un chez Apple a besoin de savoir à propos de fencepost conditions, ils sont en train de redessiner pixels <w <h au lieu de <=w, <=h.
  • Applw les gens vont pointer vers le gars à webkit en disant que c'est leur problème. Inutile de beaucoup.
  • Peu probable. Webkit n'est pas responsable pour le rendu, c'est de la responsabilité du navigateur qui utilise webkit. paulirish.com/2013/webkit-for-developers
  • Ne de les traduire(0) vous donnent la même erreur que translateZ(0)? Voici un exemple: jsfiddle.net/NSUA7
  • Je ne serais pas en mesure de dire à partir d'un violon, car le problème avec l'aide de traduire, c'est qu'il cause l'application réelle de mettre beaucoup trop de choses dans le matériel de tuyau, ce qui provoque une erreur de mémoire insuffisante. La question est donc, si l'animation d'un webkit transformer au lieu de l'animation de "gauche", serait la cause de tous ces trucs pour aller dans le pipeline, et que ce serait résoudre le problème. Je vais revenir à vous sur ce que...
  • Deuxième fois, ils demandent à ce. C'est un iOS bug. Pas de doute et pas de réponse.
  • C'est le genre d'une vieille question, mais ma réponse ici qui explique pourquoi. En bref, le Quartz, l'anti-aliasing peint une faible ligne de pixels semi-transparents qui se situent en dehors de la calcul de la hauteur et la largeur de l'élément, donc ils ne sont jamais effacés à repeindre et de construire chaque image d'animation. Je peux vous proposer une solution simple qui ne repose pas sur l'accélération matérielle, si vous voulez?
  • Oui, s'il vous plaît partager le simple non-GL fixer!
  • Super! Mon idée, tout simplement, est de forcer WebKit pour repeindre les pixels supplémentaires en augmentant le calcul des dimensions de la boîte par un pixel dans tous les sens. Malheureusement je n'ai pas un ancien appareil iOS pour tester, si ça ne vous dérange pas d'essayer quelques suggestions pour moi? Première suggestion: ajouter box-shadow: 0 0 1px rgba(0,0,0,.05); à la .panel jeu de règles. L'impact visuel doit être minime, mais il va forcer une rangée de pixels être peints sur chaque bord. (Si cela ne fonctionne pas, essayez d'augmenter l'alpha d'une touche.)
  • Autres notes: box-shadow ne force pas l'accélération matérielle, et tandis qu'elle peut avoir des implications sur les performances, il est généralement le seul à poser avec un plus grand rayon de flou.
  • Qui fonctionne. Si vous répétez votre commentaire en réponse, je vais vous donner la case verte!
  • Génial, merci @jesmith. Content que ça a fonctionné! 🙂

InformationsquelleAutor Joshua Smith | 2012-04-02