工具提示
使用 CSS3 为动画添加自定义 Bootstrap 工具提示的文档和示例,为本地标题存储使用 data-bs-attributes。
概述
使用工具提示插件时的注意事项:
- Tooltips依赖第三方库Popper进行定位。你必须在之前包含popper.min.js
bootstrap.js
,或者使用一个bootstrap.bundle.min.js
包含 Popper 的。 - 出于性能原因,工具提示是可选的,因此您必须自己初始化它们。
- 永远不会显示带有零长度标题的工具提示。
- 指定
container: 'body'
以避免在更复杂的组件(如我们的输入组、按钮组等)中出现渲染问题。 - 触发隐藏元素的工具提示将不起作用。
.disabled
或元素的工具提示disabled
必须在包装元素上触发。- 当从跨多行的超链接触发时,工具提示将居中。
white-space: nowrap;
在你的 s 上使用<a>
以避免这种行为。 - 在从 DOM 中删除相应的元素之前,必须隐藏工具提示。
- 由于影子 DOM 中的元素,可以触发工具提示。
明白了吗?太好了,让我们看看它们如何使用一些示例。
prefers-reduced-motion
媒体查询。请参阅我们的辅助功能文档的减少运动部分。
例子
启用工具提示
如上所述,您必须先初始化工具提示,然后才能使用它们。初始化页面上所有工具提示的一种方法是通过它们的data-bs-toggle
属性选择它们,如下所示:
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]')
const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl))
链接上的工具提示
将鼠标悬停在下面的链接上以查看工具提示:
占位符文本,用于演示一些带有工具提示的内联链接。现在这只是填充物,不是杀手。放置在这里的内容只是为了模仿真实文本的存在。所有这些只是为了让您了解工具提示在现实世界中使用时的外观。因此,希望您现在已经了解了这些链接上的工具提示在您自己的站点或项目中 使用后如何在实践中发挥作用。
<p class="muted">Placeholder text to demonstrate some <a href="#" data-bs-toggle="tooltip" data-bs-title="Default tooltip">inline links</a> with tooltips. This is now just filler, no killer. Content placed here just to mimic the presence of <a href="#" data-bs-toggle="tooltip" data-bs-title="Another tooltip">real text</a>. And all that just to give you an idea of how tooltips would look when used in real-world situations. So hopefully you've now seen how <a href="#" data-bs-toggle="tooltip" data-bs-title="Another one here too">these tooltips on links</a> can work in practice, once you use them on <a href="#" data-bs-toggle="tooltip" data-bs-title="The last tip!">your own</a> site or project.
</p>
title
或data-bs-title
在您的 HTML 中。当使用时,Popper 会在渲染元素时
title
自动替换它。data-bs-title
自定义工具提示
添加于 v5.2.0您可以使用CSS 变量自定义工具提示的外观。我们设置了一个自定义类data-bs-custom-class="custom-tooltip"
来限定我们自定义外观的范围,并使用它来覆盖本地 CSS 变量。
.custom-tooltip {
--bs-tooltip-bg: var(--bs-primary);
}
<button type="button" class="btn btn-secondary"
data-bs-toggle="tooltip" data-bs-placement="top"
data-bs-custom-class="custom-tooltip"
data-bs-title="This top tooltip is themed via CSS variables.">
Custom tooltip
</button>
方向
将鼠标悬停在下方的按钮上可查看工具提示的四个方向:顶部、右侧、底部和左侧。在 RTL 中使用 Bootstrap 时,方向会被镜像。
<button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-title="Tooltip on top">
Tooltip on top
</button>
<button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-title="Tooltip on right">
Tooltip on right
</button>
<button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Tooltip on bottom">
Tooltip on bottom
</button>
<button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="left" data-bs-title="Tooltip on left">
Tooltip on left
</button>
并添加了自定义 HTML:
<button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-html="true" data-bs-title="<em>Tooltip</em> <u>with</u> <b>HTML</b>">
Tooltip with HTML
</button>
使用 SVG:
CSS
变量
添加于 v5.2.0作为 Bootstrap 不断发展的 CSS 变量方法的一部分,工具提示现在使用本地 CSS 变量.tooltip
来增强实时自定义。CSS 变量的值是通过 Sass 设置的,因此仍然支持 Sass 自定义。
--#{$prefix}tooltip-zindex: #{$zindex-tooltip};
--#{$prefix}tooltip-max-width: #{$tooltip-max-width};
--#{$prefix}tooltip-padding-x: #{$tooltip-padding-x};
--#{$prefix}tooltip-padding-y: #{$tooltip-padding-y};
--#{$prefix}tooltip-margin: #{$tooltip-margin};
@include rfs($tooltip-font-size, --#{$prefix}tooltip-font-size);
--#{$prefix}tooltip-color: #{$tooltip-color};
--#{$prefix}tooltip-bg: #{$tooltip-bg};
--#{$prefix}tooltip-border-radius: #{$tooltip-border-radius};
--#{$prefix}tooltip-opacity: #{$tooltip-opacity};
--#{$prefix}tooltip-arrow-width: #{$tooltip-arrow-width};
--#{$prefix}tooltip-arrow-height: #{$tooltip-arrow-height};
Sass 变量
$tooltip-font-size: $font-size-sm;
$tooltip-max-width: 200px;
$tooltip-color: var(--#{$prefix}body-bg);
$tooltip-bg: var(--#{$prefix}emphasis-color);
$tooltip-border-radius: var(--#{$prefix}border-radius);
$tooltip-opacity: .9;
$tooltip-padding-y: $spacer * .25;
$tooltip-padding-x: $spacer * .5;
$tooltip-margin: null; // TODO: remove this in v6
$tooltip-arrow-width: .8rem;
$tooltip-arrow-height: .4rem;
// fusv-disable
$tooltip-arrow-color: null; // Deprecated in Bootstrap 5.2.0 for CSS variables
// fusv-enable
用法
工具提示插件按需生成内容和标记,默认情况下将工具提示放在触发元素之后。
通过 JavaScript 触发工具提示:
const exampleEl = document.getElementById('example')
const tooltip = new bootstrap.Tooltip(exampleEl, options)
溢出auto
和scroll
当父容器具有overflow: auto
或overflow: scroll
喜欢我们的时,工具提示位置会尝试自动更改.table-responsive
,但仍保持原始位置的定位。要解决此问题,请将boundary
选项(对于使用选项的翻转修饰符popperConfig
)设置为任何 HTMLElement 以覆盖默认值'clippingParents'
,例如document.body
:
const tooltip = new bootstrap.Tooltip('#example', {
boundary: document.body // or document.querySelector('#boundary')
})
标记
工具提示所需的标记只是一个data
属性,title
您希望在 HTML 元素上有一个工具提示。生成的工具提示标记相当简单,尽管它确实需要一个位置(默认情况下,top
由插件设置)。
使工具提示适用于键盘和辅助技术用户
您应该只将工具提示添加到传统上可通过键盘聚焦和交互的 HTML 元素(例如链接或表单控件)。虽然可以通过添加该属性使任意 HTML 元素(例如<span>
s)成为可聚焦的tabindex="0"
,但这会为键盘用户在非交互元素上添加潜在的烦人和混乱的制表位,并且大多数辅助技术目前不会在这种情况下公布工具提示。此外,不要仅仅依赖于hover
作为工具提示的触发器,因为这将使您的工具提示无法为键盘用户触发。
<!-- HTML to write -->
<a href="#" data-bs-toggle="tooltip" data-bs-title="Some tooltip text!">Hover over me</a>
<!-- Generated markup by the plugin -->
<div class="tooltip bs-tooltip-top" role="tooltip">
<div class="tooltip-arrow"></div>
<div class="tooltip-inner">
Some tooltip text!
</div>
</div>
禁用元素
具有该属性的元素disabled
是不可交互的,这意味着用户无法聚焦、悬停或单击它们来触发工具提示(或弹出窗口)。作为一种解决方法,您需要从包装器中触发工具提示,<div>
或者<span>
理想情况下使用tabindex="0"
.
<span class="d-inline-block" tabindex="0" data-bs-toggle="tooltip" data-bs-title="Disabled tooltip">
<button class="btn btn-primary" type="button" disabled>Disabled button</button>
</span>
选项
由于可以通过数据属性或 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
并且单独的数据属性将覆盖 上给出的值data-bs-config
。此外,现有的数据属性能够容纳 JSON 值,例如data-bs-delay='{"show":0,"hide":150}'
.
sanitize
,不能使用数据属性提供
sanitizeFn
、 和选项。allowList
名称 | 类型 | 默认 | 描述 |
---|---|---|---|
allowList |
目的 | 默认值 | 包含允许的属性和标签的对象。 |
animation |
布尔值 | true |
将 CSS 淡入淡出过渡应用于工具提示。 |
boundary |
字符串,元素 | 'clippingParents' |
工具提示的溢出约束边界(仅适用于 Popper 的 preventOverflow 修饰符)。默认情况下,它'clippingParents' 可以接受 HTMLElement 引用(仅通过 JavaScript)。有关详细信息,请参阅 Popper 的detectOverflow 文档。 |
container |
字符串、元素、假 | false |
将工具提示附加到特定元素。例子:container: 'body' 。此选项特别有用,因为它允许您将工具提示放置在触发元素附近的文档流中 - 这将防止工具提示在窗口调整大小时漂离触发元素。 |
customClass |
字符串、函数 | '' |
显示时将类添加到工具提示。请注意,除了模板中指定的任何类之外,还将添加这些类。要添加多个类,请用空格分隔它们:'class-1 class-2' 。您还可以传递一个函数,该函数应返回包含其他类名的单个字符串。 |
delay |
数字,对象 | 0 |
延迟显示和隐藏工具提示(毫秒)—不适用于手动触发类型。如果提供了数字,延迟将应用于隐藏/显示。对象结构是:delay: { "show": 500, "hide": 100 } . |
fallbackPlacements |
大批 | ['top', 'right', 'bottom', 'left'] |
通过提供数组中的展示位置列表(按优先顺序)来定义后备展示位置。有关更多信息,请参阅 Popper 的行为文档。 |
html |
布尔值 | false |
在工具提示中允许 HTML。如果为真,工具提示中的 HTML 标记title 将在工具提示中呈现。如果为 false,innerText 属性将用于将内容插入 DOM。如果您担心 XSS 攻击,请使用文本。 |
offset |
数组、字符串、函数 | [0, 0] |
工具提示相对于其目标的偏移量。您可以使用逗号分隔值在数据属性中传递一个字符串,例如:data-bs-offset="10,20" 。当一个函数被用来确定偏移量时,它被调用时带有一个包含 popper 位置、引用和 popper rect 的对象作为它的第一个参数。触发元素 DOM 节点作为第二个参数传递。该函数必须返回一个包含两个数字的数组:skidding和distance。有关更多信息,请参阅 Popper 的偏移量文档。 |
placement |
字符串、函数 | 'top' |
如何定位工具提示:自动、顶部、底部、左侧、右侧。指定时auto ,它将动态重新定向工具提示。当一个函数被用来确定位置时,它被调用,工具提示 DOM 节点作为它的第一个参数,触发元素 DOM 节点作为它的第二个参数。this 上下文设置为工具提示实例。 |
popperConfig |
空,对象,函数 | null |
要更改 Bootstrap 的默认 Popper 配置,请参阅Popper 的配置。当一个函数被用来创建 Popper 配置时,它被调用一个包含 Bootstrap 默认 Popper 配置的对象。它可以帮助您使用默认设置并将其与您自己的配置合并。该函数必须返回 Popper 的配置对象。 |
sanitize |
布尔值 | true |
启用或禁用清理。如果激活'template' ,选项将被清除'content' 。'title' |
sanitizeFn |
空,功能 | null |
您可以在此处提供自己的清理功能。如果您更喜欢使用专用库来执行清理,这会很有用。 |
selector |
字符串,假 | false |
如果提供了选择器,工具提示对象将被委托给指定的目标。实际上,这也用于将工具提示应用于动态添加的 DOM 元素(jQuery.on 支持)。请参阅此问题和一个信息示例。注意:title 属性不得用作选择器。 |
template |
细绳 | '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' |
创建工具提示时要使用的基本 HTML。工具提示title 将被注入到.tooltip-inner . .tooltip-arrow 将成为工具提示的箭头。最外面的包装元素应该有.tooltip 类和role="tooltip" 。 |
title |
字符串、元素、函数 | '' |
title 如果属性不存在,则为默认标题值。如果给出了一个函数,它将被调用,其this 引用设置为弹出窗口附加到的元素。 |
trigger |
细绳 | 'hover focus' |
如何触发工具提示:单击、悬停、聚焦、手动。您可以传递多个触发器;用空格分隔它们。'manual' 指示工具提示将通过.tooltip('show') ,.tooltip('hide') 和.tooltip('toggle') 方法以编程方式触发;此值不能与任何其他触发器结合使用。'hover' 单独将导致无法通过键盘触发的工具提示,并且只有在存在为键盘用户传达相同信息的替代方法时才应使用。 |
使用函数popperConfig
const tooltip = new bootstrap.Tooltip(element, {
popperConfig(defaultBsPopperConfig) {
// const newPopperConfig = {...}
// use defaultBsPopperConfig if needed...
// return newPopperConfig
}
})
方法
方法 | 描述 |
---|---|
disable |
删除显示元素工具提示的能力。工具提示只有在重新启用后才能显示。 |
dispose |
隐藏和销毁元素的工具提示(删除 DOM 元素上存储的数据)。使用委托(使用选项创建)的selector 工具提示不能在后代触发元素上单独销毁。 |
enable |
使元素的工具提示能够显示。默认情况下启用工具提示。 |
getInstance |
允许您获取与 DOM 元素关联的工具提示实例的静态方法,或者创建一个新的实例以防未初始化。 |
getOrCreateInstance |
允许您获取与 DOM 元素关联的工具提示实例的静态方法,或者创建一个新的实例以防未初始化。 |
hide |
隐藏元素的工具提示。在工具提示实际上被隐藏之前返回给调用者(即在hidden.bs.tooltip 事件发生之前)。这被认为是工具提示的“手动”触发。 |
setContent |
提供一种在工具提示初始化后更改其内容的方法。 |
show |
显示元素的工具提示。在工具提示实际显示之前(即事件发生之前)返回给调用者。shown.bs.tooltip 这被认为是工具提示的“手动”触发。永远不会显示带有零长度标题的工具提示。 |
toggle |
切换元素的工具提示。在工具提示实际显示或隐藏之前返回给调用者(即在shown.bs.tooltip 或hidden.bs.tooltip 事件发生之前)。这被认为是工具提示的“手动”触发。 |
toggleEnabled |
切换显示或隐藏元素工具提示的能力。 |
update |
更新元素工具提示的位置。 |
const tooltip = bootstrap.Tooltip.getInstance('#example') // Returns a Bootstrap tooltip instance
// setContent example
tooltip.setContent({ '.tooltip-inner': 'another title' })
setContent
方法接受一个object
参数,其中每个属性键都是string
弹出框模板中的有效选择器,并且每个相关的属性值可以是string
| element
| function
|null
事件
事件 | 描述 |
---|---|
hide.bs.tooltip |
hide 调用实例方法时会立即触发此事件。 |
hidden.bs.tooltip |
当弹出框完成对用户隐藏时(将等待 CSS 转换完成),将触发此事件。 |
inserted.bs.tooltip |
show.bs.tooltip 当工具提示模板已添加到 DOM 时,将在该事件之后触发此事件。 |
show.bs.tooltip |
show 调用实例方法时会立即触发此事件。 |
shown.bs.tooltip |
当弹出窗口对用户可见时会触发此事件(将等待 CSS 转换完成)。 |
const myTooltipEl = document.getElementById('myTooltip')
const tooltip = bootstrap.Tooltip.getOrCreateInstance(myTooltipEl)
myTooltipEl.addEventListener('hidden.bs.tooltip', () => {
// do something...
})
tooltip.hide()