С помощью CSS3 можно творить удивительные вещи. Например, бесконечное слайдшоу.
Как сделать?
Берем длинное изображение, начальная и конечная части которого идентичны. Затем анимируем изменение положения картинки слева, пока оно не завершит полный цикл (то есть, передвинется достаточно далеко вправо), а затем быстро возвращаем все в исходную позицию и начинаем сначала.
Идея слайдшоу на CSS
Нам нужен только внешний контейнер с относительным позиционированием и скрытием того, что выступает за границы. Также понадобится внутренний контейнер, в котором будет происходить анимация.
<div class="slideshow">
<div class="images">
Изображения слайд шоу размещаются здесь
</div>
</div>
А код CSS будет выглядеть следующим образом:
.slideshow {
position: relative;
overflow: hidden;
}
.images {
background: url(slideshow.jpg);
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 300%;
-webkit-animation: slideshow 10s linear infinite;
-moz-animation: slideshow 10s linear infinite;
}
@-webkit-keyframes slideshow {
0% { left: 0; }
100% { left: -200%; }
}
@moz-keyframes slideshow {
0% { left: 0; }
100% { left: -200%; }
}
Улучшаем производительность кода
Приведенный выше код должен работать нормально, но мы можем улучшить производительность (по крайней мере, в браузерах семейства WebKit / Mobile WebKit) указав браузеру, что мы собираемся использовать 3D трансформации (даже если мы их и не будем применять) и задействуем translateX вместо left.
<strong></strong>.
images {
...
/* Указываем браузеру на то, что нужно использовать GPU */
-webkit-transform: translate3d(0, 0, 0);
}
@-webkit-keyframes moveSlideshow {
0% {
-webkit-transform: translateX(0);
}
100% {
-webkit-transform: translateX(-200%);
}
}
@-moz-keyframes moveSlideshow {
0% {
-moz-transform: translateX(0);
}
100% {
-moz-transform: translateX(-200%);
}
}
Улучшаем интерфейс
Добавим к нашему слайдшоу два эффекта. При наведении курсора мыши на изображение будет:
Очевидный метод ускорения - уменьшение времени анимации:
.slideshow:hover .images {
-webkit-animation-duration: 5s;
-moz-animation-duration: 5s;
}
Но такой метод приведет к появлению рывков! Изменяя время анимации мы устанавливаем новую временную шкалу для процесса изменения свойств. Браузер воспринимает новые значения и перескакивает на них немедленно. Получается не плавное ускорение, а рывок.
Будем использовать концепцию "ускорения". Если установить два слайдшоу, одно поверх другого, и каждое движется со своей скоростью, а затем скрывать/ показывать самое быстрое при наведении курсора мыши, то получится отличный эффект ускорения. Мы будем использовать трансформации, чтобы сделать переход плавным.
<div class="slideshow">
<div class="images-1">
Изображения слайд шоу размещаются здесь
</div>
<div class="images-2">
</div>
</div>
А CSS код будет следующим:
.slideshow > div {
...
-moz-transition: opacity 0.5s ease-out;
-o-transition: opacity 0.5s ease-out;
-webkit-transition: opacity 0.5s ease-out;
-ms-transition: opacity 0.5s ease-out;
/* Медленная часть*/
-webkit-animation: moveSlideshow 60s linear infinite;
-moz-animation: moveSlideshow 60s linear infinite;
...
}
.images-1 {
/* Быстрая часть*/
-webkit-animation: moveSlideshow 20s linear infinite;
-moz-animation: moveSlideshow 20s linear infinite;
}
.slideshow:hover .images-2 {
opacity: 0;
}
Черно-белый медленный вариант будет размещаться сверху, а цветной быстрый - снизу. Для сокращения числа запросов HTTP поместим оба варианта в один файл и будем только сдвигать позицию фона.
.images-1 {
/* Спрайт */
background-position: 0 200px;
...
}