Bootstrap 5 Offcanvas
Offcanvas — это компонент Bootstrap, который позволяет отображать контент в боковой панели, выдвигающейся из одной из сторон экрана. Он похож на модальные окна, но предоставляет более гибкий и ненавязчивый пользовательский опыт. Создайте скрытые боковые панели в своем проекте для навигации, корзин покупок и многого другого.
Как это работает
Offcanvas - это компонент боковой панели, который можно переключать с помощью JavaScript для отображения с левого, правого, верхнего или нижнего края области просмотра. Кнопки или привязки используются в качестве триггеров, которые привязаны к определенным элементам, которые вы переключаете, а data атрибуты используются для вызова JavaScript.
- Offcanvas использует тот же JavaScript-код, что и modals. Концептуально они очень похожи, но представляют собой отдельные плагины.
- Аналогично, некоторые переменные исходного кода Sass для стилей и размеров offcanvas наследуются от модальных переменных.
- Когда отображается, offcanvas включает фон по умолчанию, на котором можно щелкнуть, чтобы скрыть offcanvas.
- Аналогично модалам, одновременно может отображаться только один offcanvas.
Внимание! Учитывая, как CSS обрабатывает анимацию, вы не можете использовать
marginortranslateдля.offcanvasэлемента. Вместо этого используйте класс как независимый элемент упаковки.
Основы Offcanvas
HTML-структура
Простейший Offcanvas состоит из следующих элементов:
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasExample" aria-controls="offcanvasExample">
Открыть Offcanvas
</button>
<div class="offcanvas offcanvas-start" tabindex="-1" id="offcanvasExample" aria-labelledby="offcanvasExampleLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasExampleLabel">Заголовок Offcanvas</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Закрыть"></button>
</div>
<div class="offcanvas-body">
<p>Содержимое Offcanvas.</p>
</div>
</div>
Заголовок Offcanvas
Содержимое Offcanvas.
Описание элементов
-
button: триггер для открытия Offcanvas.data-bs-toggle="offcanvas": указывает, что кнопка запускает Offcanvas.data-bs-target="#offcanvasExample": связывает кнопку с Offcanvas по ID.aria-controls: соответствует ID Offcanvas, что улучшает доступность.
-
div.offcanvas: основной контейнер Offcanvas.offcanvas-start: определяет сторону, с которой появляется Offcanvas (доступныstart,end,top,bottom).tabindex="-1": делает элемент доступным для взаимодействия.id: уникальный идентификатор для связывания с триггером.
-
div.offcanvas-header: заголовок Offcanvas.- включает заголовок (
offcanvas-title) и кнопку закрытия (btn-close).
- включает заголовок (
-
div.offcanvas-body: основное содержимое.
Параметры и атрибуты
Позиционирование
Для указания стороны появления используйте один из следующих классов:
offcanvas-start— слева (по умолчанию).offcanvas-end— справа.offcanvas-top— сверху.offcanvas-bottom— снизу.
Атрибуты
data-bs-scroll="true": позволяет прокручивать основной контент, даже если Offcanvas открыт.data-bs-backdrop="false": отключает затемнение фона (бекдроп).
Пример:
<div class="offcanvas offcanvas-end" data-bs-scroll="true" data-bs-backdrop="false" tabindex="-1" id="offcanvasScrolling" aria-labelledby="offcanvasScrollingLabel">
...
</div>
Стилизация
Offcanvas наследует стандартные стили Bootstrap, которые можно кастомизировать. Используйте утилитарные классы Bootstrap для изменения ширины, высоты или других параметров.
Пример изменения ширины
<div class="offcanvas offcanvas-start" style="width: 300px;" id="offcanvasExample">
...
</div>
Пример изменения высоты (для offcanvas-top или offcanvas-bottom)
<div class="offcanvas offcanvas-bottom" style="height: 50vh;" id="offcanvasExample">
...
</div>
Темные offcanvas
Устарело в версии 5.3.0 Добавлено в версии 5.2.0
Измените внешний вид offcanvas с помощью утилит, чтобы они лучше подходили для разных контекстов, например для тёмных навигационных панелей. Здесь мы добавляем .text-bg-dark к .offcanvas и .btn-close-white к .btn-close для правильного оформления с помощью тёмного offcanvas. Если у вас есть выпадающие списки, подумайте о том, чтобы добавить .dropdown-menu-dark к .dropdown-menu.
Внимание! Темные варианты компонентов были удалены в версии 5.3.0 с введением цветовых режимов. Вместо ручного добавления упомянутых выше классов установитеdata-bs-theme="dark"на корневой элемент, родительскую оболочку или сам компонент.
<div class="offcanvas offcanvas-start show text-bg-dark" tabindex="-1" id="offcanvasDark" aria-labelledby="offcanvasDarkLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasDarkLabel">Offcanvas</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvasDark" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<p>Разместите содержимое offcanvas здесь.</p>
</div>
</div>
Методы JavaScript
Инициализация
Offcanvas можно инициализировать через JavaScript:
const offcanvas = new bootstrap.Offcanvas(document.getElementById('offcanvasExample'));
offcanvas.show();
Методы
show(): Открывает Offcanvas.hide(): Закрывает Offcanvas.toggle(): Переключает состояние (открыто/закрыто).
Пример:
const myOffcanvas = new bootstrap.Offcanvas('#offcanvasExample');
document.getElementById('toggleButton').addEventListener('click', () => {
myOffcanvas.toggle();
});
События
Offcanvas поддерживает следующие события:
| Событие | Описание |
|---|---|
show.bs.offcanvas |
Срабатывает перед показом Offcanvas. |
shown.bs.offcanvas |
Срабатывает после показа Offcanvas. |
hide.bs.offcanvas |
Срабатывает перед скрытием Offcanvas. |
hidden.bs.offcanvas |
Срабатывает после скрытия Offcanvas. |
Использование событий
const myOffcanvas = document.getElementById('offcanvasExample');
myOffcanvas.addEventListener('show.bs.offcanvas', () => {
console.log('Offcanvas будет открыт!');
});
myOffcanvas.addEventListener('hidden.bs.offcanvas', () => {
console.log('Offcanvas закрыт!');
});
Примеры
Offcanvas с формой
<button class="btn btn-secondary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasForm" aria-controls="offcanvasForm">
Открыть форму
</button>
<div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasForm" aria-labelledby="offcanvasFormLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasFormLabel">Форма</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Закрыть"></button>
</div>
<div class="offcanvas-body">
<form>
<div class="mb-3">
<label for="exampleInputEmail" class="form-label">Email</label>
<input type="email" class="form-control" id="exampleInputEmail" placeholder="Введите email">
</div>
<div class="mb-3">
<label for="exampleInputPassword" class="form-label">Пароль</label>
<input type="password" class="form-control" id="exampleInputPassword" placeholder="Введите пароль">
</div>
<button type="submit" class="btn btn-primary">Отправить</button>
</form>
</div>
</div>
Форма
Offcanvas с прокруткой длинного контента
Если в вашем Offcanvas много контента, добавьте атрибут data-bs-scroll="true" для включения внутренней прокрутки.
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasScrollable" aria-controls="offcanvasScrollable">
Открыть с прокруткой
</button>
<div class="offcanvas offcanvas-end" data-bs-scroll="true" tabindex="-1" id="offcanvasScrollable" aria-labelledby="offcanvasScrollableLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasScrollableLabel">Длинный контент</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Закрыть"></button>
</div>
<div class="offcanvas-body">
<p>Этот Offcanvas содержит длинный текст для демонстрации прокрутки.</p>
<p>Добавьте сюда длинные параграфы или списки. Например:</p>
<ul>
<li>Элемент 1</li>
<li>Элемент 2</li>
<li>Элемент 3</li>
<li>...и так далее</li>
</ul>
</div>
</div>
Длинный контент
Этот Offcanvas содержит длинный текст для демонстрации прокрутки.
Добавьте сюда длинные параграфы или списки. Например:
- Элемент 1
- Элемент 2
- Элемент 3
- Элемент 1
- Элемент 2
- Элемент 3
- Элемент 1
- Элемент 2
- Элемент 3
- Элемент 1
- Элемент 2
- Элемент 3
- Элемент 1
- Элемент 2
- Элемент 3
- Элемент 1
- Элемент 2
- Элемент 3
- Элемент 1
- Элемент 2
- Элемент 3
- Элемент 1
- Элемент 2
- Элемент 3
- Элемент 1
- Элемент 2
- Элемент 3
- Элемент 1
- Элемент 2
- Элемент 3
- ...и так далее
Offcanvas без затемнения фона
Отключите затемнение фона, добавив атрибут data-bs-backdrop="false".
<button class="btn btn-secondary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasNoBackdrop" aria-controls="offcanvasNoBackdrop">
Открыть без затемнения
</button>
<div class="offcanvas offcanvas-start" data-bs-backdrop="false" tabindex="-1" id="offcanvasNoBackdrop" aria-labelledby="offcanvasNoBackdropLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasNoBackdropLabel">Без затемнения</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Закрыть"></button>
</div>
<div class="offcanvas-body">
<p>Этот Offcanvas позволяет взаимодействовать с основным контентом даже в открытом состоянии.</p>
</div>
</div>
Без затемнения
Этот Offcanvas позволяет взаимодействовать с основным контентом даже в открытом состоянии.
Offcanvas сверху с кастомной высотой
Для Offcanvas сверху (offcanvas-top) можно задать кастомную высоту.
<button class="btn btn-warning" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasTop" aria-controls="offcanvasTop">
Открыть сверху
</button>
<div class="offcanvas offcanvas-top" style="height: 50vh;" tabindex="-1" id="offcanvasTop" aria-labelledby="offcanvasTopLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasTopLabel">Offcanvas сверху</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Закрыть"></button>
</div>
<div class="offcanvas-body">
<p>Этот Offcanvas выезжает сверху экрана и имеет половинную высоту окна.</p>
</div>
</div>
Offcanvas сверху
Этот Offcanvas выезжает сверху экрана и имеет половинную высоту окна.
Offcanvas с меню навигации
Идеально подходит для создания мобильного меню.
<button class="btn btn-success" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasMenu" aria-controls="offcanvasMenu">
Открыть меню
</button>
<div class="offcanvas offcanvas-start" tabindex="-1" id="offcanvasMenu" aria-labelledby="offcanvasMenuLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasMenuLabel">Меню</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Закрыть"></button>
</div>
<div class="offcanvas-body">
<ul class="nav flex-column">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">Главная</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">О нас</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Контакты</a>
</li>
</ul>
</div>
</div>
Меню
Offcanvas снизу с интерактивным контентом
Этот Offcanvas выезжает снизу и содержит форму.
<button class="btn btn-info" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasBottom" aria-controls="offcanvasBottom">
Открыть снизу
</button>
<div class="offcanvas offcanvas-bottom" style="height: 30vh;" tabindex="-1" id="offcanvasBottom" aria-labelledby="offcanvasBottomLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasBottomLabel">Offcanvas снизу</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Закрыть"></button>
</div>
<div class="offcanvas-body">
<form>
<div class="mb-3">
<label for="exampleInputEmail" class="form-label">Email</label>
<input type="email" class="form-control" id="exampleInputEmail" placeholder="Введите email">
</div>
<button type="submit" class="btn btn-primary">Отправить</button>
</form>
</div>
</div>
Offcanvas снизу
Эти примеры помогут настроить Offcanvas для разных сценариев, будь то меню, формы или информационные панели.
Советы по использованию
- Доступность. Всегда добавляйте атрибуты
aria-controlsиaria-labelledbyдля лучшей доступности. - Мобильные устройства. Offcanvas особенно полезен для мобильных меню.
- Кастомизация. Используйте CSS для тонкой настройки внешнего вида компонента.
CSS
Переменные
Добавлено в версии 5.2.0
В рамках развивающегося подхода Bootstrap к переменным CSS в offcanvas теперь используются локальные переменные CSS в .offcanvas для расширенной настройки в реальном времени. Значения переменных CSS задаются с помощью Sass, поэтому настройка с помощью Sass по-прежнему поддерживается.
--#{$prefix}offcanvas-zindex: #{$zindex-offcanvas};
--#{$prefix}offcanvas-width: #{$offcanvas-horizontal-width};
--#{$prefix}offcanvas-height: #{$offcanvas-vertical-height};
--#{$prefix}offcanvas-padding-x: #{$offcanvas-padding-x};
--#{$prefix}offcanvas-padding-y: #{$offcanvas-padding-y};
--#{$prefix}offcanvas-color: #{$offcanvas-color};
--#{$prefix}offcanvas-bg: #{$offcanvas-bg-color};
--#{$prefix}offcanvas-border-width: #{$offcanvas-border-width};
--#{$prefix}offcanvas-border-color: #{$offcanvas-border-color};
--#{$prefix}offcanvas-box-shadow: #{$offcanvas-box-shadow};
--#{$prefix}offcanvas-transition: #{transform $offcanvas-transition-duration ease-in-out};
--#{$prefix}offcanvas-title-line-height: #{$offcanvas-title-line-height};
Переменные Sass
$offcanvas-padding-y: $modal-inner-padding;
$offcanvas-padding-x: $modal-inner-padding;
$offcanvas-horizontal-width: 400px;
$offcanvas-vertical-height: 30vh;
$offcanvas-transition-duration: .3s;
$offcanvas-border-color: $modal-content-border-color;
$offcanvas-border-width: $modal-content-border-width;
$offcanvas-title-line-height: $modal-title-line-height;
$offcanvas-bg-color: var(--#{$prefix}body-bg);
$offcanvas-color: var(--#{$prefix}body-color);
$offcanvas-box-shadow: $modal-content-box-shadow-xs;
$offcanvas-backdrop-bg: $modal-backdrop-bg;
$offcanvas-backdrop-opacity: $modal-backdrop-opacity;
Теперь вы можете эффективно использовать компонент Offcanvas в своих проектах!