2012-09-10 7 views
5

entschied ich mich zu verwenden:z-index vs translate3D auf Chrome

* { 
    -webkit-transform: translate3d(0px, 0px, 0px); 
} 

, als ich sah, dass es meine Animationen macht viel glatter, wahrscheinlich, weil es die Hardware-Beschleunigung zwingt. Aber ich muss auch einige z-index Tweaks machen, um eine Form vor einen Text zu setzen, zu mask dieser Text an einem Punkt einer Animation. Die Sache ist: Meine (graue) Form muss sich mit einer anderen Form (die grüne im Beispiel unten), die hinter dem Text ist, synchronisieren.

Ich baute eine einfache example, um es visueller zu machen. Es funktioniert gut mit Firefox, aber ich kann es einfach nicht auf Chrome und Safari funktionieren. Nun, es funktioniert, wenn ich das translate3d-Ding entferne, aber da mein aktuelles Projekt viele gleitende und glatte Animationen erfordert, würde die Benutzererfahrung leiden, wenn ich das täte.

+1

Ich denke Chrome zeigt das richtige Verhalten, aber Firefox ist nicht. Das '# handler'-Element legt den" maximalen "Stack-Level für seine Kinder fest. Auch wenn der ganzzahlige Wert des 'z-index' von' # mask' höher ist als der von '# text', heißt das nicht, dass' # mask' optisch höher ist als '# text'. Ich könnte mich irren, weshalb ich dies als Kommentar poste. – Blender

+0

Danke Ana. Macht Sinn. Aber warum funktioniert es dann wie erwartet (in Chrome), wenn ich das translate3d Stück entferne? Schau http://jsfiddle.net/izaiasdotcom/8Zs4e/1/. Komisch, nicht wahr? – Izaias

Antwort

0

Verstanden! Wir können CSS-Clip-Eigenschaft verwenden, um den Text zu maskieren und die rect-Werte basierend auf der Position des anderen Objekts zu aktualisieren. Hier sind einige Informationen w3schools.com/cssref/pr_pos_clip.asp. Dieser Link ist auch sehr aufschlussreich http://webdesignerwall.com/tutorials/5-simple-but-useful-css-properties.

Und schließlich hier ist mein Projekt, getan http://iuqo.com. Wenn Sie den Hintergrund ziehen, sehen Sie, dass der Text (vertikal und schön) ausgeschnitten ist. Genau so, wie ich es wollte.

4

Ohne translate3D ist es möglich, einen Peer-DOM-Knoten (Ihren Text) zwischen einem anderen Peer (Ihrem Handler) und einem seiner Kinder (Ihrer Maske) zu positionieren, aber nur, weil weder Ihr Text noch Ihr Handler explizite Z-Indizes haben . In diesem Fall werden alle nicht z-indizierten Blöcke zuerst gerendert und dann wird die Maske zuletzt gerendert und endet oben (obwohl es ein untergeordnetes Element ist). Macht das Sinn? Nun, so funktionieren Browser.

Wenn Sie jedoch translate3d zu "*" hinzugefügt haben, haben Sie jedem Element einen Stapelkontext hinzugefügt. Was also ohne translate3d "funktioniert", funktioniert jetzt nicht. Übrigens, adding an explicit z-index to each element in your example - ruiniert auch Ihre Maske. Auch hier können Sie keinen Peer-DOM-Knoten zwischen einem anderen Peer und einem seiner untergeordneten Elemente positionieren, da die untergeordneten Elemente den Z-Index des übergeordneten Elements erben, sofern die Positionierung relativ zu einem Onkel/Tante-Knoten erfolgt.

Mein Rat ist, Ihre Sachen zu ernest, so dass alles, was Sie in der Z-Achse relativ zueinander positionieren wollen, ein DOM-Peer ist. Dazu muss die absolute Positionierung jedes Elements manuell berechnet werden, und Sie verlieren den Vorteil der Überlaufbegrenzung, aber hey, it works. Sie können das auch duplizieren, indem Sie 3D-Transformationen mit positiven und negativen Z-Werten durchführen - aber wiederum nur unter Peer-Elementen.

(Kennzeichnung des Z-Index als! Important, rückgängig macht nur die Kaskade und platziert das Element auf der Oberseite der Cascading Stapelreihenfolge. Es ist ein Hack.)

+0

Danke Michael, du hast definitiv Recht! Mein Ziel ist eigentlich, sowohl die Maske und die Form hinter dem Text gleichzeitig zu animieren, aber es scheint unmöglich zu bekommen, während die Bewegung glatt zu halten. Schauen Sie sich die Beispiele unten an, um zu sehen, wie der später viel glatter läuft (aber ohne die Maske vorne). Der Unterschied ist exponentiell in meinem aktuellen Projekt sichtbar: http: // jsfiddle.net/izaiasdotcom/78qak/4/und http://jsfiddle.net/izaiasdotcom/78qak/5/ – Izaias

+0

Ich glaube, dass dies, weil wenn Sie nicht-3Dtransformed mit 3D-transformierten Inhalten verschachteln, kann es nicht GPU beschleunigt werden - Grundsätzlich muss die GPU ein Quadrat haben, innerhalb dessen sie allein für Änderungen verantwortlich ist. –

+0

Verstanden! Wir sollten CSS-Clip-Eigenschaft verwenden, um den Text zu maskieren und die rect-Werte basierend auf der Position des anderen Objekts zu aktualisieren. Hier sind einige Informationen http://www.w3schools.com/cssref/pr_pos_clip.asp. Dieser Link ist auch aufschlussreich http://webdesignerwall.com/tutorials/5-simple-but-useful-css-properties – Izaias

Verwandte Themen