CSS 3D анимация, как? - PullRequest
       23

CSS 3D анимация, как?

11 голосов
/ 22 марта 2012

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

Я нашел этот сайт в качестве примера.Вы можете выбрать текст и т. Д. Все время.Может ли кто-нибудь привести очень простой для понимания и небольшой пример, как это работает?Я вижу исходный код, но на самом деле я его не понимаю…

Это CSS3 или HTML5 или оба?

Сколько JavaScript мне нужно?

Какие браузеры поддерживаютэто?

Ответы [ 2 ]

84 голосов
/ 20 января 2013

Это две части.

  1. Первая о построении трехмерной фигуры.
  2. Вторая включает анимацию это (и это простая часть).

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

это css3 или html5 или оба?

Это CSS3.CSS 3D-преобразования и анимации ключевых кадров .

сколько мне нужно JavaScript?

Что ж, если вы не хотите создавать саму 3D-фигуру с помощью JavaScript, вам не нужен JavaScript для ее анимации.Любой браузер, который поддерживает 3D-преобразования , также поддерживает анимации ключевых кадров и , если браузер поддерживает анимации ключевых кадров, то вы, вероятно, захотите использовать их вместо jQuery (и, возможно,даже ваши собственные пользовательские анимации JS .

какие браузеры поддерживают это?

Вещи выглядели не очень хорошо два года назад, но они 'становится лучше ...

✓ Chrome , Safari , Firefox (хотя анимация Firefox 3D покачивается и не нравится моему процессору... У меня есть 6-летний ноутбук, это правда) Opera 15+ (WebKit) поддерживает 3D-преобразования.И, конечно же, анимация ключевых кадров.

Firefox поддерживает все без префиксов, Chrome / Safari / Opera нужен префикс -webkit- - update : Chrome 36+ и Opera 23+ также поддерживают их без префиксов,так что теперь осталось только Safari.Я не буду использовать префиксы в ответе или в демоверсии (-prefix-free позаботится там о вещах). Еще одно обновление : Преобразования префиксов Safari 9.

3D-преобразования не поддерживались Opera до перехода на WebKit.

✗ IE вплоть до 9 * 1078 включительно не поддерживает 3D-преобразования. IE10 и IE11 поддерживают 3D-преобразования, но не поддерживают вложение 3D-преобразованных элементов (невозможно создать реалистично выглядящие 3D-формы с помощью применения 3D-преобразований для родительского и дочернего элементовэлементы, поскольку 3D-преобразованные дочерние элементы 3D-преобразованного родительского элемента сглаживаются в плоскости родительского элемента). Обновление : Edge теперь поддерживает вложение трехмерных преобразованных элементов.


Хорошо, надеюсь, это прояснит некоторые вещи.Теперь ...

1 Создание куба CSS.

1.2 Что такое куб и начинается с HTML

Прежде всего, попробуйте изобразить куб.Может быть эта ссылка помогает?Или давайте также получим изображение здесь.

cube

У него 6 квадратных граней.1 верх, 1 низ;1 спереди, 1 сзади;1 слева, 1 справа.Это означает, что HTML просто:

<ul class='cube'>
    <li class='face'></li>
    <li class='face'></li>
    <li class='face'></li>
    <li class='face'></li>
    <li class='face'></li>
    <li class='face'></li>
</ul>

Сначала вы добавляете некоторую регулярность в грани, присваиваете им равно width и height, располагаете их абсолютно так, чтобы они 'все они сложены друг на друга, дают им различное происхождение, они не против этого.Вы можете дать им немного отступов, вставить в них какой-нибудь фиктивный текст, что угодно ...

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

1.2 Система координат

Рассмотрим эту трехмерную систему координат:

3D coordinate system

Первоначально все 6 гранейвсе именно там, где вы видите синий квадрат, в плоскости xOy (где O - пересечение трех осей).

Обратите внимание на направление y-axis.Исходя из математического фона, на первый взгляд это показалось мне немного странным, но такова система координат экрана.

В 2D начало координат O находится в верхнем левом углу, поэтому+ (положительное направление) x-axis указывает вправо и + y-axis указывает вниз.

1.2.a Переводы по осям

Таким образом, перевод положительного значения вдоль x-axis (например, translateX(10px)) перемещает элемент, к которому оно применяется, вправо (к + из x-axis), в то время как перевод отрицательного значениязначение вдоль x-axis (что-то вроде translateX(-10px)) перемещает его влево.

Аналогично, перевод положительного значения вдоль y-axis (например, translateY(10px)) перемещает элемент вниз (в направлении+ y-axis), в то время как перевод отрицательного значения вдоль y-axis (например, translateY(-10px)) перемещает его вверх.

Теперь добавьте другое измерение.С z-axis.+ (положительное направление) z-axis выходит из экрана к вам.Таким образом, перевод положительного значения вдоль z-axis (например, translateZ(10px)) перемещает элемент вперед (к + z-axis и к вам), в то время как перевод отрицательного значения вдоль z-axis(как translateZ(-10px)) перемещает его назад (от вас).

1.2.b Повороты вокруг осей

Повороты положительных угловых значений (например, rotate(15deg) - обратите внимание, что еслиось вращения не указана, то предполагается, что в CSS * z-axis) по часовой стрелке, а вращения отрицательных значений угла (например, rotate(-15deg)) - против часовой стрелки.

И по часовой стрелке означает, что по часовой стрелкевидно из + оси, вокруг которой вы вращаете элемент.

Таким образом, положительное вращение вокруг x-axis означает вращение по часовой стрелке в yOz plane, как видно из + x-axis, который находится справа.

Положительное вращение вокруг y-axis означает вращение по часовой стрелке в zOx plane (горизонтальная плоскость), как видно из + y-axis,который находится внизу.

Положительное вращение вокруг z-axis означает вращение по часовой стрелке в xOy plane (плоскости экрана), как видно из + z-axis, то есть то, как вы естественным образом видите экран.

1.3 Поместите грани в правильные положения, чтобы сформировать куб

1.3.1 Поместите одну грань на перед

Это означаетпереводя его вперед (в положительном направлении) вдоль z-axis.Что это?A translateZ положительного значения.Какое значение?Ну, это должно быть половина width (или height, не имеет значения, это квадрат, они равны).

Предположим, у меня есть width: 16em;

Тогда в этом случае вы переводите лицо вперед (вдоль положительного z-axis) на 16em/2 = 8em.В CSS это

.face:nth-child(1) { transform: translateZ(8em); }

Примечание : Перевод transform перемещает всю систему координат переводимого элемента (и, следовательно, transform-origin для любогопоследующие преобразования).

1.3.2 Поместить вторую грань на зад

Это просто, верно?Просто перевод по z-axis, с тем же значением в противоположном направлении, верно?.face:nth-child(2) { transform: translateZ(-8em); }, верно?

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

Каждый из этих квадратов, составляющих куб, имеет переднюю и заднюю части..Фронт - это направление к положительному направлению z-axis;тот, который "смотрит на тебя с экрана компьютера".Если вы поместите туда текст, он будет нормально отображаться на передней панели.Но он выглядит зеркально вертикально на спине.

Вот почему первое, что вы должны сделать, это повернуть вторую квадратную грань на 180 ° вокруг вертикальной оси (y-axis).После этого вы можете перевести эту вторую квадратную грань вдоль z-axis, чтобы переместить ее назад.

Значение перевода снова положительное в этом случае.Точно так же, как перевод transform перемещает систему координат переводимого элемента, вращение transform ... хорошо ... вращает его .Это означает, что после применения rotateY(180deg), + из z-axis указывает назад (больше не вперед).

Итак, CSS, который вращает и затем переводит вторую грань в свою позицию на кубе:

.face:nth-child(2) { transform: rotateY(180deg) translateZ(8em); }

Примечание : куб - это действительно простая трехмерная фигура, но один CSSсвойство, которое я считаю действительно полезным для проверки правильности поворота граней, - backface-visibility.Если я установил его на hidden и не вижу повернутый элемент, это означает, что я смотрю на него сзади.

1.3.3 Поместите третье лицо вправо

Прежде всего, его фронт должен «смотреть» вправо.Это означает, что его нужно повернуть вокруг y-axis, чтобы + из z-axis в конечном итоге указывало вправо, а затем его нужно перевести вдоль положительного z-axis на то же положительное значение (8em в данном случае) это половина длины стороны квадрата.

Повернуто на какой угол?Ну, 90 °, что означает, что нужно CSS:

.face:nth-child(3) { transform: rotateY(90deg) translateZ(8em); }

1.3.4 Поместить четвертую грань в влево

Сначала поверните его на 90°, но наоборот , чтобы его передняя часть "смотрела" влево.«Другой способ» означает rotateY(-90deg), затем примените тот же самый старый translateZ(8em).В одной строке CSS:

.face:nth-child(4) { transform: rotateY(-90deg) translateZ(8em); }

1.3.5 Поместите пятое лицо в top

Сначала поверните его на 90° вокруг x-axis, а затемпереводить по z-axis (который указывает вверх после поворота).CSS:

.face:nth-child(5) { transform: rotateX(90deg) translateZ(8em); }

1.3.6 Поместите шестую (и последнюю!) Грань в top

Поверните ее на 90° наоборот x-axis, затем переведите его вдоль z-axis (который указывает вниз после поворота).CSS:

.face:nth-child(6) { transform: rotateX(-90deg) translateZ(8em); }

1.4 Перспективные и реалистичные трехмерные фигуры

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

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

Вы включаете вложение трехмерных преобразованных элементов с помощью transform-style: preserve-3d; на родительском элементе (.cube в данном случае).К сожалению, IE10 / 11 не поддерживает значение preserve-3d для свойства transform-style (поддерживается только значение flat), поэтому вы не можете иметь реалистично выглядящий куб в IE (если только вы не примете 3D-преобразованияприменяется к кубу и связывает их перед преобразованиями, применяемыми для каждой грани, что означает один набор ключевых кадров для каждой грани, если вы хотите анимировать куб в целом ).

Обновить : transform-style: preserve-3d теперь также приземляется в IE.

Примечание : если вы также применяете 3D-преобразования к .cube, то вам следует переместить свойство perspective народительский элемент .cube.

2 Анимация куба CSS

Это делается с помощью обычной анимации ключевых кадров для элемента .cube.Допустим, вы хотите повернуть его:

@keyframes ani { to { transform: rotate3d(5, 12, 13, 360deg); } }

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


TL; DR

Просто дай мне чертово демо!Хорошо, вот оно:

демонстрация простого вращающегося куба


И еще несколько демонстраций, которые я недавно сделал и которые показывают, как создавать другие, немного большесложные трехмерные фигуры:

квадратная антипризма

кубоктаэдр

ромбикубоктаэдр

ромбический додекаэдр

октаэдр

усеченный куб

3 голосов
/ 22 марта 2012

Это все css3 и javascript.Просто осмотрите сайт в вашем любимом инспекторе, покопайтесь в домике, и вы увидите что-то вроде

-webkit-perspective: none;
-webkit-perspective-origin: 200px 200px;
-webkit-transform: matrix3d(-0.9386958080415784, -0.197569680458564, 0.2825179663820851, 0, 0, 0.8194947008605812, 0.5730867606754029, 0, -0.34474654452969944, 0.537954139890128, -0.7692562404101148, 0, 0, 0, 0, 1);
-webkit-transform-style: preserve-3d;
-webkit-transition-delay: 0s;
-webkit-transition-duration: 16s;
-webkit-transition-property: all;
-webkit-transition-timing-function: linear;

, сколько вам нужно javascript, зависит от того, как вы хотите его реализовать.Это может быть «много» или «немного».

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

...