Резиновая карусель на CSS
Карусели, несмотря на всю свою ущербность, продолжают отсаватся очень востребованным компонентом на тысячах сайтов. Чаще всего для из создания используется Javascript. В этой статье я попробую описать технику создания отзывчивой (резиновой, responsive) карусели на чистом CSS.
Для начала ДЕМО.
А теперь давайте разберемся как это работает. Для начала создадим структуру будущей карусели.
HTML:
<div> <input type="radio" checked="checked" name="carousel-selector" /> <input type="radio" name="carousel-selector" /> <input type="radio" name="carousel-selector" /> <ul> <li> Текст 1 </li> <li> Текст 2 </li> <li> Текст 3 </li> </ul> <!-- Yandex.RTB R-A-2268186-1 --><div class=inpostad id=yandex_rtb_R-A-2268186-4-10></div> <ul> <li> <label for="slide1"></label> </li> <li> <label for="slide2"></label> </li> <li> <label for="slide3"></label> </li> </ul> </div>
CSS:
. carousel-wrapper { width: 100%; position: relative; padding-bottom: 30%; background-color: #eee; overflow: hidden; }
Параметр padding-bottom: 30%;
задает высоту нашей карусели, в данном случае 30 процентов от ширины.
Радио-баттаны в этом примере предназначены для переключения элементов карусели. Они должны быть невидимыми.
HTML:
<input type="radio" checked="checked" name="carousel-selector" /> <input type="radio" name="carousel-selector" /> <input type="radio" name="carousel-selector" />
CSS:
.carousel-selector { display: none; }
Сами элементы карусели находятся в списке carousel-items
. В этом примере я сделал их всего три, от этого зависят и их параметры. Классы carousel-item-blue
, carousel-item-red
и carousel-item-green
необходимы лишь для стилизации каждого элемента и обязательными не являются. Так же присутствуют анимации, чтобы переключение между элементами выглядело красиво.
HTML:
<ul> <li> Текст 1 </li> <!-- Yandex.RTB R-A-2268186-1 --><div class=inpostad id=yandex_rtb_R-A-2268186-4-25></div> <li> Текст 2 </li> <li> Текст 3 </li> </ul>
CSS:
.carousel-items { margin: 0; padding: 0; list-style: none; display: block; width: 300%; height: 100%; position: absolute; left: 0; top: 0; z-index: 1; transition: left .5s ease-out; -o-transition: left .5s ease-out; -ms-transition: left .5s ease-out; -moz-transition: left .5s ease-out; -webkit-transition: left .5s ease-out; } .carousel-item { width: 33.33333333%; height: 100%; color: white; } .carousel-item-blue { background-color: blue; } .carousel-item-red { background-color: red; } .carousel-item-green { background-color: green; }
В самом конце располагаем наши кнопки переключения слайдов.
HTML:
<ul> <li> <label for="slide1"></label> </li> <li> <label for="slide2"></label> </li> <li> <label for="slide3"></label> </li> </ul>
CSS:
.carousel-labels { margin: 0; padding: 0; list-style: none; display: block; position: absolute; z-index: 2; left: 0; bottom: 0; height: 20px; width: 100%; padding: 10px 0; text-align: center; } .carousel-selector { display: none; } .carousel-label { display: inline-block; } .carousel-label label { width: 20px; height: 20px; border-radius: 10px; background-color: white; display: block; cursor: pointer; }
А теперь подробнее про саму смену слайдов. С помощью CSS-селекторов мы задаем смену позиции для слайдов в зависимости от выбраного радио-баттана: #slide1:checked ~ .carousel-items
CSS:
#slide1:checked ~ .carousel-items { left: 0; } #slide1:checked ~ .carousel-labels .carousel-label:nth-child(1) label { background-color: black; } #slide2:checked ~ .carousel-items { left: -100%; } #slide2:checked ~ .carousel-labels .carousel-label:nth-child(2) label { background-color: black; } #slide3:checked ~ .carousel-items { left: -200%; } #slide3:checked ~ .carousel-labels .carousel-label:nth-child(3) label { background-color: black; }
Еще раз ДЕМО.
Данный пример написан лишь для того, чтобы показать, что многие «модные» вещи можно делать и без Javascript. Многое здесь можно улучшить, но как базис использовать вполне можно.
Карусель. Компоненты · Bootstrap. Версия v4.3.1
Компонент слайд-шоу для цикличного повторения элементов — карусель изображения или текстовые слайды.
Как это работает
«Карусель» — это слайд-шоу для отображения серии содержимого, созданная на основе CSS 3D-трансформаций и немного на JS. Она работает с текстом, изображениями или обычной разметкой. Она также поддерживает кнопки “next/prev”.
В браузерах с поддержкой API видимости страниц элементы карусели не будут сменяться, когда страница невидима пользователю (например, когда вкладка браузера неактивна, или окно браузера «минимизировано» — кнопка «квадратик» слева от крестика «закрыть браузер», и т.д.).
Эффект анимации этого компонента зависит от медиа запроса prefers-reduced-motion
. Смотрите раздел о редукции анимаций.
Пожалуйста, знайте, что вложенные карусели не поддерживаются, а карусели в целом не очень желательны «стандартам доступности».
В итоге, если вы используете карусели BS4, это требует подключения util.js
.
Пример
Карусель не подстраивает автоматически размер содержимого слайдов. Поэтому вам могут понадобиться дополнительные утилиты для придания их содержимому нужного размера.
Класс .active
добавляют к одному из слайдов, иначе карусель не будет видно. Также для внедрения элементов управления необходимо задать уникальный ID элементу класса .carousel
, особенно если у вас много каруселей на одной странице. Элементы управления и индикаторы должны иметь атрибут
(или href
для <a>
), который совпадает с ID элемента класса .carousel
.
Только слайды
Вот пример карусели, где есть только слайды. Заметьте присутствие классов .d-block
и .w-100
, отменяющих дефолтное выравнивание изображений в браузерах у изображений карусели.
PlaceholderFirst slide
PlaceholderSecond slide
PlaceholderThird slide
<div data-ride="carousel"> <div> <div> <img src="..." alt="..."> </div> <div> <img src="..." alt="..."> </div> <div> <img src="..." alt="..."> </div> </div> </div>
С органами управления
Добавляет кнопки prev/next:
PlaceholderFirst slide
PlaceholderSecond slide
PlaceholderThird slide
Previous Next
<div data-ride="carousel"> <div> <div> <img src="..." alt="..."> </div> <div> <img src="..." alt="..."> </div> <div> <img src="..." alt="..."> </div> </div> <a href="#carouselExampleControls" role="button" data-slide="prev"> <span aria-hidden="true"></span> <span>Previous</span> </a> <a href="#carouselExampleControls" role="button" data-slide="next"> <span aria-hidden="true"></span> <span>Next</span> </a> </div>
С индикаторами
Вы также можете добавить индикаторы к карусели, наряду с органами управления.
PlaceholderFirst slide
PlaceholderSecond slide
PlaceholderThird slide
Previous Next
<div data-ride="carousel"> <ol> <li data-target="#carouselExampleIndicators" data-slide-to="0"></li> <li data-target="#carouselExampleIndicators" data-slide-to="1"></li> <li data-target="#carouselExampleIndicators" data-slide-to="2"></li> </ol> <div> <div> <img src="..." alt="..."> </div> <div> <img src="..." alt=". .."> </div> <div> <img src="..." alt="..."> </div> </div> <a href="#carouselExampleIndicators" role="button" data-slide="prev"> <span aria-hidden="true"></span> <span>Previous</span> </a> <a href="#carouselExampleIndicators" role="button" data-slide="next"> <span aria-hidden="true"></span> <span>Next</span> </a> </div>
Требуется начальный активный элемент
Необходимо добавлять класс .active
в один из слайдов, иначе карусель не будет видна.
С надписями
Добавляйте надписи в ваши слайды с помощью добавления элемента класса .carousel-caption
в любой элемент карусели класса .carousel-item
. Надписи легко скрыть на меньших устройствах, используя утилиты отображения. Они спрятаны первоначально с помощью класса . d-none
и показываем их опять на средних устройствах с помощью класса .d-md-block
.
First slide label
Nulla vitae elit libero, a pharetra augue mollis interdum.
PlaceholderSecond slideSecond slide label
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
PlaceholderThird slideThird slide label
Praesent commodo cursus magna, vel scelerisque nisl consectetur.
Previous Next
<div> <div data-ride="carousel"> <ol> <li data-target="#carouselExampleCaptions" data-slide-to="0"></li> <li data-target="#carouselExampleCaptions" data-slide-to="1"></li> <li data-target="#carouselExampleCaptions" data-slide-to="2"></li> </ol> <div> <div> <img src=". .." alt="..."> <div> <h5>First slide label</h5> <p>Nulla vitae elit libero, a pharetra augue mollis interdum.</p> </div> </div> <div> <img src="..." alt="..."> <div> <h5>Second slide label</h5> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> </div> </div> <div> <img src="..." alt="..."> <div> <h5>Third slide label</h5> <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur.</p> </div> </div> </div> <a href="#carouselExampleCaptions" role="button" data-slide="prev"> <span aria-hidden="true"></span> <span>Previous</span> </a> <a href="#carouselExampleCaptions" role="button" data-slide="next"> <span aria-hidden="true"></span> <span>Next</span> </a> </div> </div>
Склейка
Добавьте . carousel-fade
в вашу карусель для анимации слайдов с постепенным переходом на следующий слайд.
PlaceholderFirst slide
PlaceholderSecond slide
PlaceholderThird slide
Previous Next
<div data-ride="carousel"> <div> <div> <img src="..." alt="..."> </div> <div> <img src="..." alt="..."> </div> <div> <img src="..." alt="..."> </div> </div> <a href="#carouselExampleFade" role="button" data-slide="prev"> <span aria-hidden="true"></span> <span>Previous</span> </a> <a href="#carouselExampleFade" role="button" data-slide="next"> <span aria-hidden="true"></span> <span>Next</span> </a> </div>
Индивидуальный интервал
. carousel-item
Добавьте data-interval=""
к элементу .carousel-item
, чтобы изменить время задержки между автоматическим циклическим переходом к следующему элементу.
PlaceholderFirst slide
PlaceholderSecond slide
PlaceholderThird slide
Previous Next
<div data-ride="carousel"> <div> <div data-interval="10000"> <img src="..." alt="..."> </div> <div data-interval="2000"> <img src="..." alt="..."> </div> <div> <img src="..." alt="..."> </div> </div> <a href="#carouselExampleInterval" role="button" data-slide="prev"> <span aria-hidden="true"></span> <span>Previous</span> </a> <a href="#carouselExampleInterval" role="button" data-slide="next"> <span aria-hidden="true"></span> <span>Next</span> </a> </div>
Использование
Через атрибуты
Атрибут data-slide
принимает значения prev
или next
, которые изменяют позицию слайда относительно его текущей позиции. Или используйте data-slide-to
для перехода на слайд с индексом, например, 2: data-slide-to="2"
, индексы слайдов начинаются с 0
.
Атрибут data-ride="carousel"
используется для создания анимации карусели. Его нельзя сочетать с явной инициализацией карусели через JavaScript.
Через JavaScript
Вызывайте карусель вручную:
$('.carousel').carousel()
Параметры
Параметры можно передавать через атрибуты или JavaScript. Для использования атрибутов добавьте название параметра в data-
, например: data-interval=""
.
Имя | Тип | По умолч. | Описание |
---|---|---|---|
interval | число | 5000 | Время задержки между автоматической сменой слайда. Если false – карусель не будет автоматически сменять слайды. |
keyboard | boolean | true | Будет ли карусель реагировать на события клавиатуры. |
pause | строка | boolean | «hover» |
Если стоит Устройства, активируемые касанием: |
ride | строка | false | Автосмена слайдов карусели после первой ручной смены слайда юзером. Если carousel – автосмена включается после загрузки. |
wrap | boolean | true | Должна ли карусель сменяться плавно или дискретно. |
touch | boolean | true | Карусель должна поддерживать взаимодействие влево / вправо на сенсорных устройствах. |
Методы
Асинхронные методы и переходы
Все методы API асинхронны и запускают переход. Они возвращаются функции, вызвавшей их, с началом перехода, но до его конца. Плюс, вызов метода к компоненту, выполняющему переход, будет проигнорирован.
Смотрите нашу документацию по JavaScript.
.carousel(options)
Инициализирует объект object
карусели с установленными параметрами и начинает смену слайдов.
$('. carousel').carousel({ interval: 2000 })
.carousel('cycle')
Сменяет слайды карусели слева направо.
.carousel('pause')
Останавливает смену слайдов.
.carousel(number)
Прокручивает слайды до определенного момента (основано на 0, схоже с рядами). Возвращает значение функции-вызову до того, как элемент-«цель» показан (т.е. до того, как возникает событие slid.bs.carousel
).
.carousel('prev')
Прокручивает к предыдущему слайду. Возвращает значение функции-вызову до того, как элемент-«цель» показан (т.е. до того, как возникает событие slid.bs.carousel
).
.carousel('next')
К следующему слайду. Возвращает значение функции-вызову до того, как элемент-«цель» показан (т.е. до того, как возникает событие slid. bs.carousel
).
.carousel('dispose')
Уничтожает карусель элемента.
События
Карусель в Bootstrap располагает 2-мя событиями для применения функциональности. У обоих событий есть следующие дополнительные свойства:
direction
: Направление, в котором движутся слайды ("left"
или"right"
).relatedTarget
: Элемент DOM, который движется на место «пролистанного» слайда.from
: Индекс текущего слайдаto
: Индекс следующего слайда
Все события карусели запускаются непосредственно в карусель (т.е. в <div>
).
Тип события | Описание |
---|---|
slide.bs.carousel | Это событие запускается немедленно, когда вызван метод slide . |
slid.bs.carousel | Это событие запускается, когда карусель завершила переходы своих слайдов. |
$('#myCarousel').on('slide.bs.carousel', function () { // do something… })
Изменение продолжительности перехода
Длительность перехода .carousel-item
можно изменять в переменной Sass $carousel-transition
перед компиляцией, или обычным CSS (при использовании компилированного CSS). Если применяются множественные переходы, удостоверьтесь, что переход трансформации задан первым (например: transition: transform 2s ease, opacity .5s ease-out
).
15 каруселей CSS
Коллекция бесплатных примеров кода карусели HTML и чистого CSS : адаптивных, горизонтальных и вертикальных . Обновление декабрьской коллекции 2019 года. 6 новых предметов.
- Карусели Bootstrap
- Карусели JavaScript
- Карусели jQuery
- Реагирующие карусели
- Карусели Vue
- Горизонтальные карусели
- Вертикальные карусели
О коде
Переменные CSS 3D-карусель
Совместимые браузеры: Chrome, Edge, Firefox, Opera, Safari
Ответ: нет
Зависимости: —
О коде
Карусель плейлистов — только CSS
Совместимые браузеры: Chrome, Edge, Firefox, Opera, Safari
Ответ: да
Зависимости: —
О коде
Ползунок-карусель только для CSS
Эта карусель создана только с помощью HTML и CSS.
Совместимые браузеры: Chrome, Edge, Firefox, Opera, Safari
Ответ: да
Зависимости: —
О коде
Чистая карусель CSS
Анимированная карусель на чистом CSS.
Совместимые браузеры: Chrome, Edge, Firefox, Opera, Safari
Ответ: да
Зависимости: —
О коде
Карусель
Карусель на чистом CSS с миниатюрами.
Совместимые браузеры: Chrome, Edge, Firefox, Opera, Safari
Ответ: да
Зависимости: —
О коде
Адаптивная скользящая карусель
Pure CSS, отзывчивая скользящая карусель.
Совместимые браузеры: Chrome, Edge, Firefox, Opera, Safari
Ответ: да
Зависимости: —
О коде
Карусель карт CSS-Tricks
Совместимые браузеры: Chrome, Edge, Firefox, Opera, Safari
Ответ: нет
Зависимости: —
О коде
Многонаправленная карусель электронной почты
Карусель типа , которая прокручивается по большому фоновому изображению с помощью направленных стрелок. В неподдерживаемых средах будет отображаться резервное статическое изображение.
О коде
Вращающаяся 3D-карусель
Pure CSS 3D-карусель, которая вращается.
Совместимые браузеры: Chrome, Edge, Firefox, Opera, Safari
Ответ: нет
Зависимости: —
О коде
Бесконечная карусель автовоспроизведения
Полезно для стартовых целевых страниц, где вам нужно отображать партнеров по бренду и другие классные логотипы или что-то еще.
О коде
Чистые карусели CSS
Использование того, как элементы ведут себя в модели DOM, в сочетании с функциями CSS делает реализацию «карусели» на чистом CSS относительно тривиальной.
С код
CSS Carousel с элементами управления с клавиатуры
Совместимые браузеры: Chrome, Edge, Firefox, Opera, Safari
Ответ: да
Зависимости: —
О коде
Очень простая карусель на чистом CSS
Без JavaScript, крошечная разметка, минимум CSS.
Совместимые браузеры: Chrome, Edge, Firefox, Opera, Safari
Ответ: да
Зависимости: —
О коде
Вертикальная карусельная анимация CSS
Бесконечно вращающаяся вертикальная карусельная анимация. Только CSS.
Совместимые браузеры: Chrome, Firefox, Opera, Safari
Ответ: да
Зависимости: —
О коде
Чистая карусель CSS
Базовая карусель с радио.
Совместимые браузеры: Chrome, Edge, Firefox, Opera, Safari
Ответ: нет
Зависимости: —
Как сделать полностью доступную карусель только на CSS | Дженнифер Вьерцох
Нет JavaScript! Никаких плагинов jQuery! 18 октября 2021
Фото Oneisha Lee на UnsplashПрежде всего, что такое карусель? Карусели показывают набор элементов один за другим. Также известны как «слайд-шоу» и «слайдеры». Часто они используются для размещения большего количества контента на веб-сайте, который в противном случае не поместился бы.
«Несмотря на то, что карусели не так эффективны, я почему-то не думаю, что они исчезнут в ближайшее время».
— Брэд Фрост
Поиск недоступных каруселей в Интернете — обычное дело. Более половины каруселей, доступных в Интернете, имеют несколько проблем с доступностью. Часто они недоступны, потому что люди не придают большого значения доступности. Часто это также связано с тем, что существует так много факторов и требований доступности, что некоторые из них упускаются.
В этой статье мы рассмотрим некоторые распространенные проблемы доступности в каруселях. Я также покажу, как построить эту карусель и как я сделал ее более доступной за несколько шагов.
Не все карусели одинаковы с точки зрения реализации и функций. Но некоторые общие факторы идут не так с доступностью. Некоторые из распространенных проблем доступности в каруселях:
- Почти каждая карусель имеет различную структуру. Таким образом, также нет стандартизации для программ чтения с экрана, помогающих ориентироваться.
- Многие пользователи средств чтения с экрана не могут определить, когда их виртуальный курсор входит в карусель или покидает ее. Это приводит к тому, что они не знают, существует ли он вообще и как выйти.
- Очень часто элементы управления в слайд-шоу имеют слишком низкую контрастность или малы по сравнению с содержимым, которое они накладывают. Это затрудняет их использование пользователями.
- Если слайды карусели вращаются, пользователи экрана и клавиатуры могут запутаться. Им сложно понять содержание, которое постоянно меняется впереди. Автоповорот также может вызывать проблемы у пользователей с когнитивными расстройствами.
Для исследования я создал несколько прототипов на трех готовых слайдерах:
- UiKit Slider or Slideshow — Поставляется в комплекте и имеет небольшой вес. Но до этого я использовал только более мелкие вещи из UiKit, такие как макет кладки или аккордеон. Карусель — это уже нечто большее. Кроме того, не предусматривалась клавиатурная навигация и доступ через вкладку.
- Swiper Slider — Эта карусель может многое и позволяет импортировать только ядро swiper и фактические компоненты, которые вам нужны. Эта карусель полностью доступна.
- a11y-slider — a11y-slider полностью построен на JavaScript и его сложно настроить. Но что меня вдохновило, так это возможность полностью пропустить карусель.
Вскоре у меня появилось ощущение, что нам все это не нужно, и я был прав. Мне удалось полностью установить карусель с помощью CSS scroll-snap. Таким образом, я не зависел ни от одного из готовых решений JavaScript.
Шаг 1 — Настройка базовой структуры HTML/CSS
Настройка базовой структуры HTML/CSSШаг 2 — Добавление привязки прокрутки
С помощью привязки прокрутки CSS вы можете зафиксировать элемент в определенном положении во время прокрутки. Это обеспечивает отличный пользовательский опыт при взаимодействии с вашей каруселью.
Scroll-snap уже имеет хороший браузерный дистрибутив.
caniuse.comВсе, что нам нужно для функционирующей карусели, уже находится в этой области:
.slides {
overflow-x: scroll;
тип прокрутки: x обязательно;
поведение прокрутки: гладкое;
}
Давайте посмотрим, что они делают в деталях:
overflow-x: scroll;
прокрутка
Содержимое обрезается по горизонтали в поле заполнения. Браузер решает, будет ли содержимое элемента отображаться с полосами прокрутки или без них.
тип прокрутки: x обязательно;
x
Позволяет привязываться к определенным точкам макета при прокрутке этих точек.
обязательный
В сочетании с обязательным значением это заставляет браузер всегда автоматически прокручивать до ближайшего элемента, когда действие прокрутки завершено.
Добавьте к элементу слайдов следующее:
. slides-item {
scroll-snap-align: start;
}
Давайте посмотрим, что он делает в деталях:
scroll-snap-align: start;
start
При этом мы определяем, что начало каждого слайда отмечает точку, где остановиться при прокрутке.
Шаг 3 — Удаление полосы прокрутки с помощью CSS
Если вы хотите скрыть полосу прокрутки, вы можете добавить следующее. Решение работает очень хорошо. Есть преимущества в том, чтобы держать полосу прокрутки видимой, лично я не нахожу это очень красивым.
// Скрывает полосу прокрутки в FirefoxУдаление полосы прокрутки с помощью CSS
.slides {
scrollbar-width: none;
} // Скрывает полосу прокрутки в браузерах с поддержкой WebKit и Blink
.slides::-webkit-scrollbar {
display: none;
}
Шаг 4. Сделайте карусель доступной
Важным аспектом разработки была доступность. Карусели спорны с точки зрения удобства использования, потому что их контент может быть труднодоступен. И поэтому вы можете улучшить общее удобство использования, обеспечив определенный уровень доступности.
Чтобы сделать карусели более эффективными, следует помнить о некоторых моментах:
- Tabindex
Всеми функциями, включая навигацию между элементами карусели, можно управлять с клавиатуры через «фокус».
Добавьте значение 0 в tabindex, это поместит элемент в порядок навигации по умолчанию. Это позволяет элементам, которые обычно не фокусируются (например,,
иhref
), получить фокус клавиатуры.- Aria-Label
Добавить универсальныйaria-label
(например,aria-label="carousel"
) для элемента-обертки и слайдов, поэтому пользователи средств чтения с экрана точно знают, как настроена карусель и как она работает.
Если метка aria не установлена, элемент HTML использует свое текстовое содержимое для более подробного описания.- Пропустить содержимое
Мы также позволяем программам чтения с экрана пропускать карусель с помощью скрытой ссылки «пропустить» при фокусе клавиатуры. В этом случае небольшое наложение перекрывает карусель и дает возможность перейти к следующему элементу.- Не использовать автовоспроизведение
Если карусель вращается, у пользователей могут возникнуть трудности с чтением содержимого каждого слайда до его изменения. В результате доступ с клавиатуры к каруселям и их содержимому может стать затруднительным или невозможным. Об изменении содержимого часто не сообщается пользователям программ чтения с экрана.- Цветовой контраст
Всегда проверяйте цветовой контраст и размер текста, отображаемого на слайде. Кроме того, чтобы пользователи могли подключаться к элементам управления, отображайте статус для пользователя во время фокусировки или наведения мыши. - Aria-Label