VUE动态tooltip指令

本文介绍了如何在Vue应用中实现一个动态的tooltip指令,支持元素缩略显示时鼠标悬浮显示,提供单行或多行文本支持,并能根据指定方向调整位置,超出屏幕范围时自动偏移。
摘要由CSDN通过智能技术生成

VUE动态tooltip指令

当元素被缩略显示时,鼠标悬浮才显示tip
支持单行和多行缩略,支持设置方向,超出屏幕自动偏移

import Vue from 'vue'
Vue.directive('title', {
  bind(el, binding) {
    let showTimeout = null
    if (!binding.value) {
      console.warn('请设置要显示的tip')
    }
    // 创建tooltip元素并设置样式
    const tooltip = document.createElement('div')

    tooltip.className = 'v-title'

    tooltip.style.position = 'absolute'
    tooltip.style.opacity = '0' // 设为0开始时不可见
    tooltip.style.transition = 'opacity 0.3s ease-in-out' // 添加过渡效果
    tooltip.style.backgroundColor = '#3b3744e6'
    tooltip.style.color = 'white'
    tooltip.style.padding = '4px 8px'
    tooltip.style.borderRadius = '4px'
    tooltip.style.whiteSpace = 'nowrap'
    tooltip.style.fontSize = '14px'
    tooltip.style.zIndex = '1000' // 确保tooltip在最上层

    tooltip.innerText = binding.value?.text || binding.value // 使用传入的title文本

    const directions = ['top', 'bottom', 'left', 'right'] // 支持的方向
    const defaultDirection = 'top' // 默认方向

    // 设置的方向
    const direction = directions.includes(binding.value?.direction) ? binding.value.direction : defaultDirection

    // 将tooltip作为自定义属性存储在元素上
    el.__vue_tooltip__ = tooltip
    el.__vue_showTimeout__ = showTimeout
    document.body.appendChild(tooltip)

    // 定义一个方法,检查是否需要显示tooltip
    const shouldShowTooltip = () => {
      // 创建一个临时span来计算完整内容的宽度
      // const range = document.createRange()
      // range.selectNodeContents(el)
      // const contentWidth = range.getBoundingClientRect().width
      // range.detach()

      // // 获取元素的computed style
      // const computedStyle = window.getComputedStyle(el)

      // // 从computed style中提取padding值
      // const paddingLeft = parseInt(computedStyle.paddingLeft, 10)
      // const paddingRight = parseInt(computedStyle.paddingRight, 10)

      // // 计算元素的内容区域宽度,减去padding
      // const contentAreaWidth = el.offsetWidth - paddingLeft - paddingRight

      // // 比较内容宽度和元素的可视宽度
      // return contentWidth > contentAreaWidth
      const overflow = el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;

      // const overflow = el.scrollWidth > el.clientWidth
      return overflow
    }

    // 鼠标进入时可能显示tooltip
    el.addEventListener('mouseenter', function () {
      // debugger
      if (!shouldShowTooltip()) {
        // 如果不需要显示tooltip,什么也不做
        return
      }

      // 取消之前的延时(如果有)
      clearTimeout(el.__vue_showTimeout__)

      // 延迟显示tooltip
      el.__vue_showTimeout__ = setTimeout(() => {
        const elRect = el.getBoundingClientRect()
        const tooltipRect = tooltip.getBoundingClientRect()

        let leftPos, topPos
        const margin = 10 // Tooltip与目标元素的间距

        switch (direction) {
          case 'top':
            leftPos = elRect.left + elRect.width / 2 - tooltipRect.width / 2
            topPos = window.scrollY + elRect.top - tooltipRect.height - margin
            break
          case 'bottom':
            leftPos = elRect.left + elRect.width / 2 - tooltipRect.width / 2
            topPos = window.scrollY + elRect.bottom + margin
            break
          case 'left':
            leftPos = elRect.left - tooltipRect.width - margin
            topPos = window.scrollY + elRect.top + elRect.height / 2 - tooltipRect.height / 2
            break
          case 'right':
            leftPos = elRect.right + margin
            topPos = window.scrollY + elRect.top + elRect.height / 2 - tooltipRect.height / 2
            break
        }

        // 确保tooltip在屏幕范围内
        const minLeft = 10
        const maxRight = window.innerWidth - tooltipRect.width - 10

        if (leftPos < minLeft) {
          // 如果tooltip超出屏幕左侧
          leftPos = minLeft
        } else if (leftPos > maxRight) {
          // 如果tooltip超出屏幕右侧
          leftPos = maxRight
        }

        tooltip.style.left = `${leftPos}px`
        tooltip.style.top = `${topPos}px`
        tooltip.style.opacity = '1'
      }, 500) // 延迟显示tooltip,例如500毫秒延迟
    })

    // 鼠标离开时隐藏tooltip
    el.addEventListener('mouseleave', function () {
      clearTimeout(el.__vue_showTimeout__)
      tooltip.style.opacity = '0'
    })
  },
  update(el, binding) {
    // 更新tooltip的文本
    const tooltip = el.__vue_tooltip__
    if (tooltip) {
      tooltip.innerText = binding.value
    }
  },
  unbind(el) {
    // 清除
    const tooltip = el.__vue_tooltip__
    const showTimeout = el.__vue_showTimeout__
    if (tooltip) {
      document.body.removeChild(tooltip)
      delete el.__vue_tooltip__
    }
    if (showTimeout) {
      clearTimeout(showTimeout)
      delete el.__vue_showTimeout__
    }
  },
})


  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue中的Tooltip是一种用于在鼠标悬停在元素上时显示信息的工具。有很多第三方库可以帮助实现Tooltip效果,比如Vuetify和Element UI。 在Vuetify中,你可以使用v-tooltip指令来创建Tooltip。首先,在Vue组件中导入Vuetify库,并在模板中使用v-tooltip指令,如下所示: ```vue <template> <div> <v-tooltip top> <template v-slot:activator="{ on }"> <v-btn v-on="on">Hover Me</v-btn> </template> <span>Tooltip Content</span> </v-tooltip> </div> </template> <script> import 'vuetify/dist/vuetify.min.css'; import Vue from 'vue'; import Vuetify from 'vuetify'; Vue.use(Vuetify); export default { // 组件逻辑 } </script> ``` 在上面的示例中,我们使用了Vuetify的v-tooltip指令来创建一个Tooltip。当鼠标悬停在按钮上时,Tooltip将显示"Tooltip Content"。 如果你使用的是Element UI,它也提供了类似的Tooltip组件。你可以使用el-tooltip标签来创建Tooltip,如下所示: ```vue <template> <div> <el-tooltip effect="dark" content="Tooltip Content" placement="top"> <el-button>Hover Me</el-button> </el-tooltip> </div> </template> <script> import 'element-ui/lib/theme-chalk/index.css'; import Vue from 'vue'; import ElementUI from 'element-ui'; Vue.use(ElementUI); export default { // 组件逻辑 } </script> ``` 在上面的示例中,我们使用了Element UI的el-tooltip标签来创建一个Tooltip。当鼠标悬停在按钮上时,Tooltip将显示"Tooltip Content"。 以上是使用Vuetify和Element UI创建Tooltip的基本示例,你可以根据自己的需求进行定制和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值