Адаптивный слайдер без Javascript на CSS3

Опубликовано: 24 апреля 2014 г.
  • слайдер
  • Пример
Работая над книгой о jquery, я столкнулся с тем, что многие мои подписчики просили меня рассказать в ней как на jquery написать скрипт слайдера. Пардон, дорогие друзья! На дворе XXI век и, на наше счастье, нам доступны все прелести CSS3, позволяющие реализовать подобные вещи без единой строчки javascript.

Часть 1.

Для начала, поясню тем, кто не знает что такое слайдер. Слайдер — это определенный ширины блок, занимающий часть веб-страницы, или же всю ее целиком. Основная его особенность в изменяющемся в автоматическом или ручном режиме контенте. В качестве контента могут выступать как графические изображения, так и некий текст.

Конечно, вы можете поинтересоваться: зачем изобретать велосипед, если полно реализаций слайдеров на javascript? Вот мои аргументы:

  1. CSS эффекты работают быстрее. Это хорошо заметно на мобильных устройствах.
  2. Чтобы создать слайдер не требуются навыки программирования.

Итак, для нашего примера, вам нужно четыре изображения, хотя в своем проекте вы можете сделать полоску с таким количеством изображений, какое вам нужно. Единственным условием является то, что все изображения должны быть одинакового размера. Еще, забыл вам сказать, наш слайдер будет адаптивным (да-да, адаптивная верстка, вы не ошиблись) и вы сможете использовать его в любых своих проектах для любых устройств. Но, довольно болтовни, у меня уже руки чешутся написать мега-код. Начнем с HTML:

<div class="slider">
<figure>

    <img src="alladin.jpg" alt>
    <img src="beauty.jpg" alt>
    <img src="mermaid.jpg" alt>
    <img src="mulan.jpg" alt>
    <img src="alladin.jpg" alt>

</figure>
</div>

Я оставил пустым атрибут alt, чтобы сэкономить место, Вы же можете его заполнить сами, исходя из ваших SEO запросов и для информирования пользователей, отключивших в браузере показ картинок. Хочу также обратить ваше внимание на то, что первое изображение (alladin.jpg) будет присутствовать и в конце полосы, что позволит нашему слайдеру прокручиваться циклично без рывков.

Для удобства width составляет 80% окна, а max-width соответствует размеру каждой отдельной фотографии (1000 пикселей в нашем примере), поскольку нам не нужно растянутое изображение:

.slider { width: 80%; max-width: 1000px; }

В нашем коде CSS, ширина figure выражена в процентном отношении к div, в котором она расположена. То есть, если полоса изображений содержит пять фотографий, а div выдает всего одно, ширина figure увеличивается в пять раз, что составляет 500% ширины контейнера div:

.slider figure {

position: relative; width: 500%;

margin: 0; padding: 0; font-size: 0;

}

Параметр font-size: 0 выкачивает из figure весь воздух, удаляя свободное пространство вокруг изображений и между ними. position: relative позволяет легко перемещать figure во время анимации.

Нам нужно поровну разделить фотографии внутри полосы изображений. Формула очень проста: если мы предположим, что ширина figure составляет 100%, каждое изображение должно занимать 1/5 горизонтального пространства:

100% / 5 = 20%

Возникает потребность в использовании следующего CSS правила:

.imagestrip img { width: 20%; height: auto; }

Теперь поменяем свойство overflow для div:

.slider { width: 80%; max-width: 1000px; overflow: hidden }

Наконец, нам надо сделать так, чтобы полоса изображений перемещалась слева направо. Если ширина контейнера div составляет 100%, каждое движение полосы изображений влево будет измеряться в процентных долях этого расстояния:

@keyframes slidy { 
    20% { left: 0%; }
    25% { left: -100%; }
    45% { left: -100%; }
    50% { left: -200%; }
    70% { left: -200%; } 
    75% { left: -300%; }
    95% { left: -300%; }
    100% { left: -400%; } 
}

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

.slider figure {
    position: relative; width: 500%;
    animation: 30s slidy infinite;
    font-size: 0;
    padding: 0;
    margin: 0; 
    left: 0;
}

Часть 2.

Мы сделали мега-крутой слайдер без javascript. А давайте, прежде чем пойти почивать на лаврах, добавим в него кнопки управления. Точнее, не в него (с ним мне уже лень возиться), а создадим новый.

Так, наш HTML код:

<div class="slider slider_count_3">
	<div class="item">
		<img alt="" src="alladin.jpg">
	</div>
	<div class="item">
		<img alt="" src="mulan.jpg">
	</div>
	<div class="item">
		<img alt="" src="beauty.jpg">
	</div>
</div>

Теперь позаботимся об анимации наших слайдов. К сожалению, для разного числа слайдов она будет отличаться:

/* для слайдера из двух слайдов */
@keyframes slider__item-autoplay_count_2 {
    0%{opacity:0;}
    20%{opacity:1;}
    50%{opacity:1;}
    70%{opacity:0;}
    100%{opacity:0;}
}
/* для слайдера из трех слайдов */
@keyframes slider__item-autoplay_count_3 {
    0%{opacity:0;}
    10%{opacity:1;}
    33% {opacity:1;}
    43% {opacity:0;}
    100%{opacity:0;}
}
/* для слайдера из четырех слайдов */
@keyframes slider__item-autoplay_count_4 {
    0%{opacity:0;}
    8% {opacity:1;}
    25% {opacity:1;}
    33% {opacity:0;}
    100%{opacity:0;}
}
/* для слайдера из пяти слайдов */
@keyframes slider__item-autoplay_count_5 {
    0%{opacity:0;}
    7% {opacity:1;}
    20%{opacity:1;}
    27% {opacity:0;}
    100%{opacity:0;}
}

Печально, не так ли? Кроме того, не забудьте, что для Оперы, Хрома, ИЕ, и Мозиллы нужно написать все тоже самое, но с соответствующим префиксом. Теперь напишем код для анимации наших слайдов (здесь и далее будет показан код для трех слайдов. Код для большего числа сайтов Вы можете увидеть в коде примера):

.slider_count_3 .item {
    -moz-animation: slider__item-autoplay_count_3 15s infinite;
    -webkit-animation: slider__item-autoplay_count_3 15s infinite;
    -o-animation: slider__item-autoplay_count_3 15s infinite; 
    animation: slider__item-autoplay_count_3 15s infinite;
}

.item:nth-of-type(2) {
    -moz-animation-delay:5s;
    -webkit-animation-delay:5s;
    -o-animation-delay:5s;
    animation-delay:5s;
}
.item:nth-of-type(3) {
    -moz-animation-delay:10s;
    -webkit-animation-delay:10s;
    -o-animation-delay:10s;
    animation-delay:10s;
}

Как видите, для первой пары нулевое смещение не меняется. Кроме того, смещение не зависит от количества слайдов, поэтому его можно описать один раз для максимального числа слайдов. Теперь сделаем так, чтобы слайды не менялись, когда пользователь навел курсор мыши на наш слайдер:

.slider:hover .item {
    -moz-animation-play-state: paused;
    -webkit-animation-play-state: paused;
    -o-animation-play-state: paused;
    animation-play-state: paused;
}

Наконец, мы с вами добрались до переключения наших слайдов. Как известно, есть целый ряд событий, позволяющих менять свойства элемента при помощи CSS. Для клика мыши нам могут помочь псевдоклассы :focus, :target, или :checked у одного из элементов страницы. Псевдокласс :focus может быть только у одного элемента на страницу, :target засоряет историю браузера и требует наличие тега a; псевдокласс :checked запоминает состояние до ухода со страницы, и, в случае радиокнопок, может быть выбран только у одного элемента в группе. Воспользуемся этим. Вставим перед <div class="item"> следующий HTML код

<input type="radio" id="imagetape1" name="imagetape">
<input type="radio" id="imagetape2" name="imagetape">
<input type="radio" id="imagetape3" name="imagetape">

А после <div class="item">:

<div class="selector_list">
    <label for="selector1">1</label>
    <label for="selector2">2</label>
    <label for="selector3">3</label>
</div>

CSS код

/* Стиль слайдеров в состоянии "не выбран" */
.slider .item ~ .item {
    opacity: 0.0;
}
/* Стиль слайдеров в состоянии "выбран" */
.slider input:nth-of-type(1):checked ~ .item:nth-of-type(1),
.slider input:nth-of-type(2):checked ~ .item:nth-of-type(2),
.slider input:nth-of-type(3):checked ~ .item:nth-of-type(3),
.slider input:nth-of-type(4):checked ~ .item:nth-of-type(4),
.slider input:nth-of-type(5):checked ~ .item:nth-of-type(5) {
    opacity: 1.0;
}

Мы использовали переключение свойства opacity слайда-контейнера с картинкой. Это связано с тем, что в div-контейнер, в отличие от элемента img, можно поместить любую дополнительную информацию (например, название слайда). Конечно, если бы мы пользовались Javascript, мы могли бы воспользоваться атрибутом data. Но мы с вами договорились, помните?)) Для слайдов укажем свойства transition, чтобы переключение происходило плавно, а не рывками.

.slider .item {
    -moz-transition: opacity 0.2s linear; 	
    -webkit-transition: opacity 0.2s linear; 	
    -o-transition: opacity 0.2s linear; 
    transition: opacity 0.2s linear;
}

Остановка анимации всех слайдов и кнопок при выборе любого слайда осуществим при помощи следующего CSS кода:

.slider input:checked ~ .item {
    opacity: 0.0;
    -moz-animation: none;
    -webkit-animation: none;
    -o-animation: none;
    animation: none;
}

Для поддержки некоторых старых браузеров мы не анимируем первый слайд, установив для него opacity : 1.0, но при этом мы поимеем проблему: при плавном переключении двух других слайдов между собой, первый слайд просвечивает. Для ликвидации этого бага устанавливаем задержку transition-delay для всех слайдов, кроме выбранного, а для него сделаем z-index больше, чем у всех остальных слайдов:

.slider .item {
    opacity: 1.0;
    -moz-transition: opacity 0.0s linear 0.2s;
    -webkit-transition: opacity 0.0s linear 0.2s;
    -o-transition: opacity 0.0s linear 0.2s;
    transition: opacity 0.0s linear 0.2s;
}

.slider input:nth-of-type(1):checked ~ .item:nth-of-type(1),
.slider input:nth-of-type(2):checked ~ .item:nth-of-type(2),
.slider input:nth-of-type(3):checked ~ .item:nth-of-type(3),
.slider input:nth-of-type(4):checked ~ .item:nth-of-type(4),
.slider input:nth-of-type(5):checked ~ .item:nth-of-type(5) {
	transition: opacity 0.2s linear;
	-moz-transition: opacity 0.2s linear;
	-webkit-transition: opacity 0.2s linear;
	-o-transition: opacity 0.2s linear;
	z-index: 6;
}

Чтобы слайды не конфликтовали с другими элементами сайта (например, не перекрывали выпадающее меню с z-index менее или равным 6), создаем свой контекст для блока <div class="slider"> путем задания минимально, необходимого для видимости, z-index:

.slider {
    position: relative;
    z-index: 0;
}

Вот собственно говоря и все. Осталось только спозиционировать наши элементы с помощью нижеследующего CSS кода и можно радоваться:

.slider {
    position: relative;
    z-index:0;    
}
.slider input
{
    display: none;
}
.slider label
{
    bottom: 10px;
    display: inline-block;
    z-index: 2;
    width: 26px;
    height: 27px;
    background: #f4f4f5;
    border: 1px solid #e6e6e6;
    border-bottom-color: #bfbfbf;
    border-radius: 4px;
    box-shadow: inset 0 1px 0 #ffffff, 0 1px 2px #000000;
    text-align: center;
    cursor: pointer;
    font: 14px/27px arial, tahoma;
    color: #333;
}
.slider .selector_list
{
    position: absolute;
    bottom: 15px;
    right: 15px;
    z-index: 11;
}	

.slider .item {
    position: relative;
    width:100%;
}

.slider .item ~ .item
{
    position: absolute;
    top: 0px;
    left: 0px;
}

Вот такой адаптивный слайдер без Javascript на CSS3 у вас должен получиться в итоге.

Популярные статьи
2D игра на Unity. Подробное руководство. Часть 1
  • unity
2D игра на Unity. Подробное руководство. Часть 1
Адаптивный слайдер без Javascript на CSS3
  • слайдер
Адаптивный слайдер без Javascript на CSS3
Работа с Unity в 2D
  • unity
Работа с Unity в 2D
2D игра на Unity. Подробное руководство. Часть 3
  • unity
2D игра на Unity. Подробное руководство. Часть 3
2D игра на Unity. Подробное руководство. Часть 4
  • unity
2D игра на Unity. Подробное руководство. Часть 4
2D игра на Unity. Подробное руководство. Часть 5
  • unity
2D игра на Unity. Подробное руководство. Часть 5
2D игра на Unity. Подробное руководство. Часть 6
  • unity
2D игра на Unity. Подробное руководство. Часть 6
Учебник по новому GUI в Unity. Часть 2.
  • unity
Учебник по новому GUI в Unity. Часть 2.
Учебник по новому GUI в Unity. Часть 1.
  • unity
Учебник по новому GUI в Unity. Часть 1.

HTML LESS LESS React
Онлайн журнал для профессиональных веб-дизайнеров и программистов
БлогПлагиныГрафикаИнструменты
CanvasSPAcssjavascriptjqueryphotoshopphpunitywordpress{"fieldValue":[{"image_preview":"","image_demo":"","example":""}],"fieldSettings":{"autoincrement":1}}{"fieldValue":[{"image_preview":"https://cdn-images-1.medium.com/max/800/1*OIBUnA4NokXK14IMR5csTw.jpeg","image_demo":"https://cdn-images-1.medium.com/max/800/1*OIBUnA4NokXK14IMR5csTw.jpeg","example":""}],"fieldSettings":{"autoincrement":1}}Аудио/Видеоаккордеонанимациябазы данныхбраузерные игрыверсткагалереяграфикакартыкнопкименюпараллаксподсказкипопаппрелоадерслайдертаймерформычекбоксыэлементы интерфейса
© 2009-2017 WebSketches.ru