От автора: анимация CSS очень интересна; ее красота состоит в том, что с помощью множества простых свойств можно сделать что угодно от элегантного плавного проявления до очень красивых эффектов. Одно из средств CSS, находящееся где-то в промежутке между ними – это эффект переворота CSS, где при этом на обеих сторонах контейнера, как с лицевой, так и изнаночной, имеется контент. Этот учебник покажет вам, как легко и просто создать его.
Краткое примечание: это не первый учебник о подобном эффекте, но все остальные показались мне слишком сложными. Во многие другие статьи добавлены дополнительные стили для кодирования примеров, требующие затем от читателя расшифровки, что из них нужно, а что нет. В данном учебнике этот вопрос опускается, предоставляя вам только необходимые стили; можете украсить любую сторону каждого оборота как вам заблагорассудится.
HTML
Структура HTML для получения ожидаемого вами двустороннего эффекта:
1 2 3 4 5 6 7 8 9 10 |
<div class="flip-container" ontouchstart="this.classList.toggle('hover');"> <div class="flipper"> <div class="front"> <!-- front content --> </div> <div class="back"> <!-- back content --> </div> </div> </div> |
Здесь есть две стороны контента, лицевая «front» и обратная «back», как вы и ожидали, а кроме того, два содержащих элемента с очень специфическими ролями, объясняемыми CSS. Также обратите внимание на фрагмент ontouchstart, который позволяет менять стороны на сенсорных экранах. Естественно, вам следует ввести этот код в отдельный малозаметный блок JavaScript, если хотите.
CSS
Хочу побиться об заклад, что вне обычного вендорного префиксного раздутия кода вы удивитесь, как мало CSS используется:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
/* весь контейнер поддерживает перспективу */ .flip-container { perspective: 1000; } /* переверните сторону при проведении мышью */ .flip-container:hover .flipper, .flip-container.hover .flipper { transform: rotateY(180deg); } .flip-container, .front, .back { width: 320px; height: 480px; } /* здесь находится скорость перевертывания */ .flipper { transition: 0.6s; transform-style: preserve-3d; position: relative; } /* скройте обратную сторону во время переворота */ .front, .back { backface-visibility: hidden; position: absolute; top: 0; left: 0; } /* лицевая сторона размещена над обратной */ .front { z-index: 2; } /* обратная, изначально скрытая сторона */ .back { transform: rotateY(180deg); } |
Вот примерный обзор процесса:
Внешний контейнер устанавливает перспективу всей области анимации
На самом деле переворачивается внутренний контейнер, вращаясь на 180 градусов при проведении мышью над родительским контейнером. Здесь вы, кроме того, контролируете скорость перехода. Изменение вращения на -180 градусов переворачивает элементы в обратном направлении.
Лицевой и обратный элементы расположены абсолютно, поэтому могут «перекрывать» друг друга в одном положении; их backface-visibility скрыто, поэтому обратная сторона переворачиваемых элементов во время анимации не отображается
У лицевого элемента z-index выше, чем у обратного, поэтому можно кодировать лицевой элемент первым, и он все равно отображается сверху
Обратный элемент вращается на 180 градусов, чтобы действовать как вторая сторона.
Вот, в общем, и все! Поместите эту простую структуру в нужное место и назначьте стили каждой стороне по своему вкусу!
Переключатель переворота CSS
Если вы хотите, чтобы элемент переворачивался посредством JavaScript’а только по команде, это можно устроить с помощью простого переключателя класса CSS:
1 2 3 |
.flip-container:hover .flipper, .flip-container.hover .flipper, .flip-container.flip .flipper { transform: rotateY(180deg); } |
При добавлении элементу контейнера класса flip карточка будет переворачиваться с помощью JavaScript – не требуя от пользователя проведения мышью. Комментарий JavaScript типа document.querySelector(«#myCard»).classList.toggle(«flip») проделает этот переворот!
Вертикальный переворот CSS
Выполнить вертикальный переворот немного сложнее – нужно изменить его ось. Исходный код следует переделать, и карточка станет вращаться в другую сторону:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
.vertical.flip-container { position: relative; } .vertical .back { transform: rotateX(180deg); } .vertical.flip-container .flipper { transform-origin: 100% 213.5px; /* половина высоты */ } .vertical.flip-container:hover .flipper { transform: rotateX(-180deg); } |
Вы столкнетесь с одной странностью – потребностью в определении точного преобразования на основе пикселей вместо 50%.
Переворот всегда был классическим типичным примером того, что можно сделать с помощью анимации CSS, и в меньшей степени — 3D CSS-анимации. Лучше всего здесь то, что вовлекается на самом деле совсем мало CSS. Этот эффект очень хорошо подойдет для игр HTML5 и он идеален в качестве отдельного «карточного» эффекта. Для чего бы вы еще предложили его использовать?
Автор: David Walsh
Источник: ttp://davidwalsh.name/
Редакция: Команда webformyself.
Комментарии (1)