VUE 使用element el-tooltip封装多行溢出时显示 不溢出不显示tooltip

在Vue中使用Element UI的el-tooltip组件来封装一个组件,使其在多行文本溢出时显示Tooltip,而在不溢出时不显示,确实需要一些策略来间接判断文本是否溢出。由于CSS的display: -webkit-box; -webkit-line-clamp: N;属性并没有直接提供溢出检测的API,我们通常需要借助其他方法。

以下是一些可能的方法:

1. 预先设定字符长度阈值

这是最简单但不完美的方法。你可以基于你的字体、行高和容器宽度来估算一个字符长度的阈值,当文本长度超过这个阈值时,就认为文本会溢出。

<template>
  <el-tooltip
    v-if="isTextOverflow"
    effect="dark"
    :content="text"
    placement="top"
  >
    <div class="text-wrapper">{{ text }}</div>
  </el-tooltip>
  <div v-else class="text-wrapper">{{ text }}</div>
</template>

<script>
export default {
  props: {
    text: String
  },
  computed: {
    // 假设每行大约的字符数,根据实际情况调整
    charsPerLine() {
      return 30; // 示例值
    },
    // 假设的行数
    lines() {
      return 2;
    },
    isTextOverflow() {
      return this.text.length > this.charsPerLine * this.lines;
    }
  }
}
</script>

<style scoped>
.text-wrapper {
  width: 200px; /* 容器宽度 */
  line-height: 1.5; /* 行高 */
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}
</style>

2. 使用JavaScript测量文本高度

这种方法更复杂但更准确。你可以在文本渲染后,使用JavaScript的getBoundingClientRect()方法测量.text-wrapper元素的实际高度,并将其与预期的高度(基于行高和行数计算)进行比较。

这种方法需要等待DOM元素渲染完成,可以在Vue的mounted钩子或watch属性中使用nextTick来实现。

<template>
  <el-tooltip
    v-if="isTextOverflowComputed"
    effect="dark"
    :content="text"
    placement="top"
  >
    <div class="text-wrapper" ref="textWrapper">{{ text }}</div>
  </el-tooltip>
  <div v-else class="text-wrapper">{{ text }}</div>
</template>

<script>
export default {
  props: {
    text: String
  },
  data() {
    return {
      isTextOverflowComputed: false
    };
  },
  mounted() {
    this.$nextTick(() => {
      this.computeTextOverflow();
    });
  },
  methods: {
    computeTextOverflow() {
      const textWrapper = this.$refs.textWrapper;
      if (!textWrapper) return;

      // 假设的行高和行数
      const lineHeight = parseFloat(getComputedStyle(textWrapper).lineHeight);
      const expectedHeight = lineHeight * 2; // 假设两行

      // 加上一些容差,因为计算样式可能不完全精确
      const tolerance = 2;

      this.isTextOverflowComputed = textWrapper.offsetHeight > expectedHeight + tolerance;
    }
  }
}
</script>

<style scoped>
/* ... 同上 ... */
</style>

3. CSS伪元素和JavaScript结合

这种方法结合了CSS和JavaScript。你可以在CSS中使用伪元素(如::after)来尝试在文本末尾添加更多内容,并检查这是否改变了元素的高度。然而,这种方法比较复杂且可能不太可靠,因为它依赖于CSS渲染的细节。

结论

对于大多数应用场景,使用预先设定的字符长度阈值(方法1)可能已经足够好了。如果你需要更高的准确性,并且可以接受一些性能开销,那么使用JavaScript测量文本高度(方法2)可能是更好的选择。方法3虽然理论上可行,但实现起来较为复杂,且可能不如方法2可靠。

  • 13
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
el-tooltipVue框架中的一个指令,用于在文字溢出展示tooltip提示。可以通过设置元素的宽度和内容的宽度来判断是否需要展示tooltip。如果内容的宽度大于元素的宽度,则展示tooltip提示,否则不展示。可以使用以下代码实现文字溢出的效果: ```css li { overflow: hidden !important; text-overflow: ellipsis !important; display: -webkit-box !important; -webkit-line-clamp: 1 !important; -webkit-box-orient: vertical !important; } ``` 在鼠标移入元素,可以通过比较元素的实际宽度和可视宽度来判断文字是否溢出。如果实际宽度大于可视宽度,则文字溢出,否则不溢出。可以使用以下代码实现: ```javascript visibilityChange(event) { const ev = event.target; const evWeight = ev.scrollWidth; const contentWeight = ev.clientWidth; if (evWeight > contentWeight) { // 实际宽度 > 可视宽度,文字溢出 this.isShowTooltip = false; } else { // 否则为不溢出 this.isShowTooltip = true; } } ``` 当没有传递值给el-tooltip指令,将使用el-tooltip的默认配置,提示内容默认显示指令绑定元素的文本内容。可以使用以下代码实现: ```html <el-input v-model="value" placeholder="请输入内容" style="width: 200px; margin-bottom: 25px"></el-input> <div v-overflow-tooltip class="overflow">{{ value }}</div> ``` 如果需要自定义tooltip的内容、主题、显示位置等参数,可以通过传递参数给el-tooltip指令来实现。可以使用以下代码实现: ```html <el-input v-model="value" placeholder="请输入内容" style="width: 200px; margin-bottom: 25px"></el-input> <div v-overflow-tooltip="{content:'这是通过content自定义的溢出显示内容',effect:'light'}" class="overflow">{{ value }}</div> ``` 以上是关于el-tooltip下文字溢出的一些解决方案和示例代码。希望对你有帮助!\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [Vue 设置el-tooltip根据文字溢出...显示](https://blog.csdn.net/CCC_chtt/article/details/130345523)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [自定义vue指令,实现el-tooltip仅在文字溢出显示,文字未溢出则不显示,复制即可使用](https://blog.csdn.net/qq1219579255/article/details/129446532)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值