Резиновое слайдшоу с эффектом параллакса на CSS3

В данном уроке мы создадим слайдшоу с эффектом параллакса с помощью нескольких свойств CSS3. Идея заключается в перемещении положения двух фоновых изображений при скольжении контейнера со слайдами.

Разметка HTML
Мы будем "связывать" элементы ввода с элементами div, для которых задан класс sp-content, с помощью комбинатора соседних элементов. Поэтому элементы ввода будут располагаться на том же уровне в структуре DOM, что и элементы div с классом sp-content. Когда на элементе ввода нажимают клавишу мыши для фона происходит смена цвета и положения (для маски сетки), а также меняется положение фона для элемента div sp-parallax-bg (карта мира). При имении параметров используются трансформации. Соответствующий слайд выводится перемещением элемента ul sp-slider в правильное положение.

<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%. Элемент div sp-content будет иметь фоновые цвет и изображение, которые будут изменяться при каждом перемещении пункта списка. Элемент div 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, так что они будут невидимы. Метки располагаем под радио кнопками и делаем их в виде маленьких кружков. Все элементы ввода и метки позиционируются абсолютно. Мы размещаем их рядом друг с другом с помощью определения левого поля.

Затем определяем стили для стрелок, которые являются простыми метками с соответствующим атрибутом for. Активация соответствующего элемента ввода нажатием на метке может не работать в мобильных браузерах, но навигация будет осуществляться с помощью нажатия на элементы ввода внизу слайда.

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

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

Когда элемент ввода выбран, элемент div sp-content будет выполнять трансформацию для свойств background-position и background-color. Вторая трансформация будет выполняться немного дольше:

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

Элемент div с фоном в виде карты мира (sp-parallax-bg) также будет выполнять трансформацию свойства background-position:

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

В данном случае мы можем добавить эффект параллакса для фона.

Определим изменение цвета и свойства background-position для элемента div 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;
}

... и для элемента div 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 слайдов. Трансформация будет выполняться для свойства left, которое будет изменяться в зависимости от отмеченного элемента ввода.

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

Каждый пункт списка является слайдом, и для него выполняется трансформация непрозрачности. Для слайда и изображения будет установлено значение “border-box” для свойства box-sizing. Tаким образом, можно использовать отступы и устанавливать значение 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%;
}

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

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

Готово!
Теги:
слайдшоу
Добавлено: 23 Апреля 2018 20:37:38 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...