CSS3-слайдшоу с эффектом параллакса

На этом уроке мы создадим слайд-шоу с эффектом параллакса при помощи некоторых свойств CSS3. Мы будем использовать радио-кнопки и родственные комбинаторы (sibling combinators) для управления слайдами. Там будет два фона и идея состоит в изменении местоположения фона и положения слайдера с использованием переходов (transitions) для того, чтобы создать эффект параллакса.

Графика используется в демо от: 5Milli (Global Vector Map) и WeGraphics (Free Vector Infographic Kit).

Пожалуйста, обратите внимание: итоговый результат этого урока будет работать как задумано только в браузерах, которые поддерживают соответствующие свойства CSS. Также смотрите пример создания эффекта параллакса при помощи CSS3 и jQuery.

HTML-разметка

Мы свяжем input-элементы с div-ом с классом sp-content с помощью обобщенного родственного комбинатора (general sibling combinator). Для этого мы разместим input-ы на одном уровне в коде, что и блок с классом sp-content. Когда мы кликаем на радио-кнопку мы будем менять цвет фона и его положение (сетка), а также background-position для блока с классом sp-parallax-bg (карта мира). HTML-разметка выглядит следующим образом:

<div class="sp-slideshow">
 
 <input id="button-1" type="radio" name="radio-set" class="sp-selector-1" checked="checked" />
 <label for="button-1" class="button-label-1"></label>
 
 <input id="button-2" type="radio" name="radio-set" class="sp-selector-2" />
 <label for="button-2" class="button-label-2"></label>
 
 <input id="button-3" type="radio" name="radio-set" class="sp-selector-3" />
 <label for="button-3" class="button-label-3"></label>
 
 <input id="button-4" type="radio" name="radio-set" class="sp-selector-4" />
 <label for="button-4" class="button-label-4"></label>
 
 <input id="button-5" type="radio" name="radio-set" class="sp-selector-5" />
 <label for="button-5" class="button-label-5"></label>
 
 <label for="button-1" class="sp-arrow sp-a1"></label>
 <label for="button-2" class="sp-arrow sp-a2"></label>
 <label for="button-3" class="sp-arrow sp-a3"></label>
 <label for="button-4" class="sp-arrow sp-a4"></label>
 <label for="button-5" class="sp-arrow sp-a5"></label>
 
 <div class="sp-content">
 <div class="sp-parallax-bg"></div>
 <ul class="sp-slider clearfix">
 <li><img src="images/image1.png" alt="image01" /></li>
 <li><img src="images/image2.png" alt="image02" /></li>
 <li><img src="images/image3.png" alt="image03" /></li>
 <li><img src="images/image4.png" alt="image04" /></li>
 <li><img src="images/image5.png" alt="image05" /></li>
 </ul>
 </div><!-- sp-content -->
 
</div><!-- sp-slideshow -->

CSS

Мы установим ширину для основного контейнера равную 80% и установим ширину для блоков с классами sp-content и sp-parallax-bg равную 100%. Блок с классом sp-content будет иметь цвет фона и фоновое изображение (сетка), которое мы будем перемещать, когда мы меняем слайд. Блок с классом sp-parallax-bg будет иметь карту мира в качестве фонового изображения, и мы будем также изменять положение фона.

 .sp-slideshow {
 position: relative;
 margin: 10px auto;
 width: 80%;
 max-width: 1000px;
 min-width: 260px;
 height: 460px;
 border: 10px solid #fff;
 border: 10px solid rgba(255,255,255,0.9);
 box-shadow: 0 2px 6px rgba(0,0,0,0.2);
}
 
.sp-content {
 background: #7d7f72 url(../images/grid.png) repeat scroll 0 0;
 position: relative;
 width: 100%;
 height: 100%;
 overflow: hidden;
}
 
.sp-parallax-bg {
 background: url(../images/map.png) repeat-x scroll 0 0;
 background-size: cover;
 position: absolute;
 top: 0;
 left: 0;
 width: 100%;
 height: 100%;
 overflow: hidden;
}

Стили для кнопок и их лэйблов:

 .sp-slideshow input {
 position: absolute;
 bottom: 15px;
 left: 50%;
 width: 9px;
 height: 9px;
 z-index: 1001;
 cursor: pointer;
 opacity: 0;
}
 
.sp-slideshow input + label {
 position: absolute;
 bottom: 15px;
 left: 50%;
 width: 6px;
 height: 6px;
 display: block;
 z-index: 1000;
 border: 3px solid #fff;
 border: 3px solid rgba(255,255,255,0.9);
 border-radius: 50%;
 transition: background-color linear 0.1s;
}
.sp-slideshow input:checked + label {
 background-color: #fff;
 background-color: rgba(255,255,255,0.9);
}
 
.sp-selector-1, .button-label-1 {
 margin-left: -36px;
}
 
.sp-selector-2, .button-label-2 {
 margin-left: -18px;
}
 
.sp-selector-4, .button-label-4 {
 margin-left: 18px;
}
 
.sp-selector-5, .button-label-5 {
 margin-left: 36px;
}

Мы установили прозрачность для кнопок равную 0, так что они не будут видны. Теги label мы сделаем похожими на маленькие круги. Все кнопки и их лэйблы будет позиционироваться абсолютно, и мы будем размещать их рядом друг с другом.

Далее, мы зададим стили для стрелок. Обратите внимание, в мобильных браузерах, при нажатии на лэйбл, соответствующая радио-кнопка может не выбраться. Но в любом случае, вы сможете перемещаться по слайдам используя меню в виде точек, так как мы на самом деле вы кликаете на input-ы, хоть они и скрыты.

Стрелки имеют следующие стили:

 .sp-arrow {
 position: absolute;
 top: 50%;
 width: 28px;
 height: 38px;
 margin-top: -19px;
 display: none;
 opacity: 0.8;
 cursor: pointer;
 z-index: 1000;
 background: transparent url(../images/arrows.png) no-repeat;
 transition: opacity linear 0.3s;
}
.sp-arrow:hover{
 opacity: 1;
}
.sp-arrow:active{
 margin-top: -18px;
}

Теперь давайте определим, когда каждая стрелка показывается. На первом слайде мы, например, не хотим, чтобы показывалась стрелка слева. А на последнем слайде мы не хотим, чтобы показывалась стрелка справа:

 .sp-selector-1:checked ~ .sp-arrow.sp-a2,
.sp-selector-2:checked ~ .sp-arrow.sp-a3,
.sp-selector-3:checked ~ .sp-arrow.sp-a4,
.sp-selector-4:checked ~ .sp-arrow.sp-a5 {
 right: 15px;
 display: block;
 background-position: top right;
}
.sp-selector-2:checked ~ .sp-arrow.sp-a1,
.sp-selector-3:checked ~ .sp-arrow.sp-a2,
.sp-selector-4:checked ~ .sp-arrow.sp-a3,
.sp-selector-5:checked ~ .sp-arrow.sp-a4 {
 left: 15px;
 display: block;
 background-position: top left;
}

Когда выбрана радио-кнопка, для блока с классом sp-content будет изменяться background-position и background-color. Изменение второго параметра займет немного больше времени:

 .sp-slideshow input:checked ~ .sp-content {
 transition: background-position linear 0.6s, background-color linear 0.8s;
}

Блок с картой мира (класс sp-parallax-bg) также будет иметь переход для background-position:

 .sp-slideshow input:checked ~ .sp-content .sp-parallax-bg {
 transition: background-position linear 0.7s;
}

Таким образом, мы можем создать эффект параллакса для фона.

Давайте определим изменения цвета и background-position для блока с классом sp-content:

 input.sp-selector-1:checked ~ .sp-content {
 background-position: 0 0;
 background-color: #727b7f;
}
 
input.sp-selector-2:checked ~ .sp-content {
 background-position: -100px 0;
 background-color: #7f7276;
}
 
input.sp-selector-3:checked ~ .sp-content {
 background-position: -200px 0;
 background-color: #737f72;
}
 
input.sp-selector-4:checked ~ .sp-content {
 background-position: -300px 0;
 background-color: #79727f;
}
 
input.sp-selector-5:checked ~ .sp-content {
 background-position: -400px 0;
 background-color: #7d7f72;
}

... и для блока с классом sp-parallax-bg:

 input.sp-selector-1:checked ~ .sp-content .sp-parallax-bg {
 background-position: 0 0;
}
 
input.sp-selector-2:checked ~ .sp-content .sp-parallax-bg {
 background-position: -200px 0;
}
 
input.sp-selector-3:checked ~ .sp-content .sp-parallax-bg {
 background-position: -400px 0;
}
 
input.sp-selector-4:checked ~ .sp-content .sp-parallax-bg {
 background-position: -600px 0;
}
 
input.sp-selector-5:checked ~ .sp-content .sp-parallax-bg {
 background-position: -800px 0;
}

Неупорядоченный список с классом sp-slider будет иметь ширину 500%. Это потому, что у нас есть 5 слайдов.

 .sp-slider {
 position: relative;
 left: 0;
 width: 500%;
 height: 100%;
 list-style: none;
 margin: 0;
 padding: 0;
 transition: left ease-in 0.8s;
}

Каждый элемент списка представляет собой слайд, и он также будет иметь переход для прозрачности. Мы зададим обоим, слайду и изображению внутри, свойство box-sizing равное “border-box”. Это позволит нам установить padding, и при этом использовать значение 100% для высоты и ширины, не беспокоясь о "переполнении" блока:

 .sp-slider > li {
 color: #fff;
 width: 20%;
 box-sizing: border-box;
 height: 100%;
 padding: 0 60px;
 float: left;
 text-align: center;
 opacity: 0.4;
 transition: opacity ease-in 0.4s 0.8s;
}
.sp-slider > li img{
 box-sizing: border-box;
 display: block;
 margin: 0 auto;
 padding: 40px 0 50px 0;
 max-height: 100%;
 max-width: 100%;
}

Теперь нам нужно установить правильные значения left для каждого выбранного слайда:

 input.sp-selector-1:checked ~ .sp-content .sp-slider {
 left: 0;
}
 
input.sp-selector-2:checked ~ .sp-content .sp-slider {
 left: -100%;
}
 
input.sp-selector-3:checked ~ .sp-content .sp-slider {
 left: -200%;
}
 
input.sp-selector-4:checked ~ .sp-content .sp-slider {
 left: -300%;
}
 
input.sp-selector-5:checked ~ .sp-content .sp-slider {
 left: -400%;
}

Для каждого выбранного слайда установим прозрачность равную 1:

 input.sp-selector-1:checked ~ .sp-content .sp-slider > li:first-child,
input.sp-selector-2:checked ~ .sp-content .sp-slider > li:nth-child(2),
input.sp-selector-3:checked ~ .sp-content .sp-slider > li:nth-child(3),
input.sp-selector-4:checked ~ .sp-content .sp-slider > li:nth-child(4),
input.sp-selector-5:checked ~ .sp-content .sp-slider > li:nth-child(5){
 opacity: 1;
}

Демонстрация

Скачать исходные файлы

Вот и все, надеюсь, вам понравился этот пример!

Перевод статьи с tympanus.net/codrops


Если у Вас возникли вопросы, то для скорейшего получения ответа рекомендуем воспользоваться нашим форумом

    Комментарии  

    #1 Илья 24.03.2014 18:57
    А как сделать больше слайдов? Добавил картинки, кнопки менял css и все такое... но почему то первые 5 работают... остальные нет(

    You have no rights to post comments