Bootstrap: карусель
учимся создавать bootstrap carousel

Сarousel - стандартный JavaScript компонент в составе фронтенд фреймоворка Bootstrap, являющийся удобным инструментом демонстрации баннеров в составе слайдера.
При необходимости изображение в составе баннера может сопровождаться заголовком и описанием.
Содержание
Цели урока
В данном руководстве мы изучим:
- как добавить компонент carousel на страницу,
- научимся использовать дополнительные параметры (options) конфигурирования карусели,
- научимся управлять поведением (behaviour) карусели.
Основы

Так выглядит исходный HTML-код:
<!doctype html>
<html lang="ru">
<head>
<!-- Required meta tags -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<!-- Google fonts -->
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,700&display=swap" rel="stylesheet">
<!-- Custom CSS -->
<link rel="stylesheet" href="css/custom.css">
<title>Bootstrap. Basic carousel</title>
</head>
<body>
<!-- Carousel in a container -->
<div class="container">
<div id="carousel-basic" class="carousel slide" data-ride="carousel">
<!-- Indicators -->
<ol class="carousel-indicators">
<li data-target="carousel-basic" data-slide-to="0" class="active"></li>
<li data-target="carousel-basic" data-slide-to="1"></li>
<li data-target="carousel-basic" data-slide-to="2"></li>
</ol>
<!-- Wrapper -->
<div class="carousel-inner" role="listbox">
<div class="carousel-item active">
<img src="img/carousel_01.jpg" alt="" class="img-fluid">
<div class="carousel-caption">
<h2>Карусель</h2>
<p>это демонстрация возможностей компонента carousel</p>
</div>
</div>
<div class="carousel-item">
<img src="img/carousel_02.jpg" alt="" class="img-fluid">
</div>
<div class="carousel-item">
<img src="img/carousel_03.jpg" alt="" class="img-fluid">
</div>
</div>
<!-- Controls -->
<a class="carousel-control-prev" href="#carousel-basic" role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Назад</span>
</a>
<a class="carousel-control-next" href="#carousel-basic" role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Вперед</span>
</a>
</div>
<!-- Content -->
</div>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
</body>
</html>
Обратите внимание на следующие моменты:
- C помощью CDN мы подключаем файл стилей Bootstrap и минифицированную JavaScript библиотеку Bootstrap,
- JavaScript Bootstrap зависит от jQuery и PopperJS, поэтому не забываем подключить и эти библиотеки, в данном случае тоже с помощью CDN
- Карусель помещаем в блок
.container
. Так как мы хотим, чтобы выводимые изображения занимали всю ширину бутстраповского контейнера, классы.row
или.col-*
использовать нельзя.
Сама карусель, основным элементом которой является div.carousel
, состоит из трех частей:
ol.carousel-indicators
: пагинация (навигация) обычно расположенная в нижней части карусели,div.carousel-inner
: обертка для контента карусели (тело карусели),a.carousel-control-prev
иa.carousel-control-next
: навигация для соседних элементов карусели (или “стрелки”).
Элементы карусели
Чтобы создать карусель с помощью Bootstrap достаточно добавить элементу div
класс .carousel
и присвоить уникальный id, в данном случае id="carousel-basic"
.
Дополнительные параметры карусели можно определять с помощью data-атрибутов.
data-ride="carousel"
включает автопроигрывание.
Итак, основной блок (обертка) карусели имеет такой вид:
<div id="carousel-basic" class="carousel slide" data-ride="carousel">
...
</div>
Индикаторы (carousel-indicators)
Индикаторы - необязательные (опциональные) элементы карусели, заключенные в блок <ol class="carousel-indicators">
. Каждый элемент списка li
в данном блоке должен соответствовать определенному слайду (обычно - изображению) из .carousel-inner
.
Для каждого индикатора li
существуют два обязательных data-атрибута:
data-target
- соответствует id каруселиdata-slide-to
- указатель на порядковый номер слайда, соответствующего определенному индикатору (отсчет начинается с цифры 0 сверху вниз, например: 0 - первый слайд, 1 - второй слайд).
При старте первый элемент li
должен иметь класс .active
:
<li data-target="carousel-basic" data-slide-to="0" class="active"></li>
Тело карусели
Как мы уже говорили ранее, основной контент карусели обернут в блок <div class="carousel-inner">
.
Родительским блоком каждого слайда является <div class="carousel-item">
. Кроме того, у первого слайда должен быть класс .active
. Обычно слайд содержит изображение или изображение с описанием.
Чтобы создать описание (caption), нужно поместить элемент <div class="carousel-caption">
в родительский блок слайда.
<div class="carousel-inner" role="listbox">
<div class="carousel-item active">
<img src="img/carousel_01.jpg" alt="" class="img-fluid">
<div class="carousel-caption">
<h2>Карусель</h2>
<p>это демонстрация возможностей компонента carousel</p>
</div>
</div>
...
</div>
Переход к соседним элементам (prev и next)
Для перехода к следующему или предыдущему слайду, достаточно добавить в карусель два элемента <a>
.
Аттрибут href
обеих ссылок должен содержать id карусели, а data-атрибут data-slide
должен содержать одно из двух значений: prev
- для перехода к предыдущему слайда или next
- для перехода к следующему слайду.
<!-- Controls -->
<a class="carousel-control-prev" href="#carousel-basic" role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Назад</span>
</a>
<a class="carousel-control-next" href="#carousel-basic" role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Вперед</span>
</a>
Дополнительные параметры (options)
В предыдущем разделе мы научились создавать карусель с помощью штатных инструментов Bootstrap. Самое время изучить дополнительные параметры.
interval
- наименвание: interval
- тип данных: number (число)
- значение по умолчанию: 5000
- период смены слайдов, если значение равно 0, автоматической смены слайдов не будет
pause
- наименование: pause
- тип данных: string | null (строка или null)
- значение по умолчанию: “hover”
- если установлено значение “hover”, смена слайдов будет останавливаться в ответ на событие
mouseenter
и продолжаться в ответ на событиеmouseleave
; если установлено значение “null”, остановки смены слайдов не будет
wrap
- наименование: wrap
- тип данных: boolean
- значение по умолчанию: true
- значение “true” определяет бесконечную смену слайдов, “false” - только один цикл смены слайдов: от первого до последнего
keyboard
- наименование: keyboard
- тип данных: boolean
- значение по умолчанию: true
- определяет реакцию карусели на клавиатуру
Дополнительные параметры (опции) можно установить с помощью data-атрибутов карусели или через JavaScript.
Пример определения data-атрибутов:
<div id="carousel-basic" class="carousel slide" data-ride="carousel" data-interval="3000" data-pause="null">
...
</div>
А теперь то же самое с помощью JavaScript:
$('#carousel-basic').carousel({
interval: 3000,
pause: null
})
Как изменить внешний вид и поведение?
Полноэкранная карусель (fullscreen carousel) с описанием центрированным по вертикали
Создание полноэкранного слайдера, с выравниванием сопутствующего текста по центру как по горизонтали, так и по вертикали - пожалуй самый востребованный вариант модификации карусели Bootstrap.
CSS
Для решения поставленной задачи определим высоту элемента: 100 vh. Для минимальной высоты установим значение 600px, чтобы гарантировать адекватный вывод текста на устройствах с небольшими экранами.
Для центрирования текста по вертикали нам пригодится transform: transition(0,-50%);
/* carousel fullscreen */
.carousel-fullscreen .carousel-inner .carousel-item {
height: 100vh;
min-height: 600px;
background-position: center center;
background-repeat: no-repeat;
background-size: cover;
}
/* carousel fullscreen - vertically centered caption */
.carousel-fullscreen .carousel-caption {
top: 50%;
bottom: auto;
-webkit-transform: translate(0, -50%);
-ms-transform: translate(0, -50%);
transform: translate(0, -50%);
}
HTML
Так же потребуется немного изменить HTML-код: вместо <img>
установим изображение фоном для элемента .carousel-item
и уберем обертку .container
:
<div id="carousel-basic-fs" class="carousel slide carousel-fade carousel-fullscreen mb-5" data-ride="carousel">
<!-- Indicators -->
...
<!-- Wrapper -->
<div class="carousel-inner" role="listbox">
<div class="carousel-item active" style="background-image: url('img/carousel_01.jpg');">
<div class="carousel-caption">
<h2>Карусель</h2>
<p>это демонстрация возможностей компонента carousel</p>
</div>
</div>
<div class="carousel-item" style="background-image: url('img/carousel_02.jpg');"></div>
<div class="carousel-item" style="background-image: url('img/carousel_03.jpg');"></div>
</div>
<!-- Controls -->
...
</div>
Затемнение
Для улучшения читабильности текста довольно часто появляется необходимость затемнить слайд. Сделать это довольно легко - достаточно создать дополнительный элемент div.overlay
в блоке <div class="carousel-item">
.
CSS
/* overlay for better readibility of the caption */
.overlay {
position: absolute;
width: 100%;
height: 100%;
background: #000;
opacity: 0.3;
transition: all 0.2s ease-out;
}
HTML
<div class="item">
<div class="overlay"></div>
<div class="carousel-caption">
...
</div>
</div>
Эффекты смены слайдов
Чтобы заменить эффект смены слайдов и заменить slide на fade достаточно добавить карусели класс .carousel-fade
Время смены слайдов
По умолчанию процесс смены слайдов длится 0,6 секунды. Это может быть слишком быстро, особенно когда установлен эффект перехода “fade”, изменить этот показатель можно с помощью свойства transition-duration
.
.carousel .carousel-item {
transition-duration: 1.5s;
}
Так выглядит карусель при использовании только базовых настроек, а так после внесения изменений
Спасибо за внимание.