css z-індекс, втрачений після перетворення webkit translate3d


98

У мене є два абсолютно розміщені елементи Div, які перекриваються. Обидва встановили значення z-індексу через css. Я використовую translate3dперетворення webkit, щоб анімувати ці елементи з екрану, а потім повернутися на екран. Після перетворення елементи більше не поважають їх встановлені z-indexзначення.

Чи може хтось пояснити, що відбувається з z-індексом / стеком-порядком елементів div, коли я перетворять на них веб-перетворення? І поясніть, що я можу зробити для збереження порядку складання елементів div?

Ось додаткова інформація про те, як я роблю перетворення.

Перед перетворенням кожен елемент отримує ці два значення переходу webkit, встановлені через css (я використовую jQuery для виконання .css()викликів функції:

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

Потім елемент анімовується за допомогою translate3d -webkit-transform:

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

До речі, я спробував встановити 3-й параметр translate3dна кілька різних значень, щоб спробувати повторити порядок стека в 3d-просторі, але не пощастило.

Крім того, браузери iPhone / iPad та Android - це мій цільовий браузер, на якому цей код потрібно працювати. Обидва підтримують переходи веб-кайтів.


Чи можете ви розмістити посилання, щоб побачити приклад?
Littlemad

1
Я зустрічався з тим же питанням. У мене є один тег <iframe> зі стилем всередині елемента "-webkit-transform: translate3d (0,0,0)", щоб примусити 3d прискорення. Виявляється, зовнішній кадр з більш високим z-індексом завжди прихований внутрішнім елементом iframe. Просто візуально прихований, я можу "натиснути" на невидимий зовнішній елемент. Це відбувається лише в мобільному Safari.
Морган Чен

Я витратив 10 годин, з'ясовуючи, що саме це змушує мій код не працювати. Уф
Dikeneko

Відповіді:


52

Це може бути пов’язано з: https://bugs.webkit.org/show_bug.cgi?id=61824

В основному, коли ви застосовуєте 3D-перетворення на осі z, z-індекс більше не можна обліковувати (зараз ви знаходитесь в тривимірній площині візуалізації, використовуйте різні z-значення). Якщо ви хочете повернутися до двовимірного візуалізації для дочірніх елементів, використовуйте transform-style: flat;.


13
В основному, коли ви застосовуєте 3D-перетворення на осі z, z-індекс більше не можна обліковувати (зараз ви знаходитесь в тривимірній площині візуалізації, використовуйте різні z-значення). Якщо ви хочете повернутися до двовимірного візуалізації для дочірніх елементів, використовуйте transform-style: flat;.
samy-delux

2
Отже, в режимі «збереження-3d» ми повинні використовувати вісь z перетворення z для встановлення порядку, а в плоскому режимі слід використовувати z-індекс. Помилка в тому, що z-індекс на сафарі порушений у поєднанні з перетвореними HW перетвореннями.
Стівен Лу

1
не працює. Працюйте лише, якщо я видаляю анімовані стилі за класом.
fdrv

44

Це, безумовно, пов’язано з помилкою, яку зазначив samy-delux. Це має впливати лише на будь-які елементи, розміщені як абсолютні або відносні. Щоб виправити проблему, ви можете застосувати наступний оператор css до кожного елемента, розміщеного таким чином і викликає проблеми:

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

Це застосує перетворення до елемента, фактично не зробивши перетворення, але вплине на його порядок рендерінгу, тому він знаходиться вище елемента, що викликає проблему.


Використовуючи Chrome (35.0.1916.114 м), я виявив, що якщо у мене не було цього правила, після перевертання елемента [перетворення: rotateY (180deg)], обробники клацань jQuery більше не працюють для цього елемента. Крім того, після гортання виникають проблеми з артефактами, які залишаються на екрані, особливо якщо вони змінили непрозорість, якщо тільки немає translate3d! Ця стаття допомогла sitepoint.com/fix-chrome-animation-flash-bug
Філіп Мерфі

2
Це щойно вирішило для мене дуже липку проблему, що стосується двох нерухомих елементів, один з яких містить 3d перетворений елемент. 3D-трансформований елемент в основному переповнюватиметься і розташовуватиметься над іншим елементом, поки не буде застосовано виправлення вище.
Коллін Джеймс

1
не працює. Працюйте лише, якщо я видаляю анімовані стилі за класом.
fdrv

12

Трохи пізно до цього, але спробуйте вкласти елементи, які втратили свій Z-індекс, розміщуючи наступне, у мене виникла проблема, коли я робив деякі паралаксальні речі останнім часом, і це допомогло масово.

transform-style: preserve-3d;

Це економить розміщення

transform: translate3d(0,0,0);

Щодо інших елементів, що створює більше навантаження на GPU


1
Коли ваші елементи будуть 3d, я б не очікував, що трансформація поставить додаткову напругу на GPU. Розрахунки потрібно робити все одно. На чому ви це ґрунтуєте?
Мікрос

7

Чекаю, щоб побачити приклад

Ви намагалися зробити шкалу перетворення (1)? Пам’ятаю, у мене була подібна проблема, і мені довелося перевпорядкувати html-порядок елементів і використовувати перетворення, яке мені не потрібно, лише тому, що змінився z-індекс використання перетворення.

Якщо я не помиляюся, щоразу, коли ви використовуєте перетворення, він стає найвищим доступним z-індексом, і він упорядковується найближчим елементом html - до початку тегу. Так зверху вниз.

Я сподіваюся, що це допоможе


6

z-index буде працювати проти 3D-трансформованих дівок, якщо ви стилізуєте стикувальний елемент -webkit-transform: translateZ(0px);

Знімок на codepen -> http://codepen.io/mrmoje/pen/yLIul

У прикладі, кнопка stack upі stack downпіднімати і опускати Z-індекс нижнього колонтитула в (+/- 1) проти повернутого елемента (An IMG в даному випадку).


стек не можна
клацати

Привіт @Moje Мені теж цікаво з цього питання. На стек все ще не можна натиснути знову.
alchuang

Чому я не думав додавати негативний z-індекс до перекладеного елемента? Дякую
буде

3

Я не зміг відтворити описану тут проблему. Незалежно від того, що я роблю, значення z-індексу зберігається протягом усіх перетворень. Я тестую за допомогою Chromium (Google Chrome).

Третій аргумент функції translate3d маніпулює осі z елемента. Поняття подібне, але не зовсім те саме, що z-індекс ... Елементи з нижньою віссю z знаходяться під елементами з більшим значенням.

Я знаю, що ви намагалися значення третього аргументу відповідати призначеному z-індексу, але проблема полягає в тому, що вісь z не схоже змінюється під час анімації CSS3. У наступному прикладі елемент, що наближається, повинен бути зверху, але #element_a залишається зверху.

Якщо я додаю z-індекс як до звичайного селектора, так і до: курсора вибору, він, здається, працює і дозволяє елементу, що наближається, найкращим чином.

Хоча це не зовсім те, що ви шукали, така поведінка забезпечує рішення. Вам просто потрібно використовувати translate3d та z-index, щоб встановити порядок початкового візуалізації.

<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>

2
Це працювало для мене - дякую! До елементу, який я хочу бути "попереду", я додав наступне: -webkit-transform: translate3d (0, 0, 1px);
Сем Даттон

0

Інший спосіб цього полягає в тому, що ви можете створити батьківський елемент і застосувати всі інші переходи, пов'язані з ним:

# 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.