Skip to content
本页目录

js 根据文本是否溢出 判断是否显示 el-tooltiptitle

封装组件

vue
<script setup lang="ts">
import { ref } from 'vue'

const props = defineProps(['title'])
const disabled = ref(true)

/** 获取dom的样式 */
const getStyle = (dom, attr) => getComputedStyle(dom, null)[attr]

const handleMouseenter = (e) => {
  if (!props.title) return

  const cellChild = e.target.children[0]

  /** range 表示文档的一个区域 */
  const range = document.createRange()
  range.setStart(cellChild, 0)
  range.setEnd(cellChild, cellChild.childNodes.length)

  const flag = getStyle(cellChild, '-webkit-line-clamp')

  if (flag === 'none') {
    /** rangeWidth 表示元素内容的宽度 */
    const rangeWidth = range.getBoundingClientRect().width

    const pl = getStyle(cellChild, 'paddingLeft')
    const pr = getStyle(cellChild, 'paddingRight')
    const padding = Number.parseInt(pl) + Number.parseInt(pr)

    /**
     * cellChild.offsetWidth 表示选定区域的宽度
     * 如果 元素内容的宽度 > (选定区域的宽度 - padding值) 就显示 tooltip
     */
    if (rangeWidth > cellChild.offsetWidth - padding) {
      // 显示 tooltip
      disabled.value = false
    }
  }
  else {
    /** rangeHeight 表示元素内容的高度 */
    const rangeHeight = range.getBoundingClientRect().height

    const pt = getStyle(cellChild, 'paddingTop')
    const pb = getStyle(cellChild, 'paddingBottom')
    const padding = Number.parseInt(pt) + Number.parseInt(pb)

    // cellChild.offsetHeight 表示选定区域的高度
    if (rangeHeight > cellChild.offsetHeight - padding) {
      // 显示tooltip
      disabled.value = false
    }
  }
}

const mouseleave = () => disabled.value = true
</script>

<template>
  <div @mouseenter="handleMouseenter" @mouseleave="mouseleave">
    <ElTooltip placement="top" :disabled="disabled" :content="props.title">
      <slot />
    </ElTooltip>
  </div>
</template>

使用

这是一条测试

这只伶俐的棕色狐狸跳过一只懒惰的狗

这只伶俐的棕色狐狸跳过一只懒惰的狗abcdefghijklmnopqrstuvwxyz

这只伶俐的棕色狐狸跳过一只懒惰的狗abcdefghijklmnopqrstuvwxyz

<script setup lang="ts">
import Tooltip from './ToolTip.vue'
</script>

<template>
  <div class="flex flex-col gap-4 divide-y-2 divide-blue ">
    <Tooltip title="这是一条测试">
      <p class="w-100px overflow !m-0">
        这是一条测试
      </p>
    </Tooltip>

    <Tooltip title="这只伶俐的棕色狐狸跳过一只懒惰的狗">
      <p class="w-100px overflow !m-0">
        这只伶俐的棕色狐狸跳过一只懒惰的狗
      </p>
    </Tooltip>

    <Tooltip title="这只伶俐的棕色狐">
      <p class="w-100px overflow !m-0">
        这只伶俐的棕色狐狸跳过一只懒惰的狗abcdefghijklmnopqrstuvwxyz
      </p>
    </Tooltip>

    <Tooltip title="这只伶俐的棕色狐狸跳过一只懒惰的狗abcdefghijklmnopqrstuvwxyz">
      <p class="w-100px overflow !m-0">
        这只伶俐的棕色狐狸跳过一只懒惰的狗abcdefghijklmnopqrstuvwxyz
      </p>
    </Tooltip>
  </div>
</template>

<style lang="scss" scoped>
.overflow {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
</style>