102 votes

css z-index perdu après webkit transform translate3d

J'ai deux éléments div positionnés de manière absolue qui se chevauchent. Tous deux ont des valeurs de z-index définies par css. J'utilise l'option translate3d webkit transform pour animer ces éléments hors de l'écran, puis de nouveau sur l'écran. Après la transformation, les éléments ne respectent plus leurs paramètres. z-index valeurs.

Quelqu'un peut-il expliquer ce qu'il advient de l'indice z et de l'ordre des éléments div lorsque j'effectue une transformation webkit sur ceux-ci ? Et ce que je peux faire pour conserver l'ordre de superposition des éléments div ?

Voici quelques informations supplémentaires sur la manière dont je procède à la transformation.

Avant la transformation, chaque élément reçoit ces deux valeurs de transition webkit définies via css (j'utilise jQuery pour faire le .css() appels de fonction :

element.css({ '-webkit-transition-duration': duration + 's' });
element.css({ '-webkit-transition-property': '-webkit-transform' });

L'élément est ensuite animé à l'aide de la transformation translate3d -webkit-transform :

element.css({ '-webkit-transform': 'translate3d(' + hwDelta + 'px, 0, -1px)' });

Entre-temps, j'ai essayé de régler le troisième paramètre de l'option translate3d à plusieurs valeurs différentes pour essayer de reproduire l'ordre des piles dans l'espace 3D, mais sans succès.

De plus, les navigateurs iPhone/iPad et Android sont les navigateurs cibles sur lesquels ce code doit fonctionner. Les deux supportent les transitions webkit.

0 votes

Pouvez-vous poster un lien pour voir l'exemple ?

1 votes

J'ai rencontré le même problème. J'ai une balise <iframe> avec un élément intérieur de style "-webkit-transform : translate3d(0,0,0)" pour forcer l'accélération 3D. Il s'avère que le cadre extérieur avec un z-index plus élevé est toujours caché par l'élément iframe intérieur. Comme le visuel est caché, je peux "cliquer" sur l'élément extérieur invisible. Cela ne se produit que dans Mobile Safari.

0 votes

J'ai passé 10 heures à comprendre que c'était ce qui faisait que mon code ne fonctionnait pas. Ugh

57voto

samy-delux Points 1742

Cela pourrait être lié à : https://bugs.webkit.org/show_bug.cgi?id=61824

En fait, lorsque vous appliquez une transformation 3D sur l'axe z, l'indice z ne peut plus être pris en compte (vous êtes maintenant dans un plan de rendu tridimensionnel, utilisez des valeurs z différentes). Si vous voulez revenir à un rendu 2D pour les éléments enfants, utilisez transform-style: flat; .

14 votes

En fait, lorsque vous appliquez une transformation 3D sur l'axe des z, l'indice z ne peut plus être pris en compte (vous êtes maintenant dans un plan de rendu tridimensionnel, utilisez des valeurs de z différentes). Si vous voulez revenir à un rendu 2D pour les éléments enfants, utilisez transform-style: flat; .

2 votes

Ainsi, en mode "preserve-3d", nous devons utiliser l'axe z de la transformation pour définir l'ordre, et en mode "flat", nous devons utiliser le z-index. Le problème est que le z-index sur safari est cassé en combinaison avec les transformations accélérées par HW.

1 votes

Ne fonctionne pas. Cela ne fonctionne que si je supprime les styles animés par classe.

45voto

divThis Points 181

Ceci est très certainement lié au bogue noté par samy-delux. Cela ne devrait affecter que les éléments qui sont positionnés de manière absolue ou relative. Pour remédier à ce problème, vous pouvez appliquer la déclaration css suivante à chaque élément qui est positionné de cette façon et qui pose problème :

-webkit-transform: translate3d(0,0,0);

Cela appliquera la transformation à l'élément sans réellement effectuer une transformation, mais en affectant son ordre de rendu afin qu'il soit au-dessus de l'élément qui pose problème.

0 votes

En utilisant Chrome (35.0.1916.114 m), j'ai constaté que si je n'avais pas cette règle, après que l'élément ait été retourné [transform : rotateY(180deg)], les gestionnaires de clics jQuery ne fonctionnaient plus pour cet élément. De plus, après un retournement, des artefacts peuvent être laissés à l'écran, surtout si leur opacité a été modifiée, à moins que le translate3d ne soit présent ! Cet article a aidé sitepoint.com/fix-chrome-animation-flash-bug

2 votes

Cela vient de résoudre un problème très épineux pour moi, impliquant deux éléments fixes, l'un contenant un élément transformé en 3d. L'élément transformé en 3D débordait et se trouvait au-dessus de l'autre élément jusqu'à ce que la correction ci-dessus soit appliquée.

1 votes

Ne fonctionne pas. Cela ne fonctionne que si je supprime les styles animés par classe.

14voto

RustyCollins Points 339

Un peu tard mais essayez de mettre sur les éléments qui ont perdu leur Z-index en plaçant ce qui suit, j'ai eu un problème en faisant des trucs de parallaxe récemment et cela a aidé massivement.

transform-style: preserve-3d;

Cela évite de mettre

transform: translate3d(0,0,0);

Sur d'autres éléments qui sollicitent davantage le GPU.

7voto

Littlemad Points 498

En attendant de voir l'exemple

Avez-vous essayé de faire une transformation scale(1) ? Je me souviens avoir eu un problème similaire, et j'ai dû réorganiser l'ordre html des éléments, et utiliser une transformation dont je n'avais pas besoin juste parce que le z-index de l'utilisation de la transformation a changé.

Si je ne me trompe pas, chaque fois que vous utilisez une transformation, elle devient le z-index le plus élevé disponible, et elle est ordonnée par l'élément du html le plus proche du début de la balise. Donc de haut en bas.

J'espère que cette aide

6voto

Moje Points 1490

z-index fonctionnera contre les divs transformés en 3d si vous donnez un style à l'élément empilable avec -webkit-transform: translateZ(0px);

Snippet sur codepen -> http://codepen.io/mrmoje/pen/yLIul

Dans l'exemple, les boutons stack up et stack down augmente et diminue l'indice z du pied de page (+/-1) par rapport à l'élément pivoté (un img dans ce cas).

0 votes

L'empilement ne peut pas être cliqué à nouveau

0 votes

Hey @Moje, je me pose également la question. La pile ne peut toujours pas être recliquée.

0 votes

Pourquoi n'ai-je pas pensé à ajouter un z-index négatif à l'élément traduit ? Merci

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