Слайдер на CSS имеет ряд преимуществ над слайдерами на jQuery. Мы отказываемся от громоздких плагинов, благодаря чему повышается скорость загрузки сайта, а использование CSS анимации делает смену слайдов более плавной. Именно поэтому я хочу вас научить как сделать слайдер на CSS3.
Для работы с этим уроком вам нужно иметь общее представление о CSS3 переходах и анимации по ключевым кадрам. Используя эту простую концепцию, мы увидим как сделать слайдер изображений. Пожалуйста, обратите внимание, что эти свойства будут работать только в современных браузерах (в частности IE10+).
Базовые концепции CSS переходов
Обычно, когда вы измените значение CSS, изменение происходит мгновенно. Теперь, благодаря универсальному CSS3 свойству transition, мы можем легко анимировать от старого к новому состоянию.
Мы можем использовать четыре свойства перехода:
- transition-property - определяет CSS свойства, к которым должны быть применены переходы.
- transition-duration - определяет длительность переходов.
- transition-timing-function - определяет, как рассчитываются промежуточные значения перехода. Эффекты от функции времени задержки обычно называют реверсивными функциями.
- transition-delay - определяет когда начинается переход.
Поскольку технология все еще относительно новая, потребуется использовать префиксы для браузеров. Мы будем опускать их в примерах кода в этой статье, но не забудьте включить их в своем коде чтобы ваш слайдер на CSS работал должным образом. Давайте посмотрим, как применить простой переход к ссылке:
a {
color: #000;
transition-property: color;
transition-duration: 0.7s;
transition-timing-function: ease-in;
transition-delay: 0.3s;
}
a:hover {
color: #fff;
}
При назначении анимации к элементу вы также можете использовать сокращенную запись:
a {
color: #000;
transition: color 0.7s ease-in 0.3s;
}
a:hover {
color: #fff;
}
Давайте посмотрим как применять простую анимацию в div.
/* К этим элементам также применяем анимацию */
div {
animation-name: move;
animation-duration: 1s;
animation-timing-function: ease-in-out;
animation-delay: 0.5s;
animation-iteration-count: 2;
animation-direction: alternate;
}
/* Это код анимации */
@keyframes move {
from { transform: translateX(0); }
to { transform: translateX(100px); }
}
Но мы можем использовать сокращенную запись записав все свойства анимации сразу:
div {
animation: move 1s ease-in-out 0.5s 2 alternate;
}
Ключевые кадры для CSS слайдера
Ключевые кадры определяют то, как анимация выглядит на каждом этапе временной шкалы. Ключевые кадры используют процентное значение для определения времени: 0% это начало анимации, а 100% конец. Вы можете также добавить ключевые кадры для промежуточной анимации.
/* Анимация от 0% до 100% */
@keyframes move {
0% { transform: translateX(0); }
100% { transform: translateX(100px); }
}
/* Анимация с промежуточными ключевыми кадрами */
@keyframes move {
0% { transform: translateX(0); }
50% { transform: translateX(20px); }
100% { transform: translateX(100px); }
}
Структура CSS-слайдера
Теперь, когда мы знаем как работают переходы и анимации, давайте посмотрим как создать наш слайдер, используя только CSS3. Этот рисунок показывает как анимация должна работать:
Как видите, наш слайдер - это контейнер, внутри которого отображаются изображения. Анимация здесь очень простая: изображение следует по предварительно определенному пути путем анимации свойства top и меняя свойства z-index и opacity когда изображение возвращается в исходное состояние. Давайте погрузимся в HTML-разметку для создания слайдера.
<div class="container">
<div class="content-slider">
<div class="slider"> <!-- Контейнер слайдера -->
<div id="mask"> <!-- Маска -->
<ul>
<li id="first" class="firstanimation"> <!-- ID для подсказки и класс для анимации -->
<a href="#"> <img src="images/img_1.jpg" alt="Пума"/> </a>
<div class="tooltip"> <h1>Пума</h1> </div>
</li>
...
<li id="fifth" class="fifthanimation">
<a href="#"> <img src="images/img_5.jpg" alt="Солнечные ванны"/> </a>
<div class="tooltip"> <h1>Солнечные ванны</h1> </div>
</li>
</ul>
</div> <!-- Конец маски -->
<div class="progress-bar"></div> <!-- Индикатор прогресса -->
</div> <!-- Конец контейнера слайдера -->
</div>
</div>
HTML-разметка очень проста и SEO дружелюбна. Рассмотрим в деталях, как все работает:
Теперь пришло время для CSS стилей.
CSS стили слайдера
Давайте создадим базовую структуру слайдера. Он будет иметь тот же размер, что и изображение. CSS cвойство border будет полезно для создания рамки вокруг изображения.
/* Структура слайдера */
.slider {
background: #000;
border: 5px solid #eaeaea;
box-shadow: 1px 1px 5px rgba(0,0,0,0.7);
height: 320px;
width: 680px;
margin: 40px auto 0;
overflow: visible;
position: relative;
}
Блок mask скроет все элементы, которые лежат за пределами слайдера; его высота должна быть равна высоте слайдера.
/* Спрячем все */
.mask {
overflow: hidden;
height: 320px;
}
Наконец, чтобы отсортировать список изображений, мы зададим position: absolute
и top: -325px
, так что все изображения будут расположены за пределами слайдера.
/* Список изображений */
.slider ul {
margin: 0;
padding: 0;
position: relative;
}
.slider li {
width: 680px; /* Ширина изображения */
height: 320px; /* Длина изображения */
position: absolute;
top: -325px; /* Исходное положение - вне слайдера */
list-style: none;
}
С помощью этих нескольких строк кода мы создали наш слайдер без javascript, осталось только добавить анимацию.
Ключевые кадры CSS анимации
Прежде чем мы начнем работать с анимацией, мы должны указать некоторые параметры для того, чтобы получить правильный вид анимации. Oбщая продолжительность нашей анимации - 25 секунд, но мы должны знать, сколько ключевых кадров равны 1 секунде. Итак, давайте рассмотрим серию операций, которые дадут нам точное число ключевых кадров на основе анимируемых изображений. Вот расчеты:
- Общее количество изображений в слайдере - 5
- Продолжительность анимации для каждого изображения - 5 секунд
- Общая продолжительность анимации - 5 изображений × 5 секунд = 25 секунд
- Подсчитаем сколько ключевых кадров равны одной секунде, для этого разделим общее количество ключевых кадров на общую продолжительность анимации: 100 ключ. кадров / 25 сек. = 4 ключ. кадра
Теперь мы можем применить CSS анимацию к слайдеру. Мы сможем поставить анимацию на бесконечный цикл, потому что у каждого изображения своя собственная анимация.
.firstanimation {
animation: cycle 25s linear infinite;
}
.secondanimation {
animation: cycletwo 25s linear infinite;
}
.thirdanimation {
animation: cyclethree 25s linear infinite;
}
.fourthanimation {
animation: cyclefour 25s linear infinite;
}
.fifthanimation {
animation: cyclefive 25s linear infinite;
}
После того, как свойства анимации назначены, мы должны использовать ключевые кадры для настройки анимации движения. Также я добавил свойства opacity
и z-index
, чтобы сделать переход от одного изображения к другому более плавным. Первая анимация имеет больше ключевых кадров, чем последняя. Причина этого в том, что когда последнее изображение завершило свою анимацию, первое изображение должно иметь дополнительные ключевые кадры для того, чтобы пользователь не видел перерыва между циклами анимации.
/* Анимация на примере первых двух изображений */
@keyframes cycle {
0% { top: 0px; } /* При запуске слайда первое изображение уже видно */
4% { top: 0px; } /* Исходное положение */
16% { top: 0px; opacity:1; z-index:0; } /* От 4% до 16% = изображение видно 3 секунды */
20% { top: 325px; opacity: 0; z-index: 0; } /* От 16% до 20% = 1 секунда на уход изображения */
21% { top: -325px; opacity: 0; z-index: -1; } /* Вернуться в исходную позицию */
92% { top: -325px; opacity: 0; z-index: 0; }
96% { top: -325px; opacity: 0; } /* От 96% до 100% = 1 секунда на появление изображения */
100%{ top: 0px; opacity: 1; }
}
@keyframes cycletwo {
0% { top: -325px; opacity: 0; } /* Исходное положение */
16% { top: -325px; opacity: 0; }/* Начинает двигаться на эту позицию после 16% */
20% { top: 0px; opacity: 1; }
24% { top: 0px; opacity: 1; } /* От 20% до 24% = 1 секунда на появление изображения */
36% { top: 0px; opacity: 1; z-index: 0; } / * От 24% до 36% = изображение видно 3 секунды * /
40% { top: 325px; opacity: 0; z-index: 0; } /* От 36% до 40% = 1 секунда на уход изображения */
41% { top: -325px; opacity: 0; z-index: -1; } /* Вернуться в исходную позицию */
100%{ top: -325px; opacity: 0; z-index: -1; }
}
Создав анимацию, мы должны добавить прогресс бар для отображения продолжительности каждой анимации.
Индикатор прогресса (прогресс-бар)
Процесс создания анимации индикатора такой же, как и у слайдера. Во-первых, мы создаем сам индикатор:
/* Индикатор прогресса слайдера */
.progress-bar {
position: relative;
top: -5px;
width: 680px;
height: 5px;
background: #000;
animation: fullexpand 25s ease-out infinite;
}
Не бойтесь синтаксиса, описанного ниже: он также задает состояние "from" и "to".
/* CSS3 анимация индикатора прогресса слайдера */
@keyframes fullexpand {
/* В этих ключевых кадрах индикатор находится в неподвижном состоянии */
0%, 20%, 40%, 60%, 80%, 100% { width: 0%; opacity: 0; }
/* В этих ключевых кадрах прогресс-бар начинает оживать */
4%, 24%, 44%, 64%, 84% { width: 0%; opacity: 0.3; }
/* В этих ключевых кадрах индикатор движется вперед в течение 3 секунд */
16%, 36%, 56%, 76%, 96% { width: 100%; opacity: 0.7; }
/* В этих ключевых кадрах прогресс-бар закончил свой путь */
17%, 37%, 57%, 77%, 97% { width: 100%; opacity: 0.3; }
/* В этих ключевых кадрах прогресс-бар исчезнет, а затем цикл возобновится */
18%, 38%, 58%, 78%, 98% { width: 100%; opacity: 0; }
}
CSS3 анимация подсказки слайдера
Слайдер уже почти готов, но давайте добавим несколько деталей, чтобы сделать его более функциональным. Мы добавим подсказки для названий изображений, которые будут видны при наведении.
Вот CSS для всплывающих подсказок:
.tooltip {
background: rgba(0,0,0,0.7);
width: 300px;
height: 60px;
position: relative;
bottom: 75px;
left: -320px;
}
.tooltip h1 {
color: #fff;
font-size: 24px;
font-weight: 300;
line-height: 60px;
padding: 0 0 0 10px;
}
Здесь мы сделали так, что показываются только заголовки изображений, но вы можете сделать то же самое с пользовательским контентом, ссылками и пр.
Мы видели, как применить CSS3 переходы элементов; Теперь давайте сделаем это в подсказках.
.tooltip {
…
transition: all 0.3s ease-in-out;
}
.slider li:hover .tooltip {
left: 0px;
}
Пауза и продолжение анимации слайдера
Давайте разрешим пользователям сделать паузу, чтобы прочитать подсказку или рассмотреть изображения. Для этого мы должны остановить анимацию при наведении курсора мыши на изображение (мы также должны остановить анимацию индикатора прогресса).
.slider: hover li,
.slider:hover .progress-bar {
animation-play-state: paused;
}
Заключение и бонусный CSS3 слайдер)
Наконец, мы достигли конца урока. CSS3 слайдер теперь готов на 100%! Взгляните на демонстрационный пример CSS слайдера без Javascript. Он работает в Firefox 5+, Safari 4+, IE10+ и Google Chrome, а также iPhone и IPad..
Эффект впечатляет, но по общему признанию, это слайдер не очень гибкий. Например, чтобы добавить больше изображений, вам придется редактировать все ключевые кадры. CSS3 имеет большой потенциал, но иногда лучше воспользоваться JavaScript, чем заморачиваться с ключевыми кадрами. А теперь, бонусный слайдер на CSS3, как я и обещал.