Tooltip 文字提示
常用于展示鼠标 hover 时的提示信息。
基础用法
在这里我们提供 9 种不同方向的展示方式,可以通过以下完整示例来理解,选择你要的效果。
使用 content
属性来决定 hover
时的提示信息。 由 placement
属性决定展示效果: placement
属性值为:[方向]-[对齐位置]
;四个方向:top
、left
、right
、bottom
;三种对齐位置:start
, end
,默认为空。 如 placement="left-end"
,则提示信息出现在目标元素的左侧,且提示信息的底部与目标元素的底部对齐。
<template>
<div class="tooltip-base-box">
<div class="row center">
<el-tooltip
class="box-item"
effect="dark"
content="Top Left prompts info"
placement="top-start"
>
<el-button>top-start</el-button>
</el-tooltip>
<el-tooltip
class="box-item"
effect="dark"
content="Top Center prompts info"
placement="top"
>
<el-button>top</el-button>
</el-tooltip>
<el-tooltip
class="box-item"
effect="dark"
content="Top Right prompts info"
placement="top-end"
>
<el-button>top-end</el-button>
</el-tooltip>
</div>
<div class="row">
<el-tooltip
class="box-item"
effect="dark"
content="Left Top prompts info"
placement="left-start"
>
<el-button>left-start</el-button>
</el-tooltip>
<el-tooltip
class="box-item"
effect="dark"
content="Right Top prompts info"
placement="right-start"
>
<el-button>right-start</el-button>
</el-tooltip>
</div>
<div class="row">
<el-tooltip
class="box-item"
effect="dark"
content="Left Center prompts info"
placement="left"
>
<el-button class="mt-3 mb-3">left</el-button>
</el-tooltip>
<el-tooltip
class="box-item"
effect="dark"
content="Right Center prompts info"
placement="right"
>
<el-button>right</el-button>
</el-tooltip>
</div>
<div class="row">
<el-tooltip
class="box-item"
effect="dark"
content="Left Bottom prompts info"
placement="left-end"
>
<el-button>left-end</el-button>
</el-tooltip>
<el-tooltip
class="box-item"
effect="dark"
content="Right Bottom prompts info"
placement="right-end"
>
<el-button>right-end</el-button>
</el-tooltip>
</div>
<div class="row center">
<el-tooltip
class="box-item"
effect="dark"
content="Bottom Left prompts info"
placement="bottom-start"
>
<el-button>bottom-start</el-button>
</el-tooltip>
<el-tooltip
class="box-item"
effect="dark"
content="Bottom Center prompts info"
placement="bottom"
>
<el-button>bottom</el-button>
</el-tooltip>
<el-tooltip
class="box-item"
effect="dark"
content="Bottom Right prompts info"
placement="bottom-end"
>
<el-button>bottom-end</el-button>
</el-tooltip>
</div>
</div>
</template>
<style>
.tooltip-base-box {
width: 600px;
}
.tooltip-base-box .row {
display: flex;
align-items: center;
justify-content: space-between;
}
.tooltip-base-box .center {
justify-content: center;
}
.tooltip-base-box .box-item {
width: 110px;
margin-top: 10px;
}
</style>
主题
Tooltip 组件内置了两个主题:dark
和light
。
TIP
要使用自定义主题,您必须知道您的工具提示在哪里渲染, 如果您的工具提示被呈现为根元素,您将需要全局设置css规则。
建议您使用自定义主题并同时显示箭头时不使用线性渐变背景颜色。 因为弹出箭头和内容是两个不同的元素, 弹出箭头的样式需要单独设置, 当它到渐变背景颜色时,会看起来很奇怪。
通过设置 effect
来修改主题,默认值为 dark
.
<template>
<el-tooltip content="Top center" placement="top">
<el-button>Dark</el-button>
</el-tooltip>
<el-tooltip content="Bottom center" placement="bottom" effect="light">
<el-button>Light</el-button>
</el-tooltip>
<el-tooltip content="Bottom center" effect="customized">
<el-button>Customized theme</el-button>
</el-tooltip>
</template>
<style>
.el-popper.is-customized {
/* Set padding to ensure the height is 32px */
padding: 6px 12px;
background: linear-gradient(90deg, rgb(159, 229, 151), rgb(204, 229, 129));
}
.el-popper.is-customized .el-popper__arrow::before {
background: linear-gradient(45deg, #b2e68d, #bce689);
right: 0;
}
</style>
更多内容的文字提示
展示多行文本或者是设置文本内容的格式
用具名 slot content
,替代tooltip
中的content
属性。
<template>
<el-tooltip placement="top">
<template #content> multiple lines<br />second line </template>
<el-button>Top center</el-button>
</el-tooltip>
</template>
高级扩展
除了这些基本设置外,还有一些属性可以让使用者更好的定制自己的效果:
transition
属性可以定制显隐的动画效果,默认为fade-in-linear
。
如果需要关闭 tooltip
功能,disabled
属性可以满足这个需求, 你只需要将其设置为 true
。
事实上,Tooltip 是一个基于 ElPopper 的扩展,您可以使用 ElPopper 中允许的任何属性。
<template>
<el-tooltip
:disabled="disabled"
content="click to close tooltip function"
placement="bottom"
effect="light"
>
<el-button @click="disabled = !disabled"
>click to {{ disabled ? 'active' : 'close' }} tooltip function</el-button
>
</el-tooltip>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
const disabled = ref(false)
</script>
<style>
.slide-fade-enter-active {
transition: all 0.3s ease;
}
.slide-fade-leave-active {
transition: all 0.3s cubic-bezier(1, 0.5, 0.8, 1);
}
.slide-fade-enter,
.expand-fade-leave-active {
margin-left: 20px;
opacity: 0;
}
</style>
TIP
Tooltip 内不支持 router-link
组件,请使用 vm.$router.push
代替。
tooltip 内不支持 disabled form 元素,参考 MDN , 请在 disabled form 元素外层添加一层包裹元素。
显示 HTML 内容
内容属性可以设置为 HTML 字符串。
WARNING
content
属性虽然支持传入 HTML 片段,但是在网站上动态渲染任意 HTML 是非常危险的,因为容易导致 XSS 攻击 。 因此在 raw-content
打开的情况下,请确保 content
的内容是可信的,永远不要将用户提交的内容赋值给 content
属性。
<template>
<el-tooltip
content="<span>The content can be <strong>HTML</strong></span>"
raw-content
>
<el-button>hover me</el-button>
</el-tooltip>
</template>
虚拟触发
有时候我们想把 tooltip 的触发元素放在别的地方,而不需要写在一起,这时候就可以使用虚拟触发。
TIP
需要注意的是,虚拟触发的 tooltip 是受控组件,因此你必须自己去控制 tooltip 是否显示,你将无法通过点击空白处来关闭 tooltip。
<template>
<el-tooltip
v-model:visible="visible"
content="Bottom center"
placement="bottom"
effect="light"
trigger="click"
virtual-triggering
:virtual-ref="triggerRef"
/>
<el-button @click="visible = !visible">test</el-button>
</template>
<script setup lang="ts">
import { onMounted, ref } from 'vue'
const visible = ref(false)
const triggerRef = ref({
getBoundingClientRect() {
return position.value
},
})
const position = ref({
top: 0,
left: 0,
bottom: 0,
right: 0,
})
onMounted(() => {
document.addEventListener('mousemove', (e) => {
position.value = DOMRect.fromRect({
width: 0,
height: 0,
x: e.clientX,
y: e.clientY,
})
})
})
</script>
单例模式
Tooltip 可以作为单例,也就是是说你可以同时有多个触发同一个 tooltip 的触发元素,这个功能是在 虚拟触发
的基础上开发的。
TIP
已知问题:当使用单例模式时,tooltip 的触发元素发生改变的时候可能会发生弹跳。
<template>
<div>
<el-button
v-for="i in 3"
:key="i"
@mouseover="(e) => (buttonRef = e.currentTarget)"
@click="visible = !visible"
>Click to open tooltip</el-button
>
</div>
<el-tooltip
ref="tooltipRef"
v-model:visible="visible"
:popper-options="{
modifiers: [
{
name: 'computeStyles',
options: {
adaptive: false,
enabled: false,
},
},
],
}"
:virtual-ref="buttonRef"
virtual-triggering
trigger="click"
popper-class="singleton-tooltip"
>
<template #content>
<span> Some content </span>
</template>
</el-tooltip>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const buttonRef = ref()
const tooltipRef = ref()
const visible = ref(false)
</script>
<style>
.singleton-tooltip {
transition: transform 0.3s var(--el-transition-function-fast-bezier);
}
</style>
受控模式
Tooltip 可以通过父组件使用 :visible
来控制它的显示与关闭。
<template>
<el-tooltip :visible="visible">
<template #content>
<span>Content</span>
</template>
<el-button @mouseenter="visible = true" @mouseleave="visible = false">
Hover me
</el-button>
</el-tooltip>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const visible = ref(false)
</script>
自定义动画
工具提示可以自定义动画,您可以按照自己的愿望设置所需的动画功能。
<template>
<el-tooltip content="I am an el-tooltip">
<el-button>trigger me</el-button>
</el-tooltip>
</template>
<script lang="ts" setup></script>
属性
属性 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
append-to | 指示 Tooltip 的内容将附加在哪一个网页元素上 | CSSSelector \ | HTMLElement | — |
effect | Tooltip 主题,内置了 dark / light 两种 | string | string | dark |
content | 显示的内容,也可被 slot#content 覆盖 | String | — | — |
raw-content | content 中的内容是否作为 HTML 字符串处理 | boolean | — | false |
placement | Tooltip 组件出现的位置 | string | top/top-start/top-end/bottom/bottom-start/bottom-end/left/left-start/left-end/right/right-start/right-end | bottom |
visible / v-model:visible | Tooltip 组件可见性 | boolean | — | false |
disabled | Tooltip 组件是否禁用 | boolean | — | false |
offset | 出现位置的偏移量 | number | — | 0 |
transition | 动画名称 | string | — | el-fade-in-linear |
visible-arrow (will deprecate in 2.1.0 ) | 是否显示箭头。 想了解更多信息,请查看 ElPopper 页面 | boolean | — | true |
popper-options | popper.js 参数 | Object | 请参考 popper.js 文档 | { boundariesElement: ‘body’, gpuAcceleration: false } |
show-after | 延迟出现,单位毫秒 | number | — | 0 |
show-arrow | tooltip 的内容是否有箭头 | boolean | true / false | true |
hide-after | 延迟关闭,单位毫秒 | number | — | 200 |
auto-close | tooltip 出现后自动隐藏延时,单位毫秒 | number | — | 0 |
manual | 是否手动控制 Tooltip。 如果设置为 true ,mouseenter 和 mouseleave 将不会生效 | boolean | — | false |
popper-class | 为 Tooltip 的 popper 添加自定义类名 | string | — | — |
enterable | 鼠标是否可进入到 tooltip 中 | Boolean | — | true |
tabindex | Tooltip 的 tabindex | number | — | 0 |
teleported | 是否使用 teleport。设置成 true 则会被追加到 append-to 的位置 | boolean | true / false | true |
trigger | 如何触发 tooltip (来显示) | string | hover / click / focus / contextmenu | hover |
virtual-triggering | 用来标识虚拟触发是否被启用 | boolean | — | false |
virtual-ref | 表明 tooltip 绑定到哪个 html 元素 | HTMLElement | — | — |
trigger-keys | 当鼠标点击或者聚焦在触发元素上时, 可以定义一组键盘按键并且通过它们来控制 Tooltip 的显示 | Array | — | [‘Enter’,’Space’] |
插槽
插槽名 | 说明 |
---|---|
— | Tooltip 触发 & 引用的元素 |
content | 自定义内容 |