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

Vue3 + Element Plus实现表格多行文本截断与智能Tooltip提示

在实际开发中,我们经常需要在表格中展示较长的文本内容,但又希望保持界面的整洁美观。本文将介绍如何在Vue3 和 Element Plus中实现表格多行文本截断,并智能控制Tooltip的显示——只有当文本被截断时才显示Tooltip,否则不显示。

需求分析

目标是打造一个用户体验友好的表格,对于“描述”这一列实现以下功能:

  1. 多行文本截断:当描述文本限制为固定行数(如2行),超出行数的部分显示为省略号
  2. 智能Tooltip: 仅当文本被截断时显示Tooltip,否则不显示

技术选型与实现思路

CSS多行文本截断
利用CSS的-webkit-line-clamp属性可以很方便地实现多行文本截断功能。它需要配合以下属性一起使用:

 cursor: pointer;overflow: hidden;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 2;/* 这里设置为2行,根据需求调整*/max-height: 3em;line-height: 1.5;text-overflow: ellipsis;word-break: break-word;

Tooltip条件显示
借助Vue的条件渲染(v-if等指令),根据文本内容是否超出两行的判断结果,来决定是否显示Tooltip组件。需要通过JavaScript来计算文本所在容器的实际高度和内容高度,以此判断是否超出两行。

代码实现

<script setup lang="ts">
import { ref, reactive } from 'vue'
import { ElTable, ElTableColumn, ElButton, ElDialog, ElForm, ElFormItem, ElInput,ElMessage,ElTooltip
} from 'element-plus'
import { Plus } from '@element-plus/icons-vue'interface TableItem {id: numbername: stringhobby: stringdescription: string
}// 表格数据
const tableData = ref<TableItem[]>([{ id: 1, name: '张三', hobby: '读书', description: '喜欢阅读各种类型的书籍,特别是文学作品和技术书籍。经常在业余时间去图书馆或书店,认为读书是最好的放松方式。' },{ id: 2, name: '李四', hobby: '运动', description: '热爱各种体育运动,包括跑步、游泳、篮球等。每周至少运动三次,保持良好的身体状态和健康的生活习惯。' },{ id: 3, name: '王五', hobby: '音乐', description: '对音乐有着深厚的兴趣,会弹奏钢琴和吉他。' }
])// tooltip 状态管理
const tooltipStates = ref<Record<number, boolean>>({})
const descriptionRefs = ref<Record<number, HTMLElement>>({})
// 设置描述文本的引用
const setDescriptionRef = (el: HTMLElement | null, id: number) => {if (el) {descriptionRefs.value[id] = el}
}// 检查文本是否溢出
const checkTextOverflow = (id: number, text: string) => {const element = descriptionRefs.value[id]if (!element) return// 检查是否有文本溢出const isOverflowing = element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidthtooltipStates.value[id] = isOverflowing
}</script><template><div class="static-table-container"><div class="header"><h2>用户信息管理</h2></div><!-- 数据表格 --><el-table :data="tableData" style="width: 100%" stripeborder><el-table-column prop="id" label="ID" width="80" align="center"/><el-table-column prop="name" label="姓名" width="150"align="center"/><el-table-column prop="hobby" label="爱好" align="center"/><el-table-column prop="description" label="描述" width="300"align="left"><template #default="{ row }"><div class="description-text":ref="el => setDescriptionRef(el, row.id)"@mouseenter="checkTextOverflow(row.id, row.description)"><el-tooltipv-if="tooltipStates[row.id]":content="row.description"placement="top":show-after="300":hide-after="200"><span>{{ row.description }}</span></el-tooltip><span v-else>{{ row.description }}</span></div></template></el-table-column></el-table></div>
</template><style scoped>
.static-table-container {padding: 20px;max-width: 800px;margin: 0 auto;
}.header {display: flex;justify-content: space-between;align-items: center;margin-bottom: 20px;padding-bottom: 15px;border-bottom: 1px solid #ebeef5;
}.header h2 {margin: 0;color: #303133;font-size: 24px;font-weight: 600;
}/* 表格样式优化 */
:deep(.el-table) {border-radius: 8px;overflow: hidden;
}:deep(.el-table th) {background-color: #f5f7fa;color: #606266;font-weight: 600;
}:deep(.el-table td) {padding: 12px 0;
}/* 描述文本样式 */
.description-text {display: -webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;overflow: hidden;text-overflow: ellipsis;line-height: 1.5;max-height: 3em; /* 2行的高度 */word-break: break-word;cursor: pointer;
}.description-text:hover {color: #409eff;
}
</style>

效果如下

在这里插入图片描述

总结

本文介绍了如何在 Vue 3 和 Element Plus 中实现表格多行文本截断与智能 Tooltip 展示功能。通过 CSS 实现多行截断,通过 JavaScript 动态判断文本是否溢出,从而智能控制 Tooltip 的显示。
如果你在项目中遇到类似需求,可以直接使用这个方案,或者根据具体需求进行调整。如果你有任何问题或建议,欢迎在评论区留言讨论!

http://www.dtcms.com/a/352495.html

相关文章:

  • 【黑客技术零基础入门】2025最新黑客工具软件大全,零基础入门到精通,收藏这篇就够了!
  • 【数据结构】单链表详解
  • Java基础 8.26
  • 【7】SQL 语句基础应用
  • 基于SpringBoot的演唱会网上订票系统的设计与实现(代码+数据库+LW)
  • 自由学习记录(89)
  • 一份兼容多端的HTML邮件模板实践与详解
  • 美妆品牌如何用 DAM 管理海量产品图片?
  • 开脑洞,末日降临,堡垒求生,ARMxy系列BL410能做什么?
  • vagrant怎么在宿主机管理虚拟机镜像box(先搁置)
  • 中国移动云电脑一体机-创维LB2004_瑞芯微RK3566_2G+32G_开ADB安装软件教程
  • 【自监督检测】HASSOD:Hierarchical Adaptive Self-Supervised Object Detection
  • 《基于 Spring Boot 的足球青训俱乐部管理后台系统设计与实现--文末获取源码》
  • wsl安装的系统更换路径
  • 【Modbus-TCP】linux为主机—PC为从机通信
  • 8.26 支持向量机
  • GD32和STM32的区别在哪里?
  • Python训练营打卡 DAY 48 随机函数与广播机制
  • 摩尔信使MThings V0.8.1更新要点
  • flume监控目录文件实战:三种 Source 方案对比与配置指南
  • vue新增用户密码框自动将当前用户的密码自动填充的问题
  • Windows server 2019安装wsl2
  • Python3.11升级到高版本-aioredis兼容问题
  • 洛谷: CF632D Longest Subsequence-普及+/提高
  • 下载python离线安装包,在无网络机器安装方法
  • DeepSeek用C编写的支持Zstandard 压缩的 ZIP 工具
  • 2020-2022年 CLES村庄、农户调查问卷、清理和审核报告相关数据
  • 【RAGFlow代码详解-25】HTTP 接口
  • VGG改进(5):基于Multi-Scale Attention的PyTorch实战
  • 解析xml文件并录入数据库