Слайдер на CSS3
Сегодня мы с Вами попробуем сделать слайдер на CSS3. Еще несколько лет назад такое было попросту невозможно, сегодня же это можно сделать абсолютно без помощи javascript. В общем, приступим.
Исходный материал
В качестве рабочих изображений для примеров будут использованы картинки из папки img/, а именно: loko.png, mag.png, ska.png, su.png, tor.png, tra.png
Размер каждого изображения 200*200px.
В своей работе вы можете использовать любые изображения.
Во всех примерах сдайдер будет состоять из трёх слайдов.
Разметка
Прежде всего нам необходим главный контейнер, в котором будет находится сам слайдер и панель управления.
<article class="wrapSlider">
...
</article>
Всю остальную разметку, которая будет показана в примерах, нужно добавлять в него(в главный контейнер).
Далее создаём три radiobutton
и отмечаем одного из них как checked
<input type="radio" name="Pointers" id="pnt1" checked>
<input type="radio" name="Pointers" id="pnt2">
<input type="radio" name="Pointers" id="pnt2">
Обратите внимание все radiobutton
имеют одинаковое имя, но разные идентификаторы.
Чуть позже добавим к ним подписи, а сейчас добавим блок для хранения самих слайдов.
<div class="listSlides">
<div class="slides img1"></div>
<div class="slides img2"></div>
<div class="slides img2"></div>
</div>
Теперь в отдельном блоке создадим три подписи к кнопкам, но в данном случае они будут служить нам для другого.
С помощью атрибута for
связываем каждую подпись с одной из кнопок, это позволит нам красиво оформить их. Не сами радиокнопки, потому что на них, к сожалению, стили не действуют, а label
. Связка позволяет сделать так, что при клике на подпись автоматически становится выбранной и radiobutton
, что нам и нужно.
<div class="ctrlPanel">
<label class="pnt1"></label>
<label class="pnt2"></label>
<label class="pnt3"></label>
</div>
В итоге получаем - читсую разметку с тремя radiobutton
на странице.
Пример 1. Простой пример. Черновая разметка.
Примеры выполнения работы доступны как ввиде отедельных страниц(папака example/
), так и ввиде блоков iframe
на стороний ресурс(https://jsfiddle.net/). Блок iframe
содержит три вкладки: HTML, CSS, Result. В котрых вы можете посмотреть разметку, стили и результат примера.
Добавление стилей
Создаём стиль для общего контейнера. Тут не должно быть сложностей.
.wrapSlider {
width: 400px;
height: 250px;
margin: auto;
padding: 10px;
text-align: center;
border: thin solid #777;
border-radius: 5px;
box-shadow: 0px 5px 5px rgba(0,0,0, 0.5);
position: relative;
}
Следующим действием скрываем radiobutton
. На странице сами radiobutton
по большому счёту не нужны. Для дизайна нам больше подходят связаные с ними label
. Для чего тогда radiobutton
? Их главная ценность в том что мы можем узнать кто из них checked
.
.wrapSlider input {
dispaly: none;
}
Далее оформляем блок хранения слайдов и сами слайды. Все слайды по умолчанию скрыты, но если Вы хотите убетиться что они существуют, то закомментируйте строчку display: none
и посмотрите что получиться.
.listSlides {
width: inherit;
height: 220px;
background-color: rgba(200,200,200, 0.2);
overflow: hidden;
text-align: center;
}
.slides {
width: inherit;
height: inherit;
display: none;
}
Сделаем лайблы в виде красивых точек.
.ctrlPanel {
width: inherit;
height: 20px;
position: absolute;
bottom: 10px;
}
.ctrlPanel label {
width: 10px;
height: 10px;
display: inline-block;
border-radius: 50%;
border: 2px solid #aaa;
box-shadow: 0px 0px 2px rgba(0,0,0, 0.3);
}
Наш слайдер почти готов. Осталось самоего главное создать переключение слайдов.
Пример 2. Общий дизайн есть. Но нет переключения слайдов
Примеры выполнения работы доступны как ввиде отедельных страниц(папака example/
), так и ввиде блоков iframe
на стороний ресурс(https://jsfiddle.net/). Блок iframe
содержит три вкладки: HTML, CSS, Result. В котрых вы можете посмотреть разметку, стили и результат примера.
"Оформление переключателя"
На данном этапе у нас фактически есть пустой(в том смысле, что он ничего не показывает) слайдер с тремя полыми точками. Для начала сделаем так чтобы они закрашивались при нажатии на них(не путайте с псевдоклассом :hover
).
#pnt1:checked ~ .ctrlPanel label:nth-of-type(1),
#pnt2:checked ~ .ctrlPanel label:nth-of-type(2),
#pnt3:checked ~ .ctrlPanel label:nth-of-type(3) {
background-color: rgba(200,30,40, 0.4);
}
Данная запись трактуется следующим образом: если выбран(или по другому checked
) #pnt1
, то во всех последующих панелий упраления .ctrlPanel
, а посколько она одна, то взять в ней первый элемент(:nth-of-type(1)
) с типом label
и применить к нему свойство background-color
.
Аналогично запись трактуется и для #pnt2
и #pnt3
.
Добавление переключателя слайдов происходит практически аналогично предыдущему примеру.
#pnt1:checked ~ .listSlides > .img1 ,
#pnt2:checked ~ .listSlides > .img2,
#pnt3:checked ~ .listSlides > .img3 {
display: block;
}
Если выбран #pnt1
, то во всех последующих блоках хранения слайдов .listSlides
, а посколько он один, то в нём ко всем прямым потомкам с классом .img1
применить свойство display: block
.
Пример 3. Практически готовый слайдер
Примеры выполнения работы доступны как ввиде отедельных страниц(папака example/
), так и ввиде блоков iframe
на стороний ресурс(https://jsfiddle.net/). Блок iframe
содержит три вкладки: HTML, CSS, Result. В котрых вы можете посмотреть разметку, стили и результат примера.
Добавление перехода
Сейчас у Вас уже есть самый простой слайдер, который будет работать во многих браузерах, но как он работает. Нет плавного перехода. Это не проблема. Воспользуемся свойством transition
. Добавим следующие строки.
.slides {
.....
transform: translate(150px, -50px) rotate(45deg);
opacity: 0;
transition: all .5s;
}
#pnt1:checked ~ .listSlides > .img1 ,
#pnt2:checked ~ .listSlides > .img2,
#pnt3:checked ~ .listSlides > .img3 {
transform: none;
opacity: 1;
}
Пример 4. Готовый слайдер.
Примеры выполнения работы доступны как ввиде отедельных страниц(папака example/
), так и ввиде блоков iframe
на стороний ресурс(https://jsfiddle.net/). Блок iframe
содержит три вкладки: HTML, CSS, Result. В котрых вы можете посмотреть разметку, стили и результат примера.
Ещё один пример. Он похож на предыдущий, но в этом есть переходы.
Анимация
Теперь по сложнее и интереснее. Создание автоматического прехода слайдов. Для данной цели подойдёт свойство animation
.
Из разметки можно удалить блок с панелью управления. Он нам больше не понадобиться.
ВНИМАНИЕ!! Не обязательно создавать анимированый слайдер. Это раздел больше как ознакомительный.
Перед тем как мы начнем работать с анимацией, мы должны разобраться с некоторыми параметрами для того, чтобы получить правильный вид анимации. Oбщая продолжительность нашей анимации - 15 секунд, но мы должны знать, сколько ключевых кадров равны 1 секунде. Итак, давайте рассмотрим серию операций, которые дадут нам точное число ключевых кадров на основе анимируемых изображений. Вот расчеты:
- Общее количество изображений в слайдере - 3
- Продолжительность анимации для каждого изображения - 5 секунд
- Общая продолжительность анимации - 3 изображений × 5 секунд = 15 секунд
- Подсчитаем сколько ключевых кадров равны одной секунде, для этого разделим общее количество ключевых кадров на общую продолжительность анимации: 100 ключ. кадров / 15 сек. = 6.666 ключ. кадра
Теперь мы можем применить CSS анимацию к слайдеру. Мы сможем поставить анимацию на бесконечный цикл, потому что у каждого изображения своя собственная анимация.
.img1 { animation: cycle1 15s linear infinite; }
.img2 { animation: cycle2 15s linear infinite; }
.img3 { animation: cycle3 15s linear infinite; }
После того, как свойства анимации назначены, мы должны использовать ключевые кадры для настройки анимации движения.
@keyframes cycle1 {
0% { opacity: 0.2; transform: scale(0.8);}
6.6% { opacity: 0.7; transform: scale(1); }
13.2% { opacity: 1; transform: scale(1); }
19.8% { opacity: 1; transform: scale(1); }
26.4% { opacity: 1; transform: scale(1); }
33% { opacity: 0.1; transform: scale(0.1);}
39.6% { opacity: 0; transform: scale(0); }
46.2% { opacity: 0; transform: scale(0); }
52.8% { opacity: 0; transform: scale(0); }
59.4% { opacity: 0; transform: scale(0); }
66% { opacity: 0; transform: scale(0); }
72.6% { opacity: 0; transform: scale(0); }
79.2% { opacity: 0; transform: scale(0); }
85.8% { opacity: 0; transform: scale(0); }
92.4% { opacity: 0; transform: scale(0); }
100% { opacity: 0.2; transform: scale(0.8); }
}
Описание ключевых кадров для анимаций cycle2
и cycle3
представлены ниже. Так же Вы можете посмотреть результат работы.