Смена фонового изображения на CSS с использованием CSS-анимации
Реализуется автоматическая смена фонового изображения на CSS с использованием @keyframes
и animation
. Рассмотрим базовый пример, где фон меняется каждые 5 секунд:
@keyframes backgroundChange { 0% { background-image: url('image1.jpg'); } 33% { background-image: url('image2.jpg'); } 66% { background-image: url('image3.jpg'); } 100% { background-image: url('image1.jpg'); } } .block { width: 100%; height: 400px; background-size: cover; background-position: center; animation: backgroundChange 15s infinite; }
В этом примере @keyframes
задает этапы смены фонового изображения, а animation
применяет этот эффект к блоку.
Альтернативный метод: градиент и прозрачность
Если менять фоновые изображения напрямую невозможно, можно использовать два наложенных псевдоэлемента ::before
и ::after
, чередуя их прозрачность:
.block { position: relative; width: 100%; height: 400px; overflow: hidden; } .block::before, .block::after { content: ""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-size: cover; background-position: center; transition: opacity 5s; } .block::before { background-image: url('image1.jpg'); animation: fade1 10s infinite; } .block::after { background-image: url('image2.jpg'); animation: fade2 10s infinite; } @keyframes fade1 { 0%, 50% { opacity: 1; } 50.01%, 100% { opacity: 0; } } @keyframes fade2 { 0%, 50% { opacity: 0; } 50.01%, 100% { opacity: 1; } }
Этот метод позволяет создать плавное переключение фона без рывков. Изображения будут плавно меняться каждые 5 секунд.
Динамичное добавление изображений в блок
Не совсем удобно добавлять URL изображения из файла стилей, если понадобится изменить изображение — придётся редактировать файлы темы. Чаще автоматическая смена фонового изображения реализуется с динамично добавляемыми изображениями. Если сайт на WordPress, изображения легче всего добавлять при помощи плагина ACF. Для такого случая используем следующую разметку HTML:
<div class="cb-slideshow_outer"> <ul class="cb-slideshow"> <li> <div>Lorem ipsum dolor sit amet</div> <span style="background-image: url('https://picsum.photos/1024/560?random=1')"></span> </li> <li> <div>Aenean vitae elit a massa dapibus tincidunt</div> <span style="background-image: url('https://picsum.photos/1024/560?random=2')"></span> </li> <li> <div>Etiam efficitur convallis</div> <span style="background-image: url('https://picsum.photos/1024/560?random=3')"></span> </li> <li> <div>Duis ac sapien maximus, tincidunt arcu</div> <span style="background-image: url('https://picsum.photos/1024/560?random=4')"></span> </li> <li> <div>Quisque turpis dui</div> <span style="background-image: url('https://picsum.photos/1024/560?random=5')"></span> </li> <li> <div>Praesent eget convallis eros</div> <span style="background-image: url('https://picsum.photos/1024/560?random=6')"></span> </li> </ul> </div>
И далее стили:
.cb-slideshow_outer { position: relative; width: 100%; } ul.cb-slideshow { list-style-type: none; padding: 0; margin: 0!important; aspect-ratio: 16/9; position: relative; overflow: hidden; width: 100%; } .cb-slideshow::after { height: 100%; left: 0; margin: 0; position: absolute; top: 0; width: 100%; z-index: 0; } .cb-slideshow:after { content: ''; display: block; height: 100%; width: 100%; background: rgba(0,0,0,.3); } .cb-slideshow li span { width: 100%; height: 100%; position: absolute; top: 0; left: 0; color: transparent; background-size: cover; background-position: 50% 50%; background-repeat: no-repeat; opacity: 0; z-index: 0; -webkit-backface-visibility: hidden; -webkit-animation: imageAnimation 36s linear infinite 0s; -moz-animation: imageAnimation 36s linear infinite 0s; -o-animation: imageAnimation 36s linear infinite 0s; animation: imageAnimation 36s linear infinite 0s; } .cb-slideshow li div { z-index: 1000; position: absolute; bottom: rem(10); left: 0; width: 100%; text-align: right; opacity: 0; background-color: rgba(0,0,0,.3); padding: rem(5) rem(20); -webkit-animation: titleAnimation 36s linear infinite 0s; -moz-animation: titleAnimation 36s linear infinite 0s; -o-animation: titleAnimation 36s linear infinite 0s; animation: titleAnimation 36s linear infinite 0s; } .cb-slideshow li:nth-child(2) span, .cb-slideshow li:nth-child(2) div { -webkit-animation-delay: 6s; -moz-animation-delay: 6s; -o-animation-delay: 6s; animation-delay: 6s; } .cb-slideshow li:nth-child(3) span, .cb-slideshow li:nth-child(3) div { -webkit-animation-delay: 12s; -moz-animation-delay: 12s; -o-animation-delay: 12s; animation-delay: 12s; } .cb-slideshow li:nth-child(4) span, .cb-slideshow li:nth-child(4) div { -webkit-animation-delay: 18s; -moz-animation-delay: 18s; -o-animation-delay: 18s; animation-delay: 18s; } .cb-slideshow li:nth-child(5) span, .cb-slideshow li:nth-child(5) div { -webkit-animation-delay: 24s; -moz-animation-delay: 24s; -o-animation-delay: 24s; animation-delay: 24s; } .cb-slideshow li:nth-child(6) span, .cb-slideshow li:nth-child(6) div { -webkit-animation-delay: 30s; -moz-animation-delay: 30s; -o-animation-delay: 30s; animation-delay: 30s; } .cb-slideshow:hover li span, .cb-slideshow:hover div { -webkit-animation-play-state: paused; -moz-animation-play-state: paused; -o-animation-play-state: paused; animation-play-state: paused; } @-webkit-keyframes imageAnimation { 0% { opacity: 0; -webkit-animation-timing-function: ease-in; } 8% { opacity: 1; transform: scale(1.05); -webkit-animation-timing-function: ease-out; } 17% { opacity: 1; transform: scale(1.1); } 25% { opacity: 0; transform: scale(1.1); } 100% { opacity: 0 } } @keyframes imageAnimation { 0% { opacity: 0; animation-timing-function: ease-in; } 8% { opacity: 1; transform: scale(1.05); animation-timing-function: ease-out; } 17% { opacity: 1; transform: scale(1.1); } 25% { opacity: 0; transform: scale(1.1); } 100% { opacity: 0 } } @-webkit-keyframes titleAnimation { 0% { opacity: 0; -webkit-animation-timing-function: ease-in; } 8% { opacity: 1; -webkit-animation-timing-function: ease-out; } 17% { opacity: 1; } 25% { opacity: 0; } 100% { opacity: 0 } } @keyframes titleAnimation { 0% { opacity: 0; animation-timing-function: ease-in; } 8% { opacity: 1; animation-timing-function: ease-out; } 17% { opacity: 1; } 25% { opacity: 0; } 100% { opacity: 0 } }
В этом варианте кода немного больше, но и смотрится он намного эффектнее, особенно при полноэкранном расположении.
Выглядеть автоматическая смена фонового изображения на CSS из представленного кода будет так:
Если возникнет необходимость останавливать анимацию при наведении курсора добавьте к стилям такой код:
.cb-slideshow:hover li span, .cb-slideshow:hover li div { -webkit-animation-play-state: paused; -moz-animation-play-state: paused; -o-animation-play-state: paused; animation-play-state: paused; }
URL изображений измените на свои. Заголовок изображения можно стилями разместить в любом месте в блоке.
Заключение
Автоматическая смена фона на CSS возможна без использования JavaScript. Вариант с @keyframes
подойдет для простых случаев, а метод с ::before
и ::after
обеспечит более плавный переход. Вариант с динамично добавляемыми изображениями позволит не вмешиваться в код стилей при изменении изображений. Все способы удобны для легковесных анимаций, не перегружающих сайт лишним кодом.
Узнайте также как добавить на сайт простую карусель с бесконечной прокруткой на чистом CSS.