Ответ 1
Вы можете попытаться присвоить значение от 0.01 до opacity
.
.face.init {
opacity: 0.01;
}
У меня есть следующая разметка:
<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
Здесь мое перо: 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!
Вы можете попытаться присвоить значение от 0.01 до opacity
.
.face.init {
opacity: 0.01;
}
Похоже, что это зарегистрированная ошибка регрессии
Для разницы в Safari и Chrome вы должны знать, что Chrome использует Blink (вилка webkit) как средство рендеринга, так как версия 28.
Эта проблема была привлечена к моему вниманию на Facebook. По просьбе, я отправлю свой первоначальный мыслительный процесс.
Вначале я думал, что Chrome видит 3D-преобразования в ключевых кадрах - анимация и аппаратное ускорение анимации - это то, что мы ожидаем, - но затем, когда пытались вмешаться через JavaScript, не прерывали выполнение графического процессора.
Сначала используйте отдельную анимацию ключевых кадров для анимации непрозрачности и вращения в одно и то же время, а затем запустите свою текущую анимацию, оживив только поворот, чтобы продолжить бесконечно.
Смотрите codepen.
Затем я сразу понял, что он хочет, чтобы каждое лицо постепенно исчезало в последовательности. Знание javascript не прерывало анимацию CSS, я пробовал анимировать .face
с помощью ключевого кадра-анимации. Используя animation-delay
, чтобы пошатнуть каждую грань.
Смотрите codepen. Но по какой-то причине он останавливается после первого лица: (
В этот момент я сжимал соломинку и думал, чтобы переключиться с perspective: 500px
на perspective: 501px
, в обратном вызове requestAnimationFrame
, в надежде, что он сломает аппаратное ускорение, но не повезет.
Но, использовав requestAnimationFrame
, я решил, что могу просто выполнить первый поворот и затухать с помощью javascript, а затем запустить анимацию CSS после.
Смотрите codepen. Это был намеченный визуальный эффект.
В то время как кто-то еще был бы сделан и вычищен, все еще используя javascript, я искал меня в ад - насколько я люблю JS, CSS только более плавный (прямо сейчас).
Тогда он ударил меня! Я мог бы просто анимировать background-color: rgba(...);
, а не opacity: ...;
.
И так в конце концов, у меня была целевая анимация с использованием чистого CSS.
Смотрите codepen.
Это было основано на Обходной путь 2. Мне пришлось создать 3 дополнительных анимации: по одному для каждого цвета .face
, идентифицированных с классами .x
, .y
и .z
.
Я использовал SCSS, чтобы было ясно, что я использовал исходные цвета (следовательно, rgba(#c82222,0);
), а также чтобы сохранить себе боль в шаге от необходимости конвертировать это в значения RGB.
Надеюсь, что кто-нибудь поможет:)
Попробуйте инициировать непрозрачность с нуля с более большим количеством значений перехода.
Отношение позиции CSS устраняет проблему:
.fullscreen {
position: relative;
http://codepen.io/anon/pen/oekyt
Это напоминает мне старые ошибки IE, тогда вы должны установить
*zoom: 1;
для элемента. Это сделало элемент "действительно оказанным", а не просто "светом".