3D эффекты CSS при наведении + jQuery

В этой статье я покажу, как создать захватывающие 3D эффекты CSS при наведении мышью, используя jQuery.

Сложность

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>

Каждая миниатюра находится в контейнере. Структура, которую нам нужно создать для каждого контейнера:

<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, для вывода используем псевдо-класс :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);
}

.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;
}

Добавим переход и поменяем уровень непрозрачности 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 transforms rotate:

.view img {
    position: absolute;
    z-index: 0;
    transition: left 0.3s 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.3s 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,90deg);
}
.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%);
}

Перевод статьи 3D Thumbnail Hover Effects

Тэги: transition3D transform

Вход

Уважаемый пользователь! Мы обнаружили, что вы используете AdBlock и вынуждены скрыть часть материалов на нашем сайте. Siteacademy существует и развивается за счет доходов от рекламы. Просим внести наш сайт в список исключений или отключить Блокировщик рекламы на нашем сайте.