Сегодня мы покажем вам, как создать фото-слайдшоу при помощи только CSS. Идея состоит в использовании фоновых изображений для панелей и анимирование их при нажатии на название. Для навигации мы будем использовать радио-кнопки с лэйблами используя обобщенный родственный комбинатор (the general sibling selector).
Пожалуйста, обратите внимание: результат этого урока будет работать только в браузерах поддерживающих CSS переходы и анимацию.
HTML-разметка
HTML будет состоять из трех основных частей: радио-кнопок с метками, контейнера с панелями и их "ломтиками" для каждого изображения и названия. Контейнер с классом c-bgimg содержит блоки для каждой из панелей, а внутри мы разместим теги span для каждого отдельного изображения. Итак, первая группа будет состоять из четырех "ломтиков", каждый из которых это одно изображение. Изображение будет вставлено как фон в крайней левой позиции. Вторая группа будет иметь еще четыре "ломтика", но при этом позиция фона будет немного смещена, так чтобы была видна следующая часть соответствующего изображения:
<sectionclass="cr-container">
<!-- радио-кнопки и метки --> <inputid="select-img-1"name="radio-set-1"type="radio"class="cr-selector-img-1" checked/> <labelfor="select-img-1"class="cr-label-img-1">1</label>
<!-- названия --> <divclass="cr-titles"> <h3> <span>Serendipity</span> <span>What you've been dreaming of</span> </h3> <h3> <span>Adventure</span> <span>Where the fun begins</span> </h3> <h3> <span>Nature</span> <span>Unforgettable eperiences</span> </h3> <h3> <span>Serenity</span> <span>When silence touches nature</span> </h3> </div>
</section>
Тег H3 для названия будет содержать два тега span, один для основного заголовка и один для подзаголовока.
Теперь перейдем к стилям
CSS
Я опускаю все префиксы браузеров, но вы, конечно, можете найти их в исходных файлах. Мы рассмотрим стили для первого примера.
Первой нашей целью будет сокрытие радио-кнопок при помощи тега label. В веб-браузерах при нажатии на label соответствующий флажок или переключатель автоматически становится выбранным, это мы и используем. Получая ID, мы можем использовать атрибут for = idref тега label, указывающий на соответствующую радио-кнопку.
Во-вторых, мы хотим поместить все фоновые изображения правильно, в-третьих, мы хотим показать соответствующие ломтики изображения и название при нажатии на тег label.
Итак, давайте сначала зададим стили для контейнера. Создадим для него белую рамку с тонкими тенями:
Так как мы хотим использовать обобщенный родственный комбинатор (the general sibling selector) для того, чтобы "достать" правый ломтик изображения и название, мы должны поместить теги label, перед этими контейнерами. Давайте убедимся, что они находятся в верхнем слое (z-index) и сместим их положение немного вниз, добавив верхний отступ равный 350px;
Для того, чтобы создать разделение между панелями мы используем маленькую хитрость. Мы создадим еще один псевдо-элемент для лейбла и растянем его по всей панели. Используя градиент, мы заставим линию "исчезнуть" в верхней части:
Теперь, когда мы уже позаботились о внешнем виде лэйблов, мы можем скрыть input-ы:
.cr-container input{ display:none; }
Всякий раз, когда мы нажимаем на лэйбл, мы выделяем соответствующий input. Теперь мы можем получать соответствующий лэйбл при помощи обобщенного родственного комбинатора (~). Таким образом, мы будем менять цвет "выбраных" лэйблов:
Контейнер для панели будет занимать всю ширину и будет позиционироваться абсолютно. Этот контейнер будет использоваться в дальнейшем для того, чтобы установить фоновое изображение для выбранного пункта. Мы должны сделать это для того, чтобы изображение отображалось по умолчанию. Поэтому мы также добавим некоторые свойства для фона:
Поскольку у нас есть четыре панели/изображений, одна панель будет иметь ширину 150 пикселей (600 разделить на 4). Для панелей установим свойство float:left, а также overflow: hidden, так как мы не хотим, чтобы ломтики были видны, когда мы перелистываем их:
... все, кроме ломтиков с соответствующим фоновым изображением. Эти, будут сдвигаться с -150px до 0px:
.cr-container input.cr-selector-img-1:checked ~ .cr-bgimg div span:nth-child(1), .cr-container input.cr-selector-img-2:checked ~ .cr-bgimg div span:nth-child(2), .cr-container input.cr-selector-img-3:checked ~ .cr-bgimg div span:nth-child(3), .cr-container input.cr-selector-img-4:checked ~ .cr-bgimg div span:nth-child(4) {
transition:left 0.5s ease-in-out;
animation:none; left:0px; z-index:10; }
И последнее, мы хотим задать стили для h3 элементов заголовков. H3 будет иметь переход непрозрачности и, как только мы выбираем соответствующий label/input, непрозрачность изменится с 0 до 1: