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 &ndash; 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

Читать комменты и комментировать

Добавить комментарий / отзыв



Защитный код
Обновить

3D открывающаяся открытка на CSS3 и jQuery | | 2012-07-25 17:24:16 | | Статьи Web-мастеру | | В данном уроке мы сделаем небольшой компонент с реалистичной имитации работы. Идея заключается в реализации открытки с ручкой, потянув за которую можно раскрыть обложку и прочесть содержание.Будет | РэдЛайн, создание сайта, заказать сайт, разработка сайтов, реклама в Интернете, продвижение, маркетинговые исследования, дизайн студия, веб дизайн, раскрутка сайта, создать сайт компании, сделать сайт, создание сайтов, изготовление сайта, обслуживание сайтов, изготовление сайтов, заказать интернет сайт, создать сайт, изготовить сайт, разработка сайта, web студия, создание веб сайта, поддержка сайта, сайт на заказ, сопровождение сайта, дизайн сайта, сайт под ключ, заказ сайта, реклама сайта, хостинг, регистрация доменов, хабаровск, краснодар, москва, комсомольск |
 
Поделиться с друзьями: