画布外
使用一些类和我们的 JavaScript 插件将隐藏的侧边栏构建到您的项目中,用于导航、购物车等。
这个怎么运作
Offcanvas 是一个侧边栏组件,可以通过 JavaScript 切换以从视口的左侧、右侧、顶部或底部边缘显示。按钮或锚点用作附加到您切换的特定元素的触发器,data
属性用于调用我们的 JavaScript。
- Offcanvas 与 modals 共享一些相同的 JavaScript 代码。从概念上讲,它们非常相似,但它们是独立的插件。
- 类似地,offcanvas 的样式和尺寸的一些源 Sass变量继承自 modal 的变量。
- 显示时,offcanvas 包含一个默认背景,单击该背景可以隐藏 offcanvas。
- 与 modals 类似,一次只能显示一个 offcanvas。
小心!鉴于 CSS 处理动画的方式,您不能在元素上使用margin
or 。相反,将类用作独立的包装元素。translate
.offcanvas
prefers-reduced-motion
媒体查询。请参阅
我们可访问性文档的减少运动部分。
例子
画布外组件
下面是一个默认显示的画布示例(通过.show
on .offcanvas
)。Offcanvas 包括对带有关闭按钮的标题和一些初始的可选正文类的支持padding
。我们建议您尽可能在关闭操作中包含 offcanvas 标头,或提供明确的关闭操作。
画布外
<div class="offcanvas offcanvas-start show" tabindex="-1" id="offcanvas" aria-labelledby="offcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasLabel">Offcanvas</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
Content for the offcanvas goes here. You can place just about any Bootstrap component or custom elements here.
</div>
</div>
现场演示
使用下面的按钮通过 JavaScript 显示和隐藏一个 offcanvas 元素,该元素通过类切换.show
元素上的.offcanvas
类。
.offcanvas
隐藏内容(默认).offcanvas.show
显示内容
您可以使用带有属性的链接href
或带有属性的按钮data-bs-target
。在这两种情况下,data-bs-toggle="offcanvas"
都是必需的。
画布外
<a class="btn btn-primary" data-bs-toggle="offcanvas" href="#offcanvasExample" role="button" aria-controls="offcanvasExample">
Link with href
</a>
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasExample" aria-controls="offcanvasExample">
Button with data-bs-target
</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="Close"></button>
</div>
<div class="offcanvas-body">
<div>
Some text as placeholder. In real life you can have the elements you have chosen. Like, text, images, lists, etc.
</div>
<div class="dropdown mt-3">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown">
Dropdown button
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
</ul>
</div>
</div>
</div>
正文滚动
<body>
当 offcanvas 及其背景可见时,禁用滚动元素。使用该data-bs-scroll
属性启用<body>
滚动。
带正文滚动的 Offcanvas
尝试滚动页面的其余部分以查看此选项的实际效果。
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasScrolling" aria-controls="offcanvasScrolling">Enable body scrolling</button>
<div class="offcanvas offcanvas-start" data-bs-scroll="true" data-bs-backdrop="false" tabindex="-1" id="offcanvasScrolling" aria-labelledby="offcanvasScrollingLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasScrollingLabel">Offcanvas with body scrolling</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<p>Try scrolling the rest of the page to see this option in action.</p>
</div>
</div>
身体滚动和背景
您还可以启用<body>
带有可见背景的滚动功能。
带滚动的背景
尝试滚动页面的其余部分以查看此选项的实际效果。
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasWithBothOptions" aria-controls="offcanvasWithBothOptions">Enable both scrolling & backdrop</button>
<div class="offcanvas offcanvas-start" data-bs-scroll="true" tabindex="-1" id="offcanvasWithBothOptions" aria-labelledby="offcanvasWithBothOptionsLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasWithBothOptionsLabel">Backdrop with scrolling</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<p>Try scrolling the rest of the page to see this option in action.</p>
</div>
</div>
静态背景
当背景设置为静态时,在画布外部单击时不会关闭画布。
画布外
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#staticBackdrop" aria-controls="staticBackdrop">
Toggle static offcanvas
</button>
<div class="offcanvas offcanvas-start" data-bs-backdrop="static" tabindex="-1" id="staticBackdrop" aria-labelledby="staticBackdropLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="staticBackdropLabel">Offcanvas</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<div>
I will not close if you click outside of me.
</div>
</div>
</div>
深色画布
在 v5.2.0 中添加使用实用程序更改画布外的外观,以更好地将它们与不同的上下文(如深色导航栏)匹配。在这里,我们添加.text-bg-dark
到.offcanvas
and .btn-close-white
to.btn-close
以使用深色 offcanvas 进行适当的造型。如果您有下拉菜单,请考虑添加.dropdown-menu-dark
到.dropdown-menu
.
画布外
将画布内容放在这里。
<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>Place offcanvas content here.</p>
</div>
</div>
响应式
在 v5.2.0 中添加响应式 offcanvas 类从指定的断点向下隐藏视口之外的内容。在该断点之上,其中的内容将照常运行。例如,.offcanvas-lg
在断点下方隐藏画布中lg
的内容,但在断点上方显示内容lg
。
响应式画布
这是.offcanvas-lg
.
<button class="btn btn-primary d-lg-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasResponsive" aria-controls="offcanvasResponsive">Toggle offcanvas</button>
<div class="alert alert-info d-none d-lg-block">Resize your browser to show the responsive offcanvas toggle.</div>
<div class="offcanvas-lg offcanvas-end" tabindex="-1" id="offcanvasResponsive" aria-labelledby="offcanvasResponsiveLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasResponsiveLabel">Responsive offcanvas</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#offcanvasResponsive" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<p class="mb-0">This is content within an <code>.offcanvas-lg</code>.</p>
</div>
</div>
每个断点都可以使用响应式 offcanvas 类。
.offcanvas
.offcanvas-sm
.offcanvas-md
.offcanvas-lg
.offcanvas-xl
.offcanvas-xxl
放置
offcanvas 组件没有默认放置,因此您必须添加以下修饰符类之一。
.offcanvas-start
将 offcanvas 放置在视口的左侧(如上所示).offcanvas-end
将 offcanvas 放置在视口的右侧.offcanvas-top
将 offcanvas 放置在视口的顶部.offcanvas-bottom
将 offcanvas 放置在视口底部
试试下面的顶部、右侧和底部示例。
帆布上衣
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasTop" aria-controls="offcanvasTop">Toggle top offcanvas</button>
<div class="offcanvas offcanvas-top" tabindex="-1" id="offcanvasTop" aria-labelledby="offcanvasTopLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasTopLabel">Offcanvas top</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
...
</div>
</div>
画布右
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasRight" aria-controls="offcanvasRight">Toggle right offcanvas</button>
<div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasRight" aria-labelledby="offcanvasRightLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasRightLabel">Offcanvas right</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
...
</div>
</div>
帆布底
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasBottom" aria-controls="offcanvasBottom">Toggle bottom offcanvas</button>
<div class="offcanvas offcanvas-bottom" tabindex="-1" id="offcanvasBottom" aria-labelledby="offcanvasBottomLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasBottomLabel">Offcanvas bottom</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body small">
...
</div>
</div>
可访问性
由于 offcanvas 面板在概念上是一个模态对话框,因此请务必添加aria-labelledby="..."
(引用 offcanvas 标题)到.offcanvas
. 请注意,您不需要添加role="dialog"
,因为我们已经通过 JavaScript 添加了它。
CSS
变量
在 v5.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};
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: $modal-content-bg;
$offcanvas-color: $modal-content-color;
$offcanvas-box-shadow: $modal-content-box-shadow-xs;
$offcanvas-backdrop-bg: $modal-backdrop-bg;
$offcanvas-backdrop-opacity: $modal-backdrop-opacity;
用法
offcanvas 插件利用一些类和属性来处理繁重的工作:
.offcanvas
隐藏内容.offcanvas.show
显示内容.offcanvas-start
隐藏左侧的画布.offcanvas-end
隐藏右侧的画布.offcanvas-top
将 offcanvas 隐藏在顶部.offcanvas-bottom
隐藏底部的画布
添加一个带有data-bs-dismiss="offcanvas"
属性的关闭按钮,它会触发 JavaScript 功能。确保将<button>
元素与它一起使用,以便在所有设备上保持正确的行为。
通过数据属性
切换
向元素添加data-bs-toggle="offcanvas"
和data-bs-target
或href
以自动分配对一个 offcanvas 元素的控制。该data-bs-target
属性接受一个 CSS 选择器来应用 offcanvas。请务必将类添加offcanvas
到 offcanvas 元素。如果您希望它默认打开,请添加附加类show
。
解雇
可以使用offcanvasdata
中按钮上的属性来实现解雇,如下所示:
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
或使用如下所示在画布外的按钮上:data-bs-target
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#my-offcanvas" aria-label="Close"></button>
通过 JavaScript
手动启用:
const offcanvasElementList = document.querySelectorAll('.offcanvas')
const offcanvasList = [...offcanvasElementList].map(offcanvasEl => new bootstrap.Offcanvas(offcanvasEl))
选项
由于选项可以通过数据属性或 JavaScript 传递,因此您可以将选项名称附加到data-bs-
,如data-bs-animation="{value}"
. 通过数据属性传递选项时,请确保将选项名称的大小写类型从“ camelCase ”更改为“ kebab-case ”。例如,使用data-bs-custom-class="beautifier"
代替data-bs-customClass="beautifier"
.
从 Bootstrap 5.2.0 开始,所有组件都支持一个实验性的保留数据属性data-bs-config
,该属性可以将简单的组件配置作为 JSON 字符串容纳。当一个元素具有data-bs-config='{"delay":0, "title":123}'
和data-bs-title="456"
属性时,最终title
值将是456
并且单独的数据属性将覆盖给定的值 on data-bs-config
。此外,现有数据属性能够容纳 JSON 值,例如data-bs-delay='{"show":0,"hide":150}'
.
姓名 | 类型 | 默认 | 描述 |
---|---|---|---|
backdrop |
布尔值或字符串static |
true |
在 offcanvas 打开时在身体上应用背景。或者,指定static 单击时不关闭画布的背景。 |
keyboard |
布尔值 | true |
按下退出键时关闭画布。 |
scroll |
布尔值 | false |
在 offcanvas 打开时允许正文滚动。 |
方法
将您的内容激活为画布元素。接受一个可选选项object
。
您可以使用构造函数创建一个 offcanvas 实例,例如:
const bsOffcanvas = new bootstrap.Offcanvas('#myOffcanvas')
方法 | 描述 |
---|---|
getInstance |
允许您获取与 DOM 元素关联的 offcanvas 实例的静态方法。 |
getOrCreateInstance |
静态方法,允许您获取与 DOM 元素关联的 offcanvas 实例,或创建一个新实例以防它未初始化。 |
hide |
隐藏画布外元素。在 offcanvas 元素实际被隐藏之前(即在事件发生之前)返回给调用者。hidden.bs.offcanvas |
show |
显示一个 offcanvas 元素。在 offcanvas 元素实际显示之前(即在事件发生之前)返回给调用者。shown.bs.offcanvas |
toggle |
将 offcanvas 元素切换为显示或隐藏。在 offcanvas 元素实际显示或隐藏之前(即在or事件发生之前)返回给调用者。shown.bs.offcanvas hidden.bs.offcanvas |
活动
Bootstrap 的 offcanvas 类公开了一些用于挂钩 offcanvas 功能的事件。
事件类型 | 描述 |
---|---|
hide.bs.offcanvas |
hide 调用该方法时会立即触发此事件。 |
hidden.bs.offcanvas |
当一个 offcanvas 元素对用户隐藏时触发此事件(将等待 CSS 转换完成)。 |
hidePrevented.bs.offcanvas |
当显示 offcanvas 时触发此事件,其背景是static 并且执行 offcanvas 外部的单击。当按下退出键并且keyboard 选项设置为时,也会触发该事件false 。 |
show.bs.offcanvas |
show 调用实例方法时立即触发此事件。 |
shown.bs.offcanvas |
当 offcanvas 元素对用户可见时触发此事件(将等待 CSS 转换完成)。 |
const myOffcanvas = document.getElementById('myOffcanvas')
myOffcanvas.addEventListener('hidden.bs.offcanvas', event => {
// do something...
})