Skip to content
文章目录

js根据文本是否溢出--判断是否显示el-tooltip或title

代码

vue
<template>
  <div @mouseenter="handleMouseenter" @mouseleave="mouseleave">
    <el-tooltip placement="top" :disabled="disabled" :content="props.content">
      <slot></slot>
    </el-tooltip>
  </div>
</template>

<script setup>
import { ref } from 'vue'

const props = defineProps({
  content: {
    type: String,
    default: '',
  },
})

const disabled = ref(true)

const handleMouseenter = e => {
  if (!props.content) {
    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
    let padding =
      (parseInt(getStyle(cellChild, 'paddingLeft')) || 0) + (parseInt(getStyle(cellChild, 'paddingRight')) || 0)

    // cellChild.offsetWidth 表示选定区域的宽度
    if (rangeWidth > cellChild.offsetWidth - padding) {
      // 显示tooltip
      disabled.value = false
    }
  } else {
    // rangeHeight 表示元素内容的高度
    const rangeHeight = range.getBoundingClientRect().height
    let padding =
      (parseInt(getStyle(cellChild, 'paddingTop')) || 0) + (parseInt(getStyle(cellChild, 'paddingBottom')) || 0)

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

const mouseleave = () => {
  disabled.value = true
}

// 获取dom的样式
const getStyle = (dom, attr) => {
  return getComputedStyle(dom, null)[attr]
}
</script>

参考资料

js 根据文本是否溢出,判断是否显示 el-tooltip、title