@nuogz/vue-tip

Tips component based on Vue.js 3.x


License
Other
Install
npm install @nuogz/vue-tip@1.1.4

Documentation

Important

本库使用了2025最新的CSS特性,不适合用于生产环境。
This library uses the latest 2025 CSS features and is not suitable for production environments.

本库功能仍有部分功能未完成文档尚未完成。
This library has some features that are not finished yet.

后续将提供机器翻译的英文版。
A machine-translated English version will be provided later.

@nuogz/web-app-tip 贴纸

Version License

Tips component for displaying extra info on the interface in Nuogz Web App, based on CSS Anchor Positioning and Vue 3
贴纸用于在界面中显示额外的信息,提供即时的指引或补充说明,以辅助用户理解和使用功能。用于Nuogz Web App,基于CSS Anchor Positioning、Vue3、UnoCSS

经过一系列的迭代,从原来的提示组件vue-tip升级重构为全新的web-app-tip

web-app-tip已弃用tippy.js,改为使用最新的CSS锚点定位(CSS Anchor Positioning)语法作为核心实现。
额外功能与Vue内置的功能进行结合,最大程度地不影响Vue的渲染逻辑

基础示例:

<!-- index.vue -->
<template>
  <AppOrbit>...</AppOrbit>

  <AppTip />
</template>
<script setup>
  import AppTip, { install as installAppTip } from '@nuogz/web-app-tip';

  // 需要createApp后通过provide()提供app实例
  // 在createApp后立即install也是可以的
  const app = inject('app');
  installAppTip(app);
</script>

贴纸分为两部分,自定义指令v-tip与组件<AppTip>v-tip指令通过install函数安装。 <AppTip>组件用于动态渲染展示贴纸所需要的HTML元素。

请将<AppTip>置于app的根元素下

DOM结构

  • body
    • app (index.vue)
      • (module.vue)
      • app-tip-box
        • app-tip (或teleport模板内容)
        • app-tip-shadow (用于自动位置功能的相交检测)

如果app使用天轨Orbit组件,那么DOM结构如下:

  • body
    • app (index.vue)
      • app-moon
      • app-main
        • (module.vue)
      • app-moon
      • app-tip-box
        • app-tip (或teleport模板内容)
      • app-tip-shadow (用于自动位置功能的相交检测)

注意:相关元素会根据实际调用次数增多,一个指令对应一套元素。并不是单例模式

配置方法

根据Vue指令的语法设计,我们可以通过三种途径配置app-tip

<button v-tip:[arg].modifier="value">Im a button</button>

value

指定Tip的显示内容。传入的内容最终会在模板中以{{ value }}的形式展示

modifiers 修饰符

修饰符用于指定启用/禁用某个特性。具体修饰符的功能请继续查看下面各项功能的说明

arg 动态参数

利用Vue指令中的动态参数语法,我们可以传入一个TipArg对象来更详细地配置各项tip特性

在Vue的文档和types中,arg的类型一直是string。但经过实测向arg传递object是有效。
不排除以后此途径会失效。届时需要迁移到其他路径

功能与参数说明

0、显示内容

显示额外内容是贴纸的核心基础功能,支持多种来源

value

基础用法

<button v-tip="'Im a tip'">Im a button</button>

arg.value

通过TipArg.value传入

<template>
  <button v-tip:[arg]>Im a button</button>
</template>
<script setup>
  const arg = ref({ value: 'Im a tip' });
</script>

模板内容

此功能用于显示实时渲染的Vue模板

为了避免入侵Vue的渲染逻辑,其核心功能将使用Vue内置的<Teleport>组件实现

由于<Teleport>目标元素必须与<Teleport>在同一个挂载/更新周期内渲染
要使用该功能,必须向v-tip传递一个TipArg,且TipArg.teleport设置为true
当对应的<app-tip-box>渲染后,贴纸会将<app-tip-box>传递到TipArg.teleportTo中。
在渲染前,仍需向<Teleport>to属性提供有效值以过渡,如body

最佳实践:

<template>
  <button v-tip:[arg]>Im a button</button>

  <Teleport :to="$tip.teleportTo || 'body'">
    <span>Im a template tip</span>
  </Teleport>
</template>
<script setup>
  const arg = ref({ teleport: true });
</script>

在一般情况下,将<Teleport>to属性短暂地设置为其他过渡用元素(如body)并不会造成闪烁。
但在极端情况下,渲染效率低,待传送的内容仍可能会因为停留在过渡用元素太久,
导致传送内容被渲染到视口中,最后造成产生闪烁。

若过渡用元素本身是隐藏的,则不受影响

此时可以通过对<Teleport>追加disableddefer属性来避免闪烁:

<Teleport :to="..."
  defer :disabled="$tip.teleportTo ? false : true"
>...</Teleport>

1、位置

area 默认值:top center

作用 修饰符
top 居上 .top
bottom 居下 .bottom
center 居中 .center
left 居左 .left
right 居右 .right

位置功能依赖于CSS的position-area。因此area也可以组合地使用span-*,如设置为top span-right。 通常情况下显示的位置是正确的。但是自动位置功能是代码实时检后测调整的,并未对span-*进行完整的兼容,可能会意外的行为。

2、自动位置

autoArea 默认值:true

当检测到Tip开始离开视口时,会自动调整Tip位置到新的位置,以尝试完成显示Tip

特性 作用 修饰符
true 离开视口时自动调整位置 -
false 什么都不做 .noAutoArea

CSS anchor positioning有提供position-try等属性用于自动调整位置。
但目前相关属性的效果并不理想,因此没有将其纳入此次重构中,转为通过IntersectionObserver实现

3、悬停行为

hover 默认值:show

作用 修饰符
false 什么都不做 .noHoverShow
show 显示Tip(离开隐藏) -
pin 显示Tip(离开不隐藏) .hoverPin

4、点击行为

click 默认值:false

特性 作用 修饰符
false 什么都不做 -
pin-flip 切换Tip(离开不隐藏) .clickPinFlip
pin 显示Tip(离开不隐藏) .clickPin
show-flip 切换Tip(离开隐藏) .clickShowFlip
show 显示Tip(离开隐藏) .clickShow

click:show-flip|show适用于hover:false的情况,否则行为会被hover:show覆盖

5、全局隐藏

hide$clickGlobal 默认值:true

当Tip固定时,默认全局其他任意元素点击后隐藏Tip,以模拟离开且失焦

  • 按下后触发滚动,不会导致解除
  • 当点击是目标元素或Tip元素时,不会导致解除
特性 作用 修饰符
true 固定后全局任意点击解除固定 -
false 什么都不做 .noUnpinGlobal

6、侦听arg参数

watchArg 默认值:false

当指令的arg部分传入一个对象,对象内部变化后,不会触发指令的update事件(即使传入的是一个reactive对象)。 在当前的Vue版本中,当指令的参数部分v-tip:[arg]是一个对象时,即使该对象是响应式的,其内部属性的变化也不会触发指令的update钩子函数。 此时可配置watchArg:true或修饰符.watchArg,对arg对象进行深度侦听。

特性 作用 修饰符
true 对arg对象进行深度侦听 .watchArg
false 什么都不做 -

7、禁止交互

intangible 默认值:false

特性 作用 修饰符
false 什么都不做 -
truetip 禁止app-tip进行交互 .intang
box 禁止与app-tip-box进行交互 .intangBox

可否与内在元素交互

8、主题

theme 默认值:base

支持自定义主题,通过[theme=主题名]定义

默认主题通过CSS变量--app-tip-back: var(--contrast)来定义背景,你随时可以覆盖这个变量

主题不适用于模板内容

特性 作用 修饰符
base 默认主题 -
base-nowarp 默认主题(不换行) .nowrap
<template>
  <button v-tip:[arg]>Im a button</button>
</template>
<script setup>
  const arg = ref({ theme: 'test' });
</script>
<style lang="sass" scoped>
:global(app-tip[theme=test])
  @apply p-2 py-1.5 bg-green-4 rounded-lg shadow-d1-md ws-pre
</style>

因为贴纸是<app>子元素,所以需要将主题提升到全局。
建议将主题样式放置在全局位置,或者使用足够独特的名字。不要像演示这样在某个单文件组件中定义

9、偏移

offset 默认值:4

贴纸与目标元素的间隔。会位置自动调整间隔的位置

本质是css长度单位。
如果是number类型,会自动补全px单位。
如果是string类型,则不会做任何修改

10、箭头

arrow 默认值:true

在贴纸和目标元素之间显示指向目标元素的三角箭头

已支持在四角位置、span位置显示三角箭头

特性 作用 修饰符
true 在贴纸和目标元素之间显示三角箭头 -
false 不显示三角箭头 .noArrow

11、访问实例

refInstance 默认值:null

在一些需要手动控制贴纸显示的常见下,需要直接访问实例。此时可以TipArg.refInstance传递true或一个回调函数,当实例初始化完毕后,会返回Tip实例:

特性 回调方式
true TipArg.instance = tip;
(tip) => {} 调用函数

CSS变量

贴纸抽象了设计了CSS变量,以方便调整显示

CSS变量 作用 默认值
--app-tip-text base主题下的文字颜色 var(--main-back)
--app-tip-back base主题下的背景颜色 var(--main-solid)
--app-tip-arrow-size 箭头尺寸 4px