Приветствую вас вновь на моем блоге. Сегодня в css благодаря новым селекторам появилась возможность делать слайдер без скриптов. Итак, в этой статье я покажу вам, как сделать адаптивный слайдер на css3?
План урока
Итак, сегодня я очень подробно покажу вам, как создать свой слайдер без скриптов, адаптировать его под любые устройства и легко менять в будущем его внешний вид, а также добавлять новые слайды. Мы сделаем всего 3 слайда, которые будут переключаться вручную при клике на кнопки. Что ж, приступим!
Разметка слайдера
В первую очередь необходимо понять, какой будет разметка. На этом скриншоте вы можете увидеть мой пример разметки, по ней и я буду сегодня работать.
Также я продублирую все это кодом, чтобы вы могли скопировать и вставить себе.
Первым делом нужно создать кнопки переключатели слайдов. Поскольку слайда будет три, то столько же нужно и кнопок:
<input type="radio" name="slides" id="point1" checked> <input type="radio" name="slides" id="point2"> <input type="radio" name="slides" id="point3">
Каждая получает свой, уникальный идентификатор, а одна выбрана по умолчанию.
Далее нужно создать сам слайдер и слайды для него. Сразу скажу, в качестве изображений я выбрал 3 автомобиля, именно поэтому классы начинаются на auto.
<div class="slider"> <div class="slides auto1"></div> <div class="slides auto2"></div> <div class="slides auto3"></div> </div>
Последний кусок кода, который нам нужен. Он выводит подписи к кнопкам, но на самом деле мы используем их для того, чтобы скрыть кнопки по умолчанию (радио кнопки не оформляются через стили) и вместо них поставить эти блоки-подписи, которые можно оформить. Именно они и будут служить кнопками-переключателями, а связка с radio-кнопками делается через специальный атрибут for
.
<div class="control"> <label for="point1"></label> <label for="point2"></label> <label for="point3"></label> </div>
А теперь весь этот код нужно обернуть в один общий контейнер. Пусть это будет блок с классом wrap
.
Начинаем создавать слайдер — первоначальные стили для страницы
Итак, для начала мы зададим общие стили, которые помогут сбросить все отступы по умолчанию, а заодно и сделать так, чтобы внутренние отступы и рамки учитывались в ширине элементов. Это делается так:
* {
margin: 0;
padding: 0;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-o-box-sizing: border-box;
box-sizing: border-box;
}
К слову, *
— означает все селекторы. То есть такой универсальный и глобальный селектор.
Оформляем контейнер. Именно сам блок, который содержит в себе все 3 наши важные части — кнопки, слайды и подписи.
.wrap {
height: 350px;
margin: 0 auto;
position: relative;
width: 600px;
}
Ширину и высоту вы можете выставлять ЛЮБУЮ, в зависимости от того, каких размеров будут ваши фотографии для слайдов. Я заранее обрезал фотографии до размеров 600 на 350 пикселей, поэтому и указываю такие размеры. Margin: 0 auto
выравняет контейнер ровно по центру страницы, а относительное позиционирование позволит точно разместить кнопки в самом контейнере позднее.
Оформляем слайдер и слайды
Вначале вот такие стили:
.slider {
background-color: #999;
height: inherit;
overflow: hidden;
position: relative;
width: inherit;
}
Укажем слайдеру такие же ширину и высоту, как и общему контейнеру. Также указываем цвет и позиционирование, а свойство overflow: hidden
обрезает все, что не попадает в блок.
Следующим делом нужно оформить сами слайды:
.slides {
height: inherit;
opacity: 0;
position: absolute;
width: inherit;
z-index: 0;
}
.auto1 { background-image: url(bmw.jpg); }
.auto2 { background-image: url(audi.jpg); }
.auto3 { background-image: url(porshe.jpg); }
Также указываем ширину и высоту как и у слайда. Значение inherit
позволяет наследовать значение родительского блока. С помощью свойств z-index
и opacity
мы сделаем наши картинки невидимыми. Ниже мы четко прописываем фоновые изображения.
Пока что мы ничего не увидим, только серый фон, потому что наши изображения скрыты.
Оформляем кнопки переключатели
Теперь нужно убрать стандартные радио-кнопки и вместо них стилизовать подписи.
.wrap > input {
display: none;
}
Убираем радио-кнопки.
.wrap .control {
position: absolute;
margin-left: -50px;
left: 50%;
}
С помощью этих стилей мы отцентрируем блок с кнопками по центру.
.wrap label {
cursor: pointer;
display: inline-block;
height: 25px;
margin: 10px;
position: relative;
width: 25px;
border: 2px solid grey;
border-radius: 30%/10px;
}
Эти стили делают очень важное дело — они позволяют нам оформить кнопки. Нужно задать размеры кнопок, установить для них блочно-строчный тип, отступы и серую рамку. Еще можно добавить скругление углов.
Теперь у нас есть три кнопки по центру ниже слайдов, это просто серые рамки. Давайте сделаем так, чтобы при клике по кнопке в ней появлялось какое-нибудь изображение, свидетельствующее о том, что кнопка активна в данный момент. Кстати, такой же прием, только с чекбоксами, я показываю в этой статье.
Поскольку мы с вами переключаем изображения автомобилей, я нашел в сети иконку руля, уменьшил ее до размеров примерно 20 на 20. Теперь дело замалым — добавлять фоновое изображение кнопке, если на нее кликнули.
#point1:checked ~ .control label:nth-of-type(1),
#point2:checked ~ .control label:nth-of-type(2),
#point3:checked ~ .control label:nth-of-type(3) {
background: url(wheel.png) no-repeat 50% 50%;
}
Это делается с помощью таких селекторов. Что они делают? По сути, это сложный селектор, в нем записано целое условие. Это чем-то похоже на программирование. Он обозначает следующее: если радио-кнопка выбрана, то нужно применить стиль к подписи, которая идет где-то дальше в разметке. Теперь при клике на кнопки у них внутри появляется изображение руля!
Самый важный этап — заставляем работать переключение!
На самом деле нам осталось сделать совсем чуть-чуть. А именно, сделать так, чтобы вместо серой области в слайдере появились изображения с автомобилями, которые бы успешно перелистывались. Для этого нужно применить еще одни сложные селекторы:
#point1:checked ~ .slider > .auto1,
#point2:checked ~ .slider > .auto2,
#point3:checked ~ .slider > .auto3 {
opacity: 1;
z-index: 1;
}
Что происходит? Сейчас, если вы попробуете слайдер в действии, он будет полностью рабочим. Этими селекторами мы указываем следующее: если нажата радио-кнопка, сделай видимым нужный слайд, который лежит где-то дальше в html-коде (дальше радио-кнопок).
Таким образом, при клике на первую кнопку, нам показывается автомобиль BMW, при клике на вторую — Audi, при клике на третью — Porshe. А еще все это время при переключении иконка руля появляется в той кнопке, слайд для которой активен.
Итак, мы сделали слайдер. Осталось его адаптировать.
Адаптируем слайдер под просмотр на мобильных устройствах
Пока наш слайдер имеет фиксированную ширину в 600 пикселей. Соответственно, на экранах меньше этой ширины начнут возникать проблемы. В частности, появится горизонтальная полоса прокрутки. Чтобы этого избежать, нам совсем чуть-чуть нужно подправить уже написанный код. Вот что нужно изменить:
- Для блока
wrap
, то есть главного контейнера, задать неwidth
, аmax-width: 600px
. Это позволит контейнеру сжиматься, если окно становиться меньше по ширине. - Слайдеру (
slider
) необходимо прописатьwidth: 100%;
- У слайдов (
slides
) ничего не изменяем.
Итого все изменения можно увидеть в этом коде:
.wrap{
max-width: 600px;
}
.slider{
width: 100%;
}
Отлично, теперь осталось прописать пару медиа-запросов, чтобы сделать слайдер полностью адаптивным, а также масштабировать изображения под новые экраны. Экспериментальным путем я выяснил, что картинка-слайд начинает не помещаться на экране примерно при ширине окна в 600 пикселей. Значит, примерно на этом участке и нужно сделать изменение стилей. Для этого напишем первый медиа-запрос.
Кстати, подробно о медиа-запросах и их применении я написал в этой статье. Советую ознакомиться с ней тем, у кого нет никакого представления об адаптивном дизайне.
Соответственно, чтобы на ширине 650 пикселей и меньше все отображалось хорошо, я предлагаю такое изменение стилей:
@media screen and (max-width: 650px){
.wrap{
max-width: 480px;
height: 280px;
}
.slides{
background-size: cover;
}
}
Ширина самого слайдера уменьшится, также уменьшится и высота. Для самих слайдов мы прописали свойство, которое масштабирует изображения так, чтобы они сохраняя свои пропорции полностью помещались в слайдер, не обрезаясь при этом.
Отлично, теперь вы можете проверить и убедиться, что при ширине менее 650 пикселей слайдер трансформируется и выглядит хорошо, не обрезая картинку.
Последняя точка — ширина примерно в 400 пикселей. На ней наша картинка опять начинает не помещаться и нужно предпринимать меры. Для этого напишу еще один медиа-запрос:
@media screen and (max-width: 400px){
.wrap{
max-width: 320px;
height: 180px;
}
.slides{
background-size: cover;
}
}
Все то же самое, только вновь уменьшаем ширину и высоту контейнера. Отлично, теперь наш слайдер полностью адаптивный! Даже на мобильном телефоне с шириной 320 пикселей он будет смотреться отлично. Впрочем, смотрите сами:
Благодаря медиа-запросам изображения пропорционально уменьшаются, сохраняя свои пропорции.
Добавляем слайдеру эффекты при переходах
Ну и бонус В этой статье вы можете увидеть пару эффектов, которые можно реализовывать при наведении на блоки. Так вот, достаточно выбрать любой из них, и прописать его слайдам (
.slides
), а при появлении изображения отменять действие эффекта. Чтобы увидеть результат, вам нужно обязательно задать слайдам свойство transition
, чтобы переходы были плавными. Пример эффекта:
.slides{
transform: rotate(50deg);
transition: 1s;
}
Теперь достаточно селектору, который делает слайд видимым, прописать отмену трансформации:
#point1:checked ~ .slider > .auto1{
transform: none;
}
И так сделать для всех слайдов. Соответственно, изначально изображение будет повернуто и будет невидимо, а при его появление будет возникать эффект плавного возвращения в исходное положение. Соответственно, вы можете придумать свои эффекты. Что ж, слайдер мы сделали, на этом у меня все. Если у вас есть вопросы, жду в комментариях.
Дополнение — как сделать так, чтобы при клике по слайду происходил переход по привязанной к слайду ссылке?
Иными словами, сейчас у нас просто картинки, а как сделать их кликабельными. Для этого у вас уже должен быть готовый слайдер по этому уроку. Далее вам в html-коде нужно найти кусок, отвечающий за сами слайды. Вот он на скриншоте:
Как видите, я вставил внутрь первого и второго слайда ссылки. Итак, при клике на первый слайд произойдет переход на Гугл, при клике на второй — на Яндекс. Хочу отметить, что ссылка будет открываться в этом же окне, то есть текущая страница со слайдером в таком случае исчезнет. Если вам нужно открывать ссылки со слайдов в новом окне, в каждый тег <a>
необходимо добавить атрибут target = "_blank".
Но это не все, что нужно сделать! Сейчас еще ничего не работает, чтобы картинки стали кликабельны, нужно добавить в css вот что:
.slides a{
display: block;
width: 100%;
height: 100%;
}
То есть для всех слайдов делаем ссылку блочным элементом, и указываем ей ширину и высоту 100%, чтобы она занимала все пространство картинки. Теперь все должно работать, можете проверить. Просто замените адреса в ссылках и можно пользоваться. Надеюсь, объяснил максимально понятно.
А объединить автоматический и ручной слайдеры возможно?