7 480 Скрипты / Slider

3D анимация вращения куба


Сегодня будет создавать 3D анимацию вращения используя css3 3d transform и css3 animation без использования jаvascript.

Идея заключается в создании слайдера в котором смена изображений происходит за счет 3D вращения кубов на которые "разрезается" картинка.

Замечу, что не все браузеры поддерживают свойство css3 3D transform. 3D эффект можно увидеть только в Chrome и Safari.

Построение куба

HTML

А начнем мы с нащего центрального элемента в уроке - куба.
Как мы знаем куб имеет 6 граней - front, back, top, bottom, left, right (передняя, задняя, верхняя, нижняя, левая, правая). С помощью html мы должны "обозначить" все эти грани и отделить их друг от друга различными css классами.

<div id="viewContainer">
   <div class="cube" >
      <div class="facefront"></div>
      <div class="faceback"></div>
      <div class="faceleft"></div>
      <div class="faceright"></div>
      <div class="facetop"></div>
      <div class="facebottom"></div>
   </div>
</div>

CSS

Однако, эти html элементы не могут автоматически стать кубом без помощи css3 3d transform.

Элемент #viewStage - это контейнер внутри которого будет происходить наша 3D анимация. Все элементя внутри будут перемещаться и вращаться относительно #viewStage, который сам останется фиксированным на странице.
Атрибут perspective определет, как далеко по оси Z может располагаться 3D элемент. Чем большее значение, тем менее очевидным будет 3D эффект.

Если вы вставите html код и css разметку приведенную выше в ваш текстовый редактор и запустите этот файл в браузере, то увидите красочный куб. Если браузер у вас не поддерживает 3D transform, то на экране будут два отличающихся по цвету прямоугольника.
Попробуйте изменить значение perspective и посмотрите, что станет с кубом.


Множество кубов

Итак, после рассмотрения основного принципа построения куба, используя css3 3d transform, пройдемся по разметке первого Демо. Однако тут мы исключили некоторые префиксы для браузеров (-moz), чтобы уменьшить объем, но в исходниках они есть.

HTML

Первым шагом будет создание нескольких кубов и объединение их в один большой куб. Достичь этого мы можем за счет дублирования приведенной выше html разметки куба и использования различных css стилей. Также всем элементам куба дадим различные идентификаторы (ID).

CSS

Стилизация будет такая:

Атрибут -webkit-backface-visibility используется к элементу и указывает ему должен ли он быть видимым, если не обращен к экрану. По умолчанию значение - видим.

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


Вращение куба

Сейчас реализуем автоматическое вращение куба. Для этого случая мы будем использовать keyframes "rotation".

/*--- Cube Style ---*/
.cube
{
   position:relative;
   float:left;
   width:150px;
   height:300px;
   /* Cube Transforms attributes */
   -webkit-transform-style: preserve-3d;
   -webkit-transform-origin: 50% 50%;
   /* Cube Animation attributes */
   -webkit-animation-name: rotation;
   -webkit-animation-timing-function: ease;
   -webkit-animation-iteration-count: infinite;
   -webkit-animation-duration: 15s;
}

Приведенные выше css атрибуты генерируют анимацию продолжительностью 15 секунд.

Keyframes "rotation" для Демо 1 приведен ниже. Этот keyframes будет поворачивать куб на четверть круга и затем приостанавливать вращение на несколько секунд, после которых куб будет продолжать вращаться и опять делать паузу.
/*-- Keyframes --*/
@-webkit-keyframes rotation
{
   from, to {  }
   10%, 25% { -webkit-transform: rotateX(-90deg); }
   35%, 50% { -webkit-transform: rotateX(-180deg); }
   60%, 75% { -webkit-transform: rotateX(-270deg); }
   85%, 100% { -webkit-transform: rotateX(-360deg); }
}
В Демо 2 и Демо 3 приведены примеры более сложного вращения.

Улучшения

К этому моменту вы уже можете увидеть эффект вращающегося куба. Однако эффект выглядит грубоватым и не гибким. Следовательно мы должны несколько улучшить его.
Во-первых, сделаем вращение более привлекательным, добавив небольшую задержку анимации для каждого куба - animation-delay.

/*-- Cubes z-index fix with animation delay --*/
#cube1
{
   z-index: 1;
   -webkit-animation-delay: 1s;
}
#cube2
{
   z-index: 2;
   -webkit-animation-delay: 1.2s;
}
#cube3
{
   z-index: 1;
   -webkit-animation-delay: 1.4s;
}
Далее, добавим большей гибкости для easing эффекта, вместо его дефолтного значения.
/*--- Cube Style ---*/
.cube
{
   position:relative;
   float:left;
   width:200px;
   height:400px;
   /* Cube Transforms attributes */
   -webkit-transform-style: preserve-3d;
   -webkit-transform-origin: 50% 50%;
   /* Cube Animation attributes */
   -webkit-animation-name: rotation;
   -webkit-animation-timing-function: cubic-bezier(0.6, -1, 0.4, 1.5);
   -webkit-animation-iteration-count: infinite;
   -webkit-animation-duration: 15s;
}
И последнее, будем определять неподдерживающие свойство 3D transform браузеры, с выводом соответствующего текста.
Скачать 2554Загрузок 374,66 Kb
Демо

Комментарии

  • Facebook
  • Вконтакте

Похожие статьи