Google Chrome не может применить переход непрозрачности на трехмерном преобразованном элементе

У меня есть следующая разметка:

<div class="cube trigger cuberotate">
    <div class="face init f z"></div>
    <div class="face init l y"></div>
    <div class="face init b z"></div>
    <div class="face init r y"></div>
    <div class="face init u x"></div>
    <div class="face init d x"></div>
</div>

Что напоминает 3d-куб, каждое лицо повернуто и переведено в правильное положение, и я позволяю кубу вращаться, используя анимацию на родительском лице.

Вот связанный с ним css:

.cube {
  position: absolute;
  cursor: pointer;

  width: 120px;
  height: 120px;

  top: 0;
  left: 0;

  transform-origin: 50% 50%;
  transform-style: preserve-3d;
}

.face {
  position: absolute;

  width: 120px;
  height: 120px;

  border: 0px solid #fff;
  background: #c82222;

  transform-origin: 50% 50%;

  opacity: 1;
  padding: 0px;

  -webkit-touch-callout: none;
  user-select: none;

  transition: all 0.5s ease-out;    
}

Я хотел, чтобы куб отображался на одном лице в момент готовности документа, поэтому я просто добавил несколько javascript, в основном интервал каждые 500 мс, который просто удаляет класс .init, который переопределяет значение opacity: 1 на .face класс.

(function($) {
  'use strict';

  // Some selectors and shit...
  var $face = $('.face').first(),
      speed = 500,
      timer = null;

  $(document).ready(function(){
    // Start showing faces
    timer = window.setInterval(function(){
      var $next = $face.next();

      $face.removeClass('init');

      if(!$next.hasClass('face')) {
        window.clearInterval(timer);
      }

      $face = $next;
    }, speed);

  });


})(jQuery);


// And the additional CSS below
.face.init {
  opacity: 0;
}

В идеальном мире этот код должен работать, однако я столкнулся с проблемой в Google Chrome, непрозрачность не переходит к 1 после удаления класса, сохраняя невидимый куб. Если вы щелкните правой кнопкой мыши и осмотрите его, он снова станет видимым.

Любопытно, что в Safari, который также является браузером на основе веб-кита, этого не происходит вообще, и лица показывают один раз, как они должны делать.

Я попытался использовать оба .animate() из jquery, а также попробовал плагин jquery transit

  • Теперь Safari и Chrome не должны вести себя одинаково, или существуют большие различия под капотом, несмотря на то, что движок рендеринга является тем же самым?
  • Это что-то я сделал не так?
  • Есть ли обходной путь для этого?

Здесь мое перо: http://codepen.io/luigimannoni/pen/FstKG/

Спасибо

Update:

Я пробовал явно на Chrome на моем Mac, а также на Windows 7, и они оба ведут себя одинаково (разные машины также)

Также попробовал Firefox, который работает так же, как Safari, помимо вращающейся анимации, которая не происходит (но я не учитывал Firefox, поскольку это другой браузер).

Дополнительное обновление:

Chrome на мобильных устройствах (как iOS, так и Android) работают и ведут себя как Safari на рабочем столе.

Другое обновление:

После игры вокруг я обнаружил, что это ошибка браузера, Chrome Canary работает нормально, как и ожидалось. Я разместил это на facebook, где у меня есть пара хороших обходных решений от разработчика, которые я нашел довольно творческими.

Первый из них имеет фоновый цвет rgba() и делает альфа-изменение вместо перехода на непрозрачность: http://codepen.io/anon/pen/IjsBL

Вторым был бит javascript-кодирования, заставляющий браузер перерисовывать лица в каждом кадре: http://codepen.io/anon/pen/Hofzb

Я начинаю щедрость, чтобы узнать, что может сделать здесь stackoverflow!

Ответ 1

Вы можете попытаться присвоить значение от 0.01 до opacity.

.face.init {
  opacity: 0.01;
}

Ответ 3

Эта проблема была привлечена к моему вниманию на Facebook. По просьбе, я отправлю свой первоначальный мыслительный процесс.

Первоначальная мысль: агрессивное использование GPU/аппаратное ускорение

Вначале я думал, что Chrome видит 3D-преобразования в ключевых кадрах - анимация и аппаратное ускорение анимации - это то, что мы ожидаем, - но затем, когда пытались вмешаться через JavaScript, не прерывали выполнение графического процессора.

Обходной путь 1:

Сначала используйте отдельную анимацию ключевых кадров для анимации непрозрачности и вращения в одно и то же время, а затем запустите свою текущую анимацию, оживив только поворот, чтобы продолжить бесконечно.

Смотрите codepen.

Обходной путь 2:

Затем я сразу понял, что он хочет, чтобы каждое лицо постепенно исчезало в последовательности. Знание javascript не прерывало анимацию CSS, я пробовал анимировать .face с помощью ключевого кадра-анимации. Используя animation-delay, чтобы пошатнуть каждую грань.

Смотрите codepen. Но по какой-то причине он останавливается после первого лица: (

Обходной путь 3:

В этот момент я сжимал соломинку и думал, чтобы переключиться с perspective: 500px на perspective: 501px, в обратном вызове requestAnimationFrame, в надежде, что он сломает аппаратное ускорение, но не повезет.

Обходной путь 3.1:

Но, использовав requestAnimationFrame, я решил, что могу просто выполнить первый поворот и затухать с помощью javascript, а затем запустить анимацию CSS после.

Смотрите codepen. Это был намеченный визуальный эффект.

Обходной путь 4:

В то время как кто-то еще был бы сделан и вычищен, все еще используя javascript, я искал меня в ад - насколько я люблю JS, CSS только более плавный (прямо сейчас).

Тогда он ударил меня! Я мог бы просто анимировать background-color: rgba(...);, а не opacity: ...;.

И так в конце концов, у меня была целевая анимация с использованием чистого CSS.

Смотрите codepen.

Это было основано на Обходной путь 2. Мне пришлось создать 3 дополнительных анимации: по одному для каждого цвета .face, идентифицированных с классами .x, .y и .z.

Я использовал SCSS, чтобы было ясно, что я использовал исходные цвета (следовательно, rgba(#c82222,0);), а также чтобы сохранить себе боль в шаге от необходимости конвертировать это в значения RGB.


Надеюсь, что кто-нибудь поможет:)

Ответ 4

Попробуйте инициировать непрозрачность с нуля с более большим количеством значений перехода.

Ответ 5

Отношение позиции CSS устраняет проблему:

.fullscreen {
  position: relative;

http://codepen.io/anon/pen/oekyt

Это напоминает мне старые ошибки IE, тогда вы должны установить

*zoom: 1;

для элемента. Это сделало элемент "действительно оказанным", а не просто "светом".