Створюємо 3D ефекти CSS при наведенні з використанням jQuery

У статті описано, як з використанням jQuery створити 3D ефекти CSS при наведенні курсору.



Тут можна Переглянути, а тут — Завантажити

У прикладах нижче використовуються мініатюри, які при наведенні курсору буде відображати певну інформацію CSS. Завдяки jQuery при наведенні на зображення, вони з'являтися в згорнутому або зігнутому вигляді. Для цих ефектів буде використовуватися CSS 3D-transforms.

Розмітка HTML

Такий буде розмітка для зменшеною структури:

<div id="grid" class="main">

<div class="view">

<div class="view-back">
<span data-icon="A">566</span>
<span data-icon="B">124</span>
<a href="http://www.flickr.com/photos/ag2r/5439506585/in/photostream">→</a>
</div>

<img src="images/1.jpg" />

</div>

<div class="view">

<!-- ... -->

</div>

<!-- ... -->

</div>


Кожна мініатюра знаходиться в контейнері. Потрібно створити структуру для кожного розділу з контейнера view, використовуючи JavaScript:

<div class="view">

<div class="view-back">
<!-- ... -->
</div>

<div class="slice s1" style="background-image: url(images/1.jpg); ">
<span class="overlay"></span>

<div class="slice s2" style="background-image: url(images/1.jpg); ">
<span class="overlay"></span>

<div class="slice s3" style="background-image: url(images/1.jpg); ">
<span class="overlay"></span>

<div class="slice s4" style="background-image: url(images/1.jpg); ">
<span class="overlay"></span>

<div class="slice s5" style="background-image: url(images/1.jpg); ">
<span class="overlay"></span>
</div><!-- /s5 -->

</div><!-- /s4 -->

</div><!-- /s3 -->

</div><!-- /s2 -->

</div><!-- /s1 -->

</div><!-- /view -->


У кожній частині буде відповідне зображення і оскільки є вкладена структура, ефектом можна буде управляти. Крім того, додасться накладення, яке додасть ефекту більшої реалістичності.

Функція JavaScript буде виглядати так:

$.fn.hoverfold = function( args ) {

this.each( function() {

$( this ).children( '.view' ).each( function() {

var $item = $( this ),
img = $item.children( 'img' ).attr( 'src' ),
struct = '<div class="slice s1">';
struct +='<div class="slice s2">';
struct +='<div class="slice s3">';
struct +='<div class="slice s4">';
struct +='<div class="slice s5">';
struct +='</div>';
struct +='</div>';
struct +='</div>';
struct +='</div>';
struct +='</div>';

var $struct = $( struct );

$item.find( 'img' ).remove().end().append( $struct ).find( 'div.slice' ).css( 'background-image', 'url(' + img + ')' ).prepend( $( '<span class="overlay" ></span>' ) );

} );

});

};


Тепер переходимо до налаштування загальних стилів.

CSS

Визначаємо стиль для контейнера з мініатюрами і додаємо перспективу:

.view {
width: 316px;
height: 216px;
margin: 10px;
float: left;
position: relative;
border: 8px solid #fff;
box-shadow: 1px 1px 2px rgba(0,0,0,0.05);
background: #333;
perspective: 500px;
}


Деяким частинам додамо 3D transitions:


.view .slice{
width: 60px;
height: 100%;
z-index: 100;
transform-style: preserve-3d;
transform-origin: left, center;
transition: transform 150ms ease-in-out;

}


Частина опису, яке відкривається при зсуві зображення, має наступний спосіб:

.view div.view-back{
width: 50%;
height: 100%;
position: absolute;
right: 0;
background: #666;
z-index: 0;
}


Елементи span посилання:

.view-back span {
display: block;
float: right;
padding: 5px 20px 5px;
width: 100%;
text-align: right;
font-size: 16px;
color: rgba(255,255,255,0.6);
}

.view-back span:first-child {
padding-top: 20px;
}

.view-back a {
display: bock;
font-size: 18px;
color: rgba(255,255,255,0.4);
position: absolute;
right: 15px;
bottom: 15px;
border: 2px solid rgba(255,255,255,0.3);
border-radius: 50%;
width: 30px;
height: 30px;
line-height: 22px;
text-align: center;
font-weight: 700;
}

.view-back a:hover {
color: #fff;
border-color: #fff;
}


Для іконки перед елементами span використовується шрифт Fontello. Перш ніж додати атрибут data-icon у span, для виведення використовуємо псевдо-клас :before

.view-back span[data-icon]:before {
content: attr(data-icon);
font-family: 'icons';
color: #aaa;
color: rgba(255,255,255,0.2);
text-shadow: 0 0 1px rgba(255,255,255,0.2);
padding-right: 5px;
}


Всі, крім першої частини, має зрушити вправо (згадуємо про вкладену структуру):

.view .s2, 
.view .s3, 
.view .s4, 
.view .s5 {
transform: translateX(60px);
}


Далі встановлюємо відповідні позиції background для кожної частини фонового зображення:

.view .s1 {
background-position: 0px 0px;
}
.view .s2 {
background-position: -60px 0px;
}
.view .s3 {
background-position: -120px 0px;
}
.view .s4 {
background-position: -180px 0px;
}
.view .s5 {
background-position: -240px 0px;
}


У фоліо за замовчуванням буде непрозорість 0. Додаємо перехід і міняємо рівень непрозорості CSS при наведенні:

.view .overlay {
width: 60px;
height: 100%;
opacity: 0;
position: absolute;
transition: opacity 150ms ease-in-out;
}

.view:hover .overlay {
opacity: 1;
}


Зафіксуємо позицію і додамо z-index для зображення. Також додамо перехід для браузерів, які не підтримують 3D перетворення:

.view img {
position: absolute;
z-index: 0;
transition: left 0.3 s ease-in-out;
}


У випадку, якщо браузер не підтримує 3D властивості, слід завантажити додаткову таблицю стилів fallback.css, з наступним змістом:


.view {
overflow: hidden;
}

.view:hover img {
left: -85px;
}

.view div.view-back {
background: #666;
}


Це змусить зображення переміщатися вліво при наведенні курсору. Подивимося на прикладі.

Приклад

Для цього прикладу потрібно створити ефект складання зображення. Тому скоригуємо значення перспективи і переходів для всіх контейнерів:


.view {
perspective: 1050px;
}

.view div {
transition: all 0.3 s ease-in-out;
}


Друга, третя, четверта і п'ята частини будуть пересунуті і повернені в 3D, створюючи ефект згину:

.view:hover .s2{
transform: translate3d(59px,0,0) rotate3d(0,1,0,-45deg);
}
.view:hover .s3, 
.view:hover .s5{
transform: translate3d(59px,0,0) rotate3d(0,1,0,90 deg);
}
.view:hover .s4{
transform: translate3d(59px,0,0) rotate3d(0,1,0,-90deg);
}


Додаємо градієнти в фоліо для більшої реалістичності:

.view .s2 > .overlay {
background: linear-gradient(right, rgba(0,0,0,0.05) 0%,rgba(0,0,0,0) 100%);
}

.view .s3 > .overlay {
background: linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255, 255, 255, 0.2) 100%);
}

.view .s4 > .overlay {
background: linear-gradient(right, rgba(0,0,0,0.6) 0%,rgba(0,0,0,0.2) 100%);
}

.view .s5 > .overlay {
background: linear-gradient(left, rgba(0,0,0,0.8) 0%,rgba(0,0,0,0) 100%);
}


В деяких деталях мініатюри при наведенні також буде бути пристутніми фоновий градієнт CSS (для моделювання тіні від зображень):


.view div.view-back{
background: linear-gradient(left, #0a0a0a 0%,#666666 100%);
}


Зображення надані Angelo González, з відповідною ліцензією Creative Commons Attribution 2.0 Generic (CC BY 2.0) License.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.