3D открывающаяся открытка на CSS3 и jQuery
В данном уроке мы сделаем небольшой компонент с реалистичной имитации работы. Идея заключается в реализации открытки с ручкой, потянув за которую можно раскрыть обложку и прочесть содержание.
Будет создан круг с ручкой. Круг будет открываться по нажатии кнопки мыши на ручке. При открытии используется 3D эффект переворачивания страниц с помощью трансформаций CSS3 и теней/градиентов.
Разметка HTML
Начнем с разметки. Мы будем использовать несколько элементов div
для формирования эффекта затенения, частей ручки и круга. Будет нужен основной контейнер с классом fc-wrapper, имеет круглую форму. Поверх него будет добавляться покровной слой, который будет делать правую часть круга темнее при открытии. С этого самого низкого круга будет видна только правая часть. Элемент div
с классом fc-handle-pull будет самой правой частью ручки, размещенной за кругом. Для формирования перспективы мы добавим контейнер и в нем добавим упомянутый покровной слой для правой части, а также вторую часть ручки (она будет выглядеть целой, но в действительности состоит из двух частей), которая будет иметь класс fc-handle-out.
Теперь нужно сформировать элемент div
для части, которая будет видима при открытой другой половине. Здесь будет размещаться наше послание. Обратите внимание, что мы также добавляем покровные слои, чтобы сделать анимацию открывания более реалистичной.
Элемент с классом fc-flip содержит переднюю и заднюю части. Задняя часть не будет видна, так как мы вращаем ее на 180 градусов по оси Y. Она будет работать как обратная сторона передней части. Мы добавим последнюю часть часть ручки на переднюю сторону, так как она будет пермещаться при открывании переворачивающегося контейнера.
<div id="fc-wrapper" class="fc-wrapper"> <!-- Самая правая часть ручки --> <div class="fc-handle fc-handle-pull"></div> <div class="fc-perspective"> <!-- Правая часть покрывного слоя будет чуть темнее --> <div class="fc-overlay fc-overlay-reverse"></div> <!-- Средняя часть ручки --> <div class="fc-handle fc-handle-out"><div></div></div> <!-- Внутренняя нижняя часть содерожания --> <div class="fc-bottom"> <div class="fc-bottom-bg"> <div class="fc-content"> <p>Я могу жить с сомнениями, и неопределенностью, и неизветнсотью. Я думаю, что гораздо интереснее жить не зная ответа на вопрос, который может быть ошибочным. <span>Ричард Фейман</span></p> </div> </div> <div class="fc-overlay fc-overlay-solid"></div> </div><!-- //fc-bottom --> <!-- Передняя и задняя части переворачивающейся половны --> <div class="fc-flip"> <div class="fc-front"> <div class="fc-inner"> <div class="fc-overlay fc-overlay-left"></div> <!-- Самая левая часть ручки --> <div class="fc-handle fc-handle-in"><div></div></div> <div class="fc-content"> <h3><span>?</span>Открытие </h3> <p>от Codrops и RUSELLER.COM</p> </div> </div> </div><!-- //fc-front --> <div class="fc-back"> <div class="fc-inner"> <div class="fc-content"> <div class="feynman"> <span>1918 – 1988</span> </div> </div> <div class="fc-overlay fc-overlay-right"></div> </div> </div><!-- //fc-back --> </div><!-- //fc-flip --> </div><!-- //fc-perspective --> </div><!-- //fc-wrapper -->
Итак, у нас есть круглая левая часть и круглая правая часть, которая будет переворачиваться при нажатии на самой правой части ручки.
CSS
Основной контейнер будет иметь ширину и высоту 300 px, и центрируется на странице. Для всех круглых элементов мы будем использовать в качестве текстуры изображение, имитирующей бумагу, которое будет накладываться на фоновый цвет, создавая отличную иллюзию. Контейнер будет иметь круглую форму, которая формируется радиусом рамки 50%:
.fc-wrapper { width: 300px; height: 300px; position: relative; margin: 30px auto 0; background: #846aa7 url(../images/paper.png) repeat center center; border-radius: 50%; box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); }
Теперь займемся частями ручки. Все части ручки будут иметь класс fc-handle:
.fc-handle { position: absolute; top: 50%; right: 0px; width: 80px; height: 30px; margin-top: -15px; background: #775b9d; box-shadow: 0 1px 1px rgba(0,0,0,0.1); }
Следующий класс определяет положение средней части:
.fc-handle-out { right: -65px; width: 65px; }
И самая левая часть:
.fc-handle-in { right: 80px; }
Внутренние элементы имеют две части, которые располагаются поверх круга и служат тенями. Когда ручка вытягивается вправо, тень, которая падает на круг, должна выглядеть как треугольник, который становится тоньше. Мы используем два вращающихся элемента div
с диагональным гардиентом, которые имитируют данный эффект:
.fc-handle div { position: absolute; height: 0px; width: 80px; top: 30px; content: ''; opacity: 0.3; } .fc-handle-in div { background: linear-gradient( 75deg, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 73%, rgba(0,0,0,0.65) 100% ); } .fc-handle-out div { background: linear-gradient( 170deg, rgba(0,0,0,0.65) 0%, rgba(0,0,0,0) 27%, rgba(0,0,0,0) 100% ); }
Следующий псевдо-элемент используется для формирования внутренней тени на средней части:
.fc-handle-out::after { position: absolute; right: 0px; width: 4px; height: 31px; content: ''; background: linear-gradient( to right, rgba(0,0,0,0) 0%, rgba(0,0,0,0.15) 100% ); }
Самая правая часть, то есть та, которая запускает процесс открывания открытки при нажатии кнопки мыши, будет позиционироваться вне круглой формы:
.fc-handle-pull { right: auto; left: 100%; margin-left: 5px; width: 30px; box-shadow: 1px 0 1px rgba(0,0,0,0.1), inset 3px 0 2px rgba(0,0,0,0.2); cursor: pointer; }
Придаем ей объемности с помощью градиента:
.fc-handle-pull::after { content: ''; position: absolute; top: 0px; right: 0px; width: 30px; height: 100%; background: linear-gradient( to right, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 69%, rgba(0,0,0,0.08) 100% ); }
Нижняя часть, которая содержит информацию, будет иметь следующие стили:
.fc-bottom { width: 220px; height: 100%; overflow: hidden; position: absolute; opacity: 0; }
Мы устанавливаем непрозрачность равную 0, так как данная часть не должна быть видимой, когда открытка закрыта. Здесь будет покровной слой, который затеняет данную часть, так что она становится заметной, если ее не спрятать. Обратите внимание на скрытие выступающих частей. Таким образом, элемент со следующим классом будет обрезаться справа.
.fc-bottom-bg { background: #846aa7 url(../images/paper.png) repeat center center; border-radius: 50%; width: 300px; height: 100%; }
Теперь займемся покровными слоями, которые помогают придать реалистичности внешнему виду. Определим общую часть для всех:
.fc-overlay { top: 0px; left: 0px; width: 300px; height: 100%; position: absolute; border-radius: 50%; }
Первый покровной слой будет полупрозрачным. Он будет использоваться для начального затемнения части изображения (как нижняя часть открытки). Когда круг открывается, непрозрачность будет уменьшаться, чтобы проявлять содержание (в открытом состоянии будет видно все):
.fc-overlay-solid { background: rgba(0,0,0,0.6); }
Следующий слой будет использоваться с противоположной целью: он сначала будет невидимым, но по мере открывания открытки он будет проявляться:
.fc-overlay-reverse { background: rgba(0,0,0,0); }
Данный покровной слой будет использоваться для правой части круга, которая будет постепенно открываться.
Два следующих покровных слоя будет иметь полупрозрачные градиенты:
.fc-overlay-left { background: linear-gradient(to right, transparent 27%, rgba(0,0,0,0.30) 80%); opacity: 0.5; } .fc-overlay-right { background: linear-gradient(to left, rgba(0,0,0,0) 0%,rgba(0,0,0,0.30) 100%); opacity: 0.5; }
Один из них будет использоваться для левой части, а другой - для правой. Оба слоя будут использовать переходы для изменения прозрачности.
Следующий контейнер используется для обрезки круга внутри:
.fc-perspective { width: 220px; height: 300px; position: relative; perspective: 1000px; }
А данный контейнер будет вращаться для открытия содержания, прикрытого задней частью. Нужно установить центр трансформации в точку со смещением 200px:
.fc-flip { width: 100%; height: 100%; position: absolute; transform-origin: 220px 0px; }
Передняя и задняя части будут иметь следующие общие стили:
.fc-flip > div { display: block; height: 100%; width: 100%; margin: 0; overflow: hidden; position: absolute; }
Они будут иметь ширину 220px и внутренние элементы будут скрываться.
Задняя часть будет вращаться на -180 градусов в 3D (вокруг оси Y):
.fc-flip .fc-back { transform: rotate3d(0,1,0,-180deg); }
Обратите внимание, что мы не определяем нужные свойства 3D здесь, так как не нужно их повторять для каждого класса. Мы соберем все классы перспективы и определим свойства для них позже.
Внутренняя часть имеет круглую форму и мы определяем для нее бумажную текстуру:
.fc-flip .fc-inner { border-radius: 50%; width: 300px; height: 100%; position: absolute; background: #846aa7 url(../images/paper.png) repeat top right; } .fc-flip .fc-back .fc-inner { margin-left: -80px; background-color: #553c77; box-shadow: inset 2px 0 3px rgba(0,0,0,0.1); }
Задняя часть должна смещаться влево, так что круг будет обрезан с левой стороны.
Теперь определим стили для элементов содержания:
.fc-content { width: 220px; padding: 20px; text-align: right; position: relative; height: 100%; } .fc-back .fc-content { margin-left: 80px; } .fc-bottom-bg .fc-content { padding-top: 40px; } .fc-content p { font-size: 12px; line-height: 22px; font-family: "Montserrat", sans-serif; text-shadow: 0 -1px 1px rgba(255,255,255,0.1); color: #3b2954; padding: 0 0 0 31px; } .fc-flip .fc-front h3, .fc-flip .fc-front p { position: absolute; text-align: right; width: 180px; text-shadow: 0 -1px 1px rgba(255,255,255,0.1); color: #3b2954; } .fc-flip .fc-front h3, .feynman span { font-family: "Montserrat", sans-serif; text-transform: uppercase; font-size: 17px; letter-spacing: 1px; font-weight: normal; } .fc-flip .fc-front h3 { top: 30px; left: 15px; } .feynman { width: 255px; height: 255px; position: absolute; overflow: hidden; top: 50%; left: -55px; border-radius: 50%; box-shadow: 2px 0 3px rgba(0,0,0,0.3); margin-top: -127px; background: transparent url(../images/feynman.png) no-repeat center right; } .feynman span { text-align: center; width: 100px; height: 5px; line-height: 30px; color: #fff; text-shadow: 1px 1px 1px rgba(0,0,0,0.2); bottom: 40px; right: 80px; font-size: 13px; position: absolute; } .fc-flip .fc-front h3 span{ font-size: 40px; } .fc-flip .fc-front p, .fc-bottom-bg .fc-content span { bottom: 50px; left: 15px; font-family: "Dancing Script", Georgia, serif; font-weight: 700; font-size: 22px; } .fc-bottom-bg .fc-content span { font-size: 18px; display: block; color: #fff; padding: 10px; text-shadow: 1px 1px 1px rgba(0,0,0,0.2); transform: rotate(-3deg); }
Собираем все классы, которые нужно трансформировать:
.fc-flip .fc-back .fc-inner, .fc-overlay, .fc-handle, .fc-handle div, .fc-flip, .fc-bottom{ transition: all 0.6s ease-in-out; } .fc-bottom{ transition-delay: 0.6s; }
Следующие свойства нужны для корректной реализации вращения 3D:
.fc-flip, .fc-flip .fc-inner, .fc-handle { transform-style: preserve-3d; } .fc-flip > div, .fc-flip .fc-inner, .fc-flip .fc-front h3, .fc-handle, .fc-handle div, .fc-overlay, .fc-flip .fc-front p, .fc-flip .fc-front span { backface-visibility: hidden; }
Когда мы открываем открытку, основному классу будет присваиваться класс fc-wrapper-open. Который определяет открытое состояние для всех элементов.
Самая левая часть ручки будет обрезаться до 0. Если посмотреть эффект в действии, то заметно, что ручка вытягивается вправо:
.fc-wrapper.fc-wrapper-open .fc-handle-in { width: 0px; }
Диагональные градиенты, которые служат для формирования теней для двух частей ручки, становятся уже:
.fc-wrapper.fc-wrapper-open .fc-handle-in div { height: 180px; } .fc-wrapper.fc-wrapper-open .fc-handle-out div { height: 100px; }
Цвет фона первых двух частей ручки становится темнее:
.fc-wrapper.fc-wrapper-open .fc-handle { background-color: #513a70; }
Правая часть ручки становится шире для имитации вытягивания:
.fc-wrapper.fc-wrapper-open .fc-handle-pull { width: 155px; background: #775b9d; }
Фон задней части содержания становится светлее:
.fc-wrapper.fc-wrapper-open .fc-flip .fc-back .fc-inner { background-color: #846aa7; }
Покровные слои становятся непрозрачными:
.fc-wrapper.fc-wrapper-open .fc-overlay { opacity: 1; }
Первый покровной слой растворяется:
.fc-wrapper.fc-wrapper-open .fc-overlay-solid { background: rgba(0,0,0,0); }
А обратный покровной слой становится темнее:
.fc-wrapper.fc-wrapper-open .fc-overlay-reverse { background: rgba(0,0,0,0.4); }
Нижняя часть становится видимой сразу (удаляем трансформацию здесь, но при закрытии будет использоваться постепенное исчезновение):
.fc-wrapper.fc-wrapper-open .fc-bottom{ opacity: 1; transition: none; }
И определяем вращение контейнера:
.fc-wrapper.fc-wrapper-open .fc-flip { transform: rotate3d(0,1,0,175deg); }
JavaScript
Когда происходит нажатие кнопки мыши на правой части ручки, основному контейнеру присваивается класс fc-wrapper-open. Для открытия и закрытия определяются две функции. Также выполняется поддержка плагина Hammer.js:
$(function() { var $wrapper= $( '#fc-wrapper' ), $handle = $wrapper.children( 'div.fc-handle-pull' ); $handle.on( 'click', function( event ) { ( $handle.data( 'opened' ) ) ? close() : open(); } ); $wrapper.hammer().bind( 'dragend', function( event ) { switch( event.direction ) { case 'right' : open(); break; case 'left' : close(); break; } }); function open() { $wrapper.addClass( 'fc-wrapper-open' ); $handle.data( 'opened', true ); } function close() { $wrapper.removeClass( 'fc-wrapper-open' ); $handle.data( 'opened', false ); } } );
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/Gije6QN6vb4/lessons.php
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-11-26 » Капитан грузового судна, или Как начать использовать Docker в своих проектах
- 2024-11-26 » Обеспечение безопасности ваших веб-приложений с помощью PHP OOP и PDO
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-15 » Перенос сайта на WordPress с одного домена на другой
- 2024-11-08 » OSPanel 6: быстрый старт
- 2024-11-08 » Как установить PhpMyAdmin в Open Server Panel
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
Всегда храни верность своему начальнику - следующий, может быть еще хуже... |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.