css z-Indeks utracony po transformacji webkit translate3d

Mam dwa absolutnie umieszczone elementy div, które nakładają się na siebie. Oba mają ustawione wartości z-index za pomocą css. Używam transformacji translate3d webkit do animowania tych elementów poza ekranem, a następnie z powrotem na ekran. Po przekształceniu elementy nie respektują już swoich wartości zbioru z-index.

Czy ktoś może wyjaśnić, co dzieje się z kolejnością z-index / stack elementów div, gdy wykonam na nich transformację webkit? I wyjaśnij, co mogę zrobić, aby utrzymać stos-kolejność div żywioły?

Oto więcej informacji o tym, jak robię transformację.

Przed transformacją, każdy element dostaje te dwie wartości przejścia webkit ustawione przez css (używam jQuery do wykonywania .css() wywołania funkcji:

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

Element jest następnie animowany przy użyciu translate3d-webkit-transform:

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

Btw, próbowałem ustawić trzeci parametr translate3d na kilka różnych wartości, aby spróbować odtworzyć kolejność stosu w przestrzeni 3d, ale nie szczęście.

Ponadto, przeglądarki iPhone/iPad i Android są moją przeglądarką docelową, na której ten kod musi działać. Oba obsługują przejścia webkit.

Author: George Kagan, 2011-03-29

7 answers

To może być związane z: https://bugs.webkit.org/show_bug.cgi?id=61824

Zasadniczo, gdy zastosujesz transformatę 3D na osi Z, Indeks z nie może być już uwzględniany(jesteś teraz w trójwymiarowej płaszczyźnie renderowania, używaj różnych wartości z). Jeśli chcesz wrócić do renderowania 2D dla elementów potomnych, użyj transform-style: flat;.

 46
Author: samy-delux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-09 16:33:18

Jest to zdecydowanie związane z błędem zauważonym przez samy-delux. Powinno to dotyczyć tylko elementów, które są pozycjonowane jako absolutne lub względne. Aby rozwiązać ten problem, możesz zastosować następującą instrukcję css do każdego elementu, który jest umieszczony w ten sposób i powoduje problemy:

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

To zastosuje transformację do elementu bez wykonywania transformacji, ale wpływa na jego kolejność renderowania, więc znajduje się powyżej elementu powodującego problem.

 41
Author: divThis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-18 12:55:17

Trochę za późno na to, ale spróbuj umieścić na elementy, które straciły swój Z-index umieszczając poniżej, miałem problem podczas robienia paralaksy Ostatnio i to bardzo pomogło.

transform-style: preserve-3d;

To oszczędza Wkładanie

transform: translate3d(0,0,0);

Na innych elementach, które bardziej obciążają GPU

 11
Author: RustyCollins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-25 08:52:03

czekam na przykład

Próbowałeś zrobić skalę transformacji(1)? Pamiętam, że miałem podobny problem i musiałem zmienić kolejność elementów html i użyć transformacji, której nie potrzebowałem tylko dlatego, że zmienił się Indeks z użycia transform.

Jeśli nie jestem w błędzie, za każdym razem, gdy używasz transformacji, staje się ona najwyższym dostępnym indeksem z i jest uporządkowana przez najbliższy element html jest na początku znacznika. Więc od do poniżej.

Mam nadzieję, że ta pomoc

 7
Author: Littlemad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-29 13:38:28

z-index będzie działać przeciwko transformowanym div 3D, Jeśli stylizujesz element stosowy za pomocą -webkit-transform: translateZ(0px);

Fragment na codepen - > http://codepen.io/mrmoje/pen/yLIul

W przykładzie przyciski stack up i stack down podnoszą i opuszczają Indeks z stopki (+/-1) względem obracanego elementu (w tym przypadku img).

 5
Author: moje,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-12 02:13:42

Nie udało mi się odtworzyć problemu, który tu opisujesz. Niezależnie od tego, co robię, wartość z-index jest zachowana we wszystkich transformacjach. Testuję za pomocą Chromium (Google Chrome).

Trzeci argument funkcji translate3d manipuluje osią Z elementu. Koncepcja jest podobna, ale nie dokładnie taka sama jak, z-index... Elementy o niższej osi z znajdują się pod elementami o wyższej wartości.

Wiem, że próbowałeś wartości trzeciego argumentu do dopasuj zamierzony Indeks z, ale problem polega na tym, że oś z nie zmienia się podczas animacji CSS3. W poniższym przykładzie Element zawieszony powinien znajdować się na górze, ale #element_a pozostaje na górze.

Jeśli dodam Indeks z zarówno do zwykłego selektora, jak i :hover selektor, wydaje się działać i pozwolić, aby element zawinięty był najwyżej.

Chociaż nie jest to dokładnie to, czego szukałeś, to zachowanie zapewnia rozwiązanie. Wystarczy użyć translate3d i z-index do Ustaw kolejność początkowego renderowania.

<style>
    div {
        width: 300px;
        height: 150px;
        background-color: white;
        border: 5px outset gray;
        float: left;
        margin: 20px;
        -webkit-transition: 2s;
    }

    #element_a {
        -webkit-transform: translate3d(0, 0, 50px);
    }
    #element_b {
        -webkit-transform: translate3d(0, 0, 100px);
    }

    #element_a:hover {
        -webkit-transform: translate3d(100px, 0, 60px);
    }

    #element_b:hover {
        -webkit-transform: translate3d(-100px, 0, -60px);
    }
</style>
<body>
    <div id="element_a">
        <img src="http://www.google.com/intl/en_com/images/srpr/logo3w.png">
    </div>
    <div id="element_b">
        <img src="http://www.google.com/intl/en_com/images/srpr/logo3w.png">
    </div>
</body>
 3
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-28 14:52:13

Innym sposobem jest to, że możesz utworzyć element nadrzędny i zastosować wszystkie inne przejścia z nim związane:

# Apply transitions to a parent div
<div>
  # This image z-index -1 
  <img src="foo"/>

  # This image z-index -3
  <img src="bar"/>

  #This image z-index -2
  <img src="gg"/>
</div>

JsFiddle

 0
Author: user3284463,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-22 20:14:53