【vue3】文本自动省略组件,支持单行和多行省略,超出显示tooltip)

代码见文末

vue2实现

最近开发也用到了vue2,随即使用魔法优化改写了一下

v​​​​​​​​​​​​​​vue2实现方式

vue3开发与使用文档:可自适应显示内容的 Tooltip 组件


组件介绍

该组件基于 Vue 3 和 Element Plus 构建,主要功能是通过 el-tooltip 实现内容的动态展示。若文本内容超出容器范围,则自动显示 Tooltip 提示框,同时支持自定义行数的裁剪(line-clamp)。


开发背景

在前端开发中,长文本内容需要在有限空间中展示时,为了避免视觉杂乱,通常使用文字裁剪和 Tooltip 的组合方案。此组件适合展示动态内容或受限空间的文本场景。


使用指南

组件 Props
参数 类型 默认值 必填 说明
toolTipOptions Object {placement: 'bottom', effect: 'dark', trigger: 'hover'} Tooltip 配置项,支持所有 el-tooltip 的属性。
outStyle Object { fontSize: '14px' } 外层容器样式,支持传入自定义样式。
content
<think> 根据用户的问题,用户希望在Vue 3中实现当文字超出指定行数显示省略号时才使用tooltip进行提示。结合提供的引用内容,我们可以总结出以下几点关键信息: 1. 引用[1]提供了基本的CSS样式,用于单行文本超出显示省略号: ```css text-overflow: ellipsis; overflow: hidden; white-space: nowrap; ``` 2. 引用[2]提供了在Vue3中使用Ant Design Vue实现文本超出隐藏省略号,并在鼠标移入时显示提示(仅当文本超出时)的方法。同时,它还提到了多行省略的CSS样式调整以及一些注意事项,比如响应式处理、性能优化等。多行省略的CSS示例: ```css .ellipsis-text { display: -webkit-box; -webkit-line-clamp: 2; /* 行数 */ -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; white-space: normal; /* 覆盖单行设置 */ } ``` 3. 引用[3]展示了一个长文本的例子,但没有提供具体实现。 用户的需求是:指定行数(可以是多行),当文本超出该行数显示省略号时,才显示tooltip提示;如果没有超出,则不显示提示。 因此,我们需要做的是: - 通过CSS实现多行省略。 - 在Vue组件中判断文本是否溢出(即是否显示省略号),只有溢出时才显示tooltip。 步骤: 1. 创建一个Vue组件(比如`EllipsisTooltip.vue`),该组件接受内容(content)最大宽度(maxWidth)以及行数(lineClamp)等属性。 2.组件的模板中,使用一个容器元素(如div)来包裹文本,并应用多行省略的CSS样式。 3. 使用一个tooltip组件(例如Ant Design Vue的a-tooltip或Element Plus的el-tooltip)包裹这个容器,但需要根据是否溢出来控制tooltip显示。 4.组件中,我们需要通过JavaScript判断文本是否溢出(即是否被截断并显示省略号)。可以通过比较元素的scrollHeight(实际内容高度)clientHeight(可见高度)来判断。如果scrollHeight大于clientHeight,则表示内容溢出。 5. 由于文本内容可能动态变化,窗口大小变化也可能影响溢出状态,因此需要在组件挂载时窗口resize时检测溢出状态,并更新一个标志(例如isOverflowed)来控制tooltip显示。 6. 为了性能,可以对resize事件使用防抖(debounce)。 实现细节: - 多行省略的CSS样式如上所示,注意`-webkit-line-clamp`用于指定行数。 - 在Vue组件中,我们需要使用ref获取文本容器的DOM元素,然后比较scrollHeightclientHeight。 - 如果使用Ant Design VueTooltip,我们可以使用`v-if="isOverflowed"`来控制是否启用tooltip。或者,我们可以动态绑定tooltip的visible属性,但更简单的方式是只在溢出时显示tooltip。 下面是一个具体的组件实现示例(使用Composition API): </think> 在 Vue 3 中实现文字超出指定行数显示省略号时才显示 Tooltip 的完整解决方案如下: ### 实现思路 1. **CSS 控制多行省略**:使用 `-webkit-line-clamp` 实现多行文本省略效果 2. **DOM 检测溢出**:通过比较元素的 `scrollHeight` `clientHeight` 判断文本是否溢出 3. **响应式处理**:监听窗口大小变化内容更新 4. **Tooltip 条件渲染**:仅当文本溢出时才显示提示框 ### 代码实现 ```vue <template> <div class="ellipsis-wrap"> <a-tooltip v-if="showTooltip" :title="content" placement="top"> <div ref="textRef" class="ellipsis-text" :style="{ webkitLineClamp: lineClamp }"> {{ content }} </div> </a-tooltip> <div v-else ref="textRef" class="ellipsis-text" :style="{ webkitLineClamp: lineClamp }"> {{ content }} </div> </div> </template> <script setup> import { ref, onMounted, onUnmounted } from &#39;vue&#39;; import { debounce } from &#39;lodash-es&#39;; const props = defineProps({ content: { type: String, default: &#39;&#39; }, lineClamp: { type: Number, default: 2 }, // 默认2行 maxWidth: { type: String, default: &#39;100%&#39; } }); const textRef = ref(null); const showTooltip = ref(false); // 检测文本溢出 const checkOverflow = () => { if (!textRef.value) return; const element = textRef.value; showToolflow.value = element.scrollHeight > element.clientHeight; }; // 防抖处理窗口变化 const handleResize = debounce(checkOverflow, 300); onMounted(() => { checkOverflow(); window.addEventListener(&#39;resize&#39;, handleResize); }); onUnmounted(() => { window.removeEventListener(&#39;resize&#39;, handleResize); }); // 内容变化时重新检测 watch(() => props.content, checkOverflow); </script> <style scoped> .ellipsis-wrap { width: v-bind(&#39;props.maxWidth&#39;); } .ellipsis-text { display: -webkit-box; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; white-space: normal; word-break: break-word; } </style> ``` ### 使用示例 ```vue <template> <EllipsisTooltip content="Yi-Large-RAG是零一万物推出的高阶模型服务,带有实时联网搜索能力..." :line-clamp="3" max-width="300px" /> </template> <script setup> import EllipsisTooltip from &#39;./EllipsisTooltip.vue&#39;; </script> ``` ### 关键实现说明 1. **多行省略控制**: ```css .ellipsis-text { -webkit-line-clamp: v-bind(&#39;props.lineClamp&#39;); /* 动态绑定行数 */ display: -webkit-box; -webkit-box-orient: vertical; } ``` 2. **溢出检测逻辑**: ```javascript element.scrollHeight > element.clientHeight // true表示有溢出 ``` 3. **响应式处理**: - 窗口大小变化时使用防抖检测 - 内容变化自动重新检测 - 组件卸载时移除监听避免内存泄漏 [^2] 4. **性能优化**: - 使用 Lodash 的 `debounce` 减少频繁计算 - 仅当内容变化时才触发检测 ### 注意事项 1. 跨浏览器支持:`-webkit-line-clamp` 在非 Webkit 内核浏览器需要后备方案 2. 动态内容:如果内容异步加载,需要在数据更新后调用 `checkOverflow()` 3. 表格单元格应用:在表格中使用时需要设置 `table-layout: fixed` [^2] 4. 服务端渲染:SSR 场景下需要在 `onMounted` 后执行检测
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值