Toast 是轻量级通知,旨在模仿移动和桌面操作系统中流行的推送通知。
Toast 旨在对您的访客或用户造成轻微中断,因此应包含最少、切中要点且无交互性的内容。请参阅下方的 无障碍提示 部分,了解重要的使用信息。
概述
为了鼓励可扩展且可预测的 Toast,我们建议提供标题和正文。Toast 标题使用样式 'display: flex'
,借助 Bootstrap 的 边距和 flexbox 实用程序类,可以轻松对齐内容。
Toast 也略微透明,因此它们会与可能出现的任何内容融合在一起。对于支持 backdrop-filter
CSS 属性的浏览器,它们还会尝试模糊 Toast 下方的元素。
<template>
<div class="p-3 bg-secondary progress-bar-striped" style="min-height: 170px;">
<b-button class="mb-2" variant="primary" @click="$bvToast.show('example-toast')">
Show toast
</b-button>
<b-toast id="example-toast" title="BootstrapVue" static no-auto-hide>
Hello, world! This is a toast message.
</b-toast>
</div>
</template>
注意:我们在上面的示例中使用 static
属性在文档中就地呈现 Toast,而不是将其传输到 <b-toaster>
目标容器。并且我们已将类 bg-secondary
和 progress-bar-striped
添加到外部 <div>
,仅为说明 Toast 透明度。
Toast 功能和说明
- 可以通过注入
this.$bvToast
对象按需生成 Toast,或使用 <b-toast>
组件手动创建。 - 标题是可选的,但应包括在内,标题在
<strong>
元素内呈现,除非使用 toast-title
插槽。 - 可以通过
no-close-button
属性移除 Toast 右上角的关闭按钮。 - 将显示标题栏,除非您不提供标题并设置
no-close-button
属性。 - 自动隐藏在 5000 毫秒后发生,可以通过
auto-hide-delay
属性进行更改,或通过 no-auto-hide
属性禁用。 - 当启用自动隐藏时,当您将鼠标悬停在 Toast 上时,自动隐藏倒计时将暂停。您可以通过将
no-hover-pause
属性设置为 true
来禁用此功能。 - 如果您禁用了自动隐藏功能,请避免隐藏关闭按钮,或者如果您隐藏关闭按钮,请确保允许 Toast 自动关闭。请参阅下方的 无障碍提示 部分,了解重要的使用信息。
- 可以通过将
solid
属性设置为 true
来禁用 Toast 透明度。 - Toast 将显示在命名的
<b-toaster>
目标组件内。BootstrapVue 带有几个预定义的吐司目标。Toast 将在显示之前检查文档中命名的吐司,如果找不到,将动态创建命名的吐司目标。 - 吐司目标完全由 CSS 定义,用于控制包含的
<b-toast>
组件的位置。 - Toast 可以针对任何命名的吐司。
- Toast 被包装在具有类
b-toast
的 <div>
中,以在吐司组件中显示时允许 Vue 列表转换支持。
BootstrapVue 使用 PortalVue 将 Toast 传输到吐司机中。
按需 Toast
通过 this.$bvToast
Vue 组件实例注入,从应用程序中的任何位置生成动态 Toast,而无需在应用程序中放置 <b-toast>
组件。
使用 this.$bvToast.toast()
方法生成按需 Toast。该方法接受两个参数
message
: Toast 正文的内容(字符串或 VNodes
数组)。必需。消息为空的 Toast 将不会显示。有关将 VNodes
数组作为消息传递的示例,请参阅 高级用法 部分。 options
: 一个可选的选项对象,用于提供标题和/或其他配置选项。 title
选项可以是字符串或 VNodes
数组
options 参数接受 <b-toast>
组件接受的大多数属性(static
和 visible
除外),采用 camelCase 名称格式,而不是 kebab-case。
<template>
<div>
<b-button @click="makeToast()">Show Toast</b-button>
<b-button @click="makeToast(true)">Show Toast (appended)</b-button>
</div>
</template>
<script>
export default {
data() {
return {
toastCount: 0
}
},
methods: {
makeToast(append = false) {
this.toastCount++
this.$bvToast.toast(`This is toast number ${this.toastCount}`, {
title: 'BootstrapVue Toast',
autoHideDelay: 5000,
appendToast: append
})
}
}
}
</script>
使用 this.$bvToast.toast()
生成的 Toast 被隐藏后,它将自动被销毁并从文档中删除。
注意
- 仅在使用完整的
BootstrapVue
插件或 ToastPlugin
插件时,才可以使用 this.$bvToast
注入。如果仅导入 b-toast
或 b-toaster
组件,则无法使用它。要仅导入 $bvToast
注入,请使用 BVToastPlugin
插件。 - 为每个 Vue 虚拟机实例(即每个实例化组件)创建了一个新的
$bvToast
注入(混合),并且无法通过直接访问 Vue.prototype
来使用它,因为它需要访问实例的 this
和 $root
上下文。 - 通过
this.$bvToast.toast()
生成的 Toast 是调用 this.$bvToast.toast()
方法的 Vue 实例的子项,并且如果该 Vue 实例(即您的组件或应用程序)也被销毁,它们将被隐藏并销毁。如果 vm 上下文位于 <router-view>
中,并且 $route
发生更改,则 Toast 也将被销毁(因为 <router-view>
的所有子项都将被销毁。要使按需 Toast 在路由 $route
更改后仍然存在,请改用 this.$root.$bvToast.toast()
,以便将 Toast 的父项设为您的应用程序的根目录。 - Toast 需要一条消息。按需显示的 Toast 如果没有消息,则会静默地不显示。
选项
Toast 具有各种选项,可以控制它们的样式和行为。选项既可用作 <b-toast>
组件上的属性,也可用作传递给 this.$bvToast.toast()
的选项对象的属性。当将选项传递给 this.$bvToast.toast()
时,请使用组件属性名称的 camelCase 版本,即使用 noAutoHide
而不是 no-auto-hide
。
标题
通过 title
选项为您的 Toast 添加标题。就像 Toast message
一样,标题可以是简单的字符串,也可以是 VNode 数组。有关将 VNode
数组作为消息和标题传递的示例,请参阅 高级用法 部分。
透明度
默认情况下,Toast 具有半透明背景。若要禁用默认透明度,只需将 solid
属性设置为 true
,即可从背景色中移除 Alpha 通道。
当使用 SCSS 文件(而非 CSS 文件)时,还可以通过 BootstrapVue 自定义 SCSS 变量 $b-toast-background-opacity
更改透明度。请参阅 主题 参考部分。
变体
BootstrapVue Toast 提供自定义 CSS 来定义颜色变体。变体遵循标准 Bootstrap v4 变体名称。如果您有自定义的 SCSS 定义的 Bootstrap 颜色主题变体,则 Toast 自定义 SCSS 将自动为您创建 Toast 变体(请参阅 主题 参考部分)。
<template>
<div>
<b-button @click="makeToast()" class="mb-2">Default</b-button>
<b-button variant="primary" @click="makeToast('primary')" class="mb-2">Primary</b-button>
<b-button variant="secondary" @click="makeToast('secondary')" class="mb-2">Secondary</b-button>
<b-button variant="danger" @click="makeToast('danger')" class="mb-2">Danger</b-button>
<b-button variant="warning" @click="makeToast('warning')" class="mb-2">Warning</b-button>
<b-button variant="success" @click="makeToast('success')" class="mb-2">Success</b-button>
<b-button variant="info" @click="makeToast('info')" class="mb-2">Info</b-button>
</div>
</template>
<script>
export default {
methods: {
makeToast(variant = null) {
this.$bvToast.toast('Toast body content', {
title: `Variant ${variant || 'default'}`,
variant: variant,
solid: true
})
}
}
}
</script>
Toaster 目标
BootstrapVue 随附以下“内置”Toaster 名称(以及在 SCSS 中定义的相关样式)
b-toaster-top-right
b-toaster-top-left
b-toaster-top-center
b-toaster-top-full
b-toaster-bottom-right
b-toaster-bottom-left
b-toaster-bottom-center
b-toaster-bottom-full
<template>
<div>
<b-button @click="toast('b-toaster-top-right')" class="mb-2">b-toaster-top-right</b-button>
<b-button @click="toast('b-toaster-top-left')" class="mb-2">b-toaster-top-left</b-button>
<b-button @click="toast('b-toaster-top-center')" class="mb-2">b-toaster-top-center</b-button>
<b-button @click="toast('b-toaster-top-full')" class="mb-2">b-toaster-top-full</b-button>
<b-button @click="toast('b-toaster-bottom-right', true)" class="mb-2">b-toaster-bottom-right</b-button>
<b-button @click="toast('b-toaster-bottom-left', true)" class="mb-2">b-toaster-bottom-left</b-button>
<b-button @click="toast('b-toaster-bottom-center', true)" class="mb-2">b-toaster-bottom-center</b-button>
<b-button @click="toast('b-toaster-bottom-full', true)" class="mb-2">b-toaster-bottom-full</b-button>
</div>
</template>
<script>
export default {
data() {
return {
counter: 0
}
},
methods: {
toast(toaster, append = false) {
this.counter++
this.$bvToast.toast(`Toast ${this.counter} body content`, {
title: `Toaster ${toaster}`,
toaster: toaster,
solid: true,
appendToast: append
})
}
}
}
</script>
注意
- 在 CSS 中未定义的 Toaster 目标名称将在文档底部呈现,堆叠且未定位(附加到
<body>
中的 <b-toaster>
,类名和 ID 设置为 Toaster 目标名称)。Toaster 唯一默认样式是 z-index
为 1100
。 - 避免在您的应用程序中同时使用
b-toaster-top-*
Toaster 或 b-toaster-bottom-*
Toaster,因为在小屏幕(例如 xs
)上通知可能会被遮挡/重叠。
前置和后置
Toast 默认将自己前置到指定 Toaster 中显示的 Toast 顶部,按创建顺序排列。若要将新 Toast 附加到底部,请将 append-toast
属性设置为 true
。
自动隐藏
通过 auto-hide-delay
属性更改自动隐藏延迟时间(值以毫秒为单位),默认为 5000
(最小值 1000
)。或者,通过将 no-auto-hide
属性设置为 true
,完全禁用自动隐藏功能。
启用自动隐藏时,将鼠标悬停在 Toast 上将暂停自动隐藏计时器。当您将鼠标移出 Toast 时,自动隐藏计时器将恢复。您可以通过将 no-hover-pause
属性设置为 true
来禁用此功能。
默认情况下,Toast 有一个关闭按钮,可通过点击使用来隐藏它们。将 no-close-button
属性设置为 true
将阻止此操作,并创建一个没有默认关闭按钮的 Toast。
仍然可以通过提供一个唯一 ID 并使用 this.$bvToast.hide(id)
方法来隐藏特定 Toast,为 Toast 创建一个自定义关闭按钮
<template>
<div>
<b-button @click="showToast">Show Toast</b-button>
</div>
</template>
<script>
export default {
data() {
return {
count: 0
}
},
methods: {
showToast() {
const h = this.$createElement
const id = `my-toast-${this.count++}`
const $closeButton = h(
'b-button',
{
on: { click: () => this.$bvToast.hide(id) }
},
'Close'
)
this.$bvToast.toast([$closeButton], {
id: id,
title: `Toast ${this.count}`,
noCloseButton: true
})
}
}
}
</script>
Toast 角色
Toast 使用默认 role
属性 'alert'
和 aria-live
属性 'assertive'
渲染。对于用于普通通知的 Toast,将 is-status
属性设置为 true
,这将更改 role
和 aria-live
属性,分别为 'status'
和 'polite'
。
有关更多信息,请参阅下面的 辅助功能 部分。
链接
可以选择通过 href
和 to
属性将 Toast 正文转换为链接 (<a>
) 或 <router-link>
(或 <nuxt-link>
)。设置后,整个 Toast 正文将变为一个链接。
<template>
<div>
<b-button @click="toast()">Toast with link</b-button>
</div>
</template>
<script>
export default {
methods: {
toast() {
this.$bvToast.toast(`Toast with action link`, {
href: '#foo',
title: 'Example'
})
}
}
}
</script>
<b-toast>
组件
当您有一个自定义组件希望一次只显示一个 Toast 时,请使用 <b-toast>
组件。 <b-toast>
组件可以放置在自定义组件或应用程序中的任何位置,并且不渲染元素(它们渲染一个不会影响布局的注释占位符节点)。
可以通过 v-model
(与 visible
属性相关联)使 Toast 可见,或使用组件的 show()
和 hide()
实例方法显示,或通过 this.$bvToast.show(id)
和 this.$bvToast.hide(id)
方法(要求在 <b-toast>
组件上设置一个唯一 ID)。
默认情况下,Toast 会按顺序放入 b-toaster-top-right
<b-toaster>
组件中。如果文档中不存在 toaster
属性指定的 toaster,则会按需创建该 toaster。
可以通过将 static
属性设置为 true
,强制 <b-toast>
就地显示在文档中。您仍然需要显示和隐藏 toast,但它不会传输到 toaster 组件中。
<template>
<div>
<b-button @click="$bvToast.show('my-toast')">Show toast</b-button>
<b-toast id="my-toast" variant="warning" solid>
<template #toast-title>
<div class="d-flex flex-grow-1 align-items-baseline">
<b-img blank blank-color="#ff5555" class="mr-2" width="12" height="12"></b-img>
<strong class="mr-auto">Notice!</strong>
<small class="text-muted mr-2">42 seconds ago</small>
</div>
</template>
This is the content of the toast.
It is short and to the point.
</b-toast>
</div>
</template>
插槽
toast-title
:替换默认标题元素的内容。 default
:toast 正文的内容
两个插槽都可选择使用以下范围进行限定
方法或属性 | 说明 |
hide() | 调用时隐藏 toast。如果您提供自己的关闭按钮,则此方法很有用。 |
仅在使用 <b-toast>
组件时提供插槽。
<b-toaster>
目标组件
<b-toaster>
组件提供了一个容器,其中将显示 toast(“Toaster”)。Toaster 需要一个唯一名称,并且可以将 toast 定位为显示在特定的命名 toaster 中。
在大多数情况下,您无需直接使用此组件,因为 <b-toast>
会自动插入一个 <b-toaster>
组件(追加到 <body>
),其中包含请求的 toaster 名称(如果在文档中找不到该名称)。但有时您可能希望在应用中明确放置一个 toaster。
Toaster name
成为插入容器的 ID,还将用作渲染的 toaster 容器上的类名。
Toaster 的定位和 toaster 内 toast 的定位完全由 CSS 类(基于 toaster 的名称)驱动
以下“内置”toaster 名称(及相关样式)在 BootstrapVue 的自定义 SCSS 中定义
b-toaster-top-right
b-toaster-top-left
b-toaster-top-center
b-toaster-top-full
b-toaster-bottom-right
b-toaster-bottom-left
b-toaster-bottom-center
b-toaster-bottom-full
上述的吐司将吐司放置在堆叠(列格式)中,固定在视口中(这意味着它们将始终在视图中,而不管视口滚动位置如何)。如果吐司多于视口屏幕所能容纳的数量,一些吐司将在其他吐司关闭/隐藏之前在视觉上隐藏在屏幕外。
<b-toast>
默认使用 b-toaster-top-right
吐司。
注意
- 如果文档中已经存在一个具有相同名称的
<b-toaster>
(由 <b-toast>
、this.$bvToast.toast()
自动创建,或手动放置),那么 <b-toaster>
将只渲染一个空的 <div>
元素并发出控制台警告。 - 如果手动放置
<b-toaster>
组件,请确保将其放置在应用根元素底部的最后一个元素中,以便应用中的所有页面都可以使用它。 - 如果针对吐司名称显示的新吐司,则将自动重新创建被销毁的吐司。
- 在大多数用例中,你不应该需要在应用中手动放置/创建
<b-toaster>
组件,因为它们将在需要时按需自动生成。但是,如果你需要覆盖任何吐司默认设置,请确保将吐司放置在应用中不会因路由更改而被销毁的位置。
高级用法
当使用 this.$bvToast.toast(...)
方法生成吐司时,你可能希望吐司内容不仅仅是一个字符串消息。如上文 按需吐司 部分所述,你可以将 VNodes
数组作为消息和标题传递,以获得更复杂的内容。
请记住,吐司内容应简单明了。避免在吐司中放置交互式组件或元素,因为这可能会给辅助技术的用户带来问题。请参阅下文的 无障碍性 部分。
下面是一个使用 Vue 的 this.$createElement()
方法生成更复杂吐司内容的示例
<template>
<div>
<b-button @click="showToast">Show Toast with custom content</b-button>
</div>
</template>
<script>
export default {
data() {
return {
count: 0
}
},
methods: {
showToast() {
const h = this.$createElement
this.count++
const vNodesMsg = h(
'p',
{ class: ['text-center', 'mb-0'] },
[
h('b-spinner', { props: { type: 'grow', small: true } }),
' Flashy ',
h('strong', 'toast'),
` message #${this.count} `,
h('b-spinner', { props: { type: 'grow', small: true } })
]
)
const vNodesTitle = h(
'div',
{ class: ['d-flex', 'flex-grow-1', 'align-items-baseline', 'mr-2'] },
[
h('strong', { class: 'mr-2' }, 'The Title'),
h('small', { class: 'ml-auto text-italics' }, '5 minutes ago')
]
)
this.$bvToast.toast([vNodesMsg], {
title: [vNodesTitle],
solid: true,
variant: 'info'
})
}
}
}
</script>
警报与吐司
在某些情况下,你可能只需要一个简单的警报样式消息(例如,Cookie 使用通知等)。在这些情况下,通常最好使用固定位置警报而不是吐司,方法是在 <b-alert>
组件上应用一些 Bootstrap 实用程序类 和一些自定义样式
<template>
<div>
<b-button size="sm" @click="showBottom = !showBottom">
{{ showBottom ? 'Hide' : 'Show' }} Fixed bottom Alert
</b-button>
<b-alert
v-model="showBottom"
class="position-fixed fixed-bottom m-0 rounded-0"
style="z-index: 2000;"
variant="warning"
dismissible
>
Fixed position (bottom) alert!
</b-alert>
<b-button size="sm" @click="showTop = !showTop">
{{ showTop ? 'Hide' : 'Show' }} Fixed top Alert
</b-button>
<b-alert
v-model="showTop"
class="position-fixed fixed-top m-0 rounded-0"
style="z-index: 2000;"
variant="success"
dismissible
>
Fixed position (top) alert!
</b-alert>
</div>
</template>
<script>
export default {
data() {
return {
showBottom: false,
showTop: false
}
}
}
</script>
我们使用类 position-fixed
将定位设置为固定在用户的视口中,并使用类 fixed-bottom
或 fixed-top
将警报定位在视口的底部或顶部。类 m-0
删除警报周围的默认边距,rounded-0
删除默认圆角。我们还将 z-index
设置为一个较大的值,以确保警报显示在页面上的任何其他内容之上(fixed-top
和 fixed-bottom
的默认值为 1030
)。你可能需要根据你的特定布局调整 z-index
。
由于警报标记保留在放置 <b-alert>
组件的 DOM 中,因此其标签序列(用于访问关闭按钮)对于屏幕阅读器和仅使用键盘的用户来说很容易访问。
辅助功能
吐司旨在对您的访问者或用户造成轻微的干扰,因此为了帮助那些使用屏幕阅读器和类似辅助技术的人,吐司被包装在 aria-live 区域中。屏幕阅读器会自动播报实时区域的更改(例如注入/更新吐司组件),而无需移动用户的焦点或以其他方式中断用户。此外,aria-atomic="true"
会自动设置,以确保始终将整个吐司作为单个(原子)单元播报,而不是播报已更改的内容(如果您只更新吐司内容的一部分,或者稍后显示相同的吐司内容,这可能会导致问题)。
如果您只需要在用户窗口的底部或顶部显示一条简单的消息,请改用 固定位置 <b-alert>
。
辅助功能提示
通常,吐司消息应显示一到两行非关键消息,这些消息不要求用户交互。如果不采取额外措施,吐司可能会出现许多辅助功能问题,这些问题可能会影响残疾人和非残疾人。以下列表虽然不完整,但提供了使用吐司时的通用准则。
- 如果所需的信息对于流程很重要,例如表单中的错误列表,请使用
<b-alert>
组件,而不是 <b-toast>
。 <b-toast>
默认情况下,将属性 role
设置为 'alert'
,将 aria-live
设置为 'assertive'
。如果它是一条重要消息,例如错误,则此默认设置是合适的,否则将 prop is-status
设置为 true
,这将更改属性 role
为 'status'
,将 aria-live
设置为 'polite'
。 - 避免在页面加载时弹出吐司消息。在页面加载时执行意外操作会让屏幕阅读器用户非常困惑。如果在页面加载或路由更改时需要吐司,请延迟几秒钟显示吐司,以便屏幕阅读器完成播报有关当前页面的信息,而不会被吐司中断。
- 在将 prop
no-auto-hide
设置为 true
时,必须有一个关闭按钮,以便用户关闭提示。如果您还将 prop no-close-button
设置为 true
,则必须提供您自己的关闭按钮或通过其他方式关闭提示。提示的标签索引为 0
,以便仅键盘用户可以访问它们。 - 避免快速连续地启动多个提示,因为屏幕阅读器可能会中断当前提示的阅读并宣布新提示,导致错过前一个提示的上下文。
- 对于具有较长文本内容的提示,将
auto-hide-delay
调整为较长的超时时间,以便用户有时间阅读提示的内容。普通人每分钟阅读约 200 个单词,因此显示消息的最佳时间长度为 5 秒,外加每个单词 300 毫秒。作为最佳实践,应使用的最短默认时间为 5 秒(5000 毫秒)。除了合理的默认超时时间外,您还可以允许用户选择提示显示多长时间。大多数人天生就知道自己是快读者还是慢读者。将个人资料设置作为用户登录的一部分,将允许慢读者在消息消失得太快时选择更长的时间,而快读者在消息显示得太久时选择较短的时间。 - 为了解决记忆力丧失和注意力分散以及与残疾相关的 ADHD 等问题,最佳做法是实现一个位置,用户可以在其中查看已显示的过去提示消息列表。最好此列表是可排序的,默认情况下按时间顺序排列。
Internet Explorer 屏幕阅读器支持
不幸的是,IE 11 在与 NVDA 或 JAWS 屏幕阅读器一起使用时,不会在出现时正确播报/朗读提示。如果您有大量使用 IE 11 的视障用户群,您可能需要为仅限 IE 11 浏览器(在页面加载时创建)创建一个额外的非屏幕 aria-live
区域,除了显示提示之外,还可以动态放置提示消息文本的副本。