当前位置: 首页 > news >正文

vue3二次封装tooltip实现el-table中的show-overflow-tooltip效果

开发过程中遇到需要根据后端返回的数据长度来判断是否需要使用el-tooltip的情况,想到el-table里面就有这种交互效果,如果不论文字是否超出容器长度都展示tooltip的话,交互效果难免会差很多,所以二次封装了这个组件:

  1. 给目标容器绑定mouseenter事件
  2. 鼠标移入后克隆一下目标元素,并取消该元素的宽度样式
  3. 将克隆元素插入到页面中
  4. 获取克隆元素的文字后将元素从页面移除
  5. 用文字所占宽度跟容器宽度进行对比,判断展示tooltip

注意:二次封装的组件需要接收一个双向绑定的disabled变量,该示例比较简单,大家可以根据自己的需要对组件接收的字段进行补充

代码如下:

<template>
  <el-tooltip
    :show-after="300"
    :disabled="disabled"
    :content="content"
    placement="top"
  >
    <div class="ellipsis" @mouseenter="handleMouseSource">
      {{ content }}
    </div>
  </el-tooltip>
</template>

<script setup>
const props = defineProps({
  disabled: {
    type: Boolean,
    default: false,
  },
  content: {
    type: String,
    default: "",
  },
});
// 注意disabled是双向绑定的,使用该组件时要用v-model:disabled = disabled
const emits = defineEmits(["update:disabled"]);

// 判断当前tooltip是否显示
const handleMouseSource = (e) => {
  // 克隆原始div,但移除宽度样式(如果需要的话,也可以移除其他可能影响宽度的样式)
  const cloneDiv = e.target.cloneNode(true);
  // 移除克隆div的宽度样式,以确保它能根据内容扩展
  cloneDiv.style.width = "fit-Content"; // 设置克隆元素的宽度为内容宽度
  cloneDiv.style.visibility = "hidden"; // 隐藏克隆div,避免它影响页面布局
  cloneDiv.style.position = "absolute"; // 将其定位到页面外,避免滚动条等问题
  cloneDiv.style.left = "-9999px"; // 将其移动到屏幕外

  // 将克隆div添加到文档中(为了测量,但不在页面上显示)
  document.body.appendChild(cloneDiv);

  // 获取克隆div的宽度,这就是文字所占的宽度
  const textWidth = cloneDiv.offsetWidth;

  // 从文档中移除克隆div
  document.body.removeChild(cloneDiv);

  //  对比div容器的宽度和文本的宽度,如果文本宽度>=容器宽度,则展示tooltip
  emits("update:disabled", textWidth >= e.target.clientWidth);
};
</script>

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

相关文章:

  • 003 SpringCloud整合-LogStash安装及ELK日志收集
  • Spring Boot集成JWT:打造安全的RESTful API
  • Linux上离线安装PyTorch教程:No module named ‘_bz2:No module named ‘_lzma‘
  • 单元测试mock
  • 蓝桥杯备考:特殊01背包问题——》集合subset
  • 两款软件助力图片视频去水印及图像编辑
  • PHP转GO Go语言环境搭建(Day1) 常见问题及解决方案指南
  • Node.js系列(3)--集群部署指南
  • K8S-etcd服务无法启动问题排查
  • Android audio(8)-native音频服务的启动与协作(audiopolicyservice和audioflinger)
  • 网络华为HCIA+HCIP VLAN间通信
  • ubuntu下TFTP服务器搭建
  • [GHCTF 2025]Goph3rrr [127.0.0.1绕过][env命令查找flag]
  • 如何让焦虑为城市供能 | 杂谈
  • windows上LISTENER监听器中显示“监听程序不支持服务”
  • hackmyvm-Smol
  • C++ 语法之函数和函数指针
  • 百度OCR调用记录
  • 荣耀手机怎么录制屏幕?屏幕录制后为视频加水印更有“安全感”
  • 复习JVM
  • 印巴战火LIVE|巴基斯坦多地遭印度导弹袭击,巴总理称“有权作出适当回应”
  • 福特汽车撤回业绩指引,警告关税或造成15亿美元利润损失
  • IPO周报|节后首批3只新股本周申购,色谱设备龙头来了
  • 今天全国铁路、公路进入返程高峰,这些路段时段通行压力大
  • 巴基斯坦宣布禁止与印度的进口贸易
  • 原油价格战一触即发?沙特不想再忍,领衔多个产油国加速增产