vue3中实现文本显示省略号和tooltips提示框

本文主要是介绍vue3中实现文本显示省略号和tooltips提示框,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

在 B 端业务中,我们经常会遇到文本内容超出容器区域需显示省略号的需求。当鼠标移入文本时,会出现 Tooltip 显示完整内容。最近,我也遇到了这样的场景。为了提高业务通用性,我已将其封装为组件、Hook 和指令等形式供使用。

使用方式

npm install vue-ellipsis-tooltip --save

技术细节

如何判断文本超出了父容器

  1. 首先创建一个空白的 div,将当前父元素的样式全部复制到这个 div 上。将全部文字填充到空白 div 中,获取当前全部文案的高度。然后使用定位和层级使其在当前屏幕上不可见。
  2. 通过二分法,递归地找出期望目标元素的行数的高度(lineHeight * rows)所能容纳的最大字符串数量。

image.png

基础的伪代码如下:
代码地址

export const getEllipsisText = (parentNode: HTMLElement, fullText: string, maxHeight: number) => {const ellipsisContainer = createMeasureContainer(parentNode)ellipsisContainer.innerHTML = ""const textNode = document.createTextNode(fullText)ellipsisContainer.appendChild(textNode)// 检查当前文本是否满足高度条件function inRange() {return ellipsisContainer.offsetHeight <= maxHeight}if (inRange()) {return {ellipsis: false,text: fullText}}// 寻找最多的文字function measureText(startLoc = 0, endLoc = fullText.length, lastSuccessLoc = 0) {if (startLoc > endLoc) {// 找到满足条件的最长文本,清理并返回结果const finalText = fullText.slice(0, lastSuccessLoc) + "..."return {ellipsis: true,text: finalText}// return finalText}const midLoc = Math.floor((startLoc + endLoc) / 2)textNode.textContent = fullText.slice(0, midLoc) + "..."if (inRange()) {return measureText(midLoc + 1, endLoc, midLoc)} else {return measureText(startLoc, midLoc - 1, lastSuccessLoc)}}return measureText()
}
  • 时间复杂度主要取决于 measureText 函数,它使用二分查找法来确定满足条件的最长文本。二分查找的时间复杂度是 O(log n),其中 n 是字符串 fullText 的长度。在这个过程中,每一步都会将搜索范围减半,直到找到最合适的文本长度。
  • 空间复杂度由于 measureText 使用了递归调用,空间复杂度受到递归深度的影响。在最坏的情况下,递归深度与二分查找的步骤数相同,即 O(log n)

创建ToolTip弹窗

ToolTip主要是通过@popperjs/core进行实现

  • 代码地址

怎么使用

例子

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="./style.css"><style>.wrapper{margin: 0 auto;}</style><script src="https://cdn.bootcdn.net/ajax/libs/vue/3.3.4/vue.cjs.prod.min.js"></script><script src="./vEllipsis.js"></script>
</head>
<body><div id="app"><div class="wrapper" :style="{ width: '200px' }"><span  v-ellipsis="{ rows: 1, text: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzzzzzzzzz' }" /></div><div class="wrapper" :style="{ width: `200px` }"><vue-ellipsis-tooltip :rows="3" text=" A design is a plan or specification for the" /></div></div><script>const App = {data() {return {message: "Hello Element Plus",};},};const app = Vue.createApp(App);app.use(vEllipsis);app.mount("#app");</script>
</body>
</html>

组件形式

<template><div class="wrapper" :style="{ width: `${width}px` }"><vue-ellipsis-tooltip:rows="options.rows":text="options.text":poperOptions="{effect: 'light'}"/></div>
</template><script setup lang="ts">
import { ref } from "vue"
import {vue-ellipsis-tooltip} from "vue-ellipsis-tooltip"
const options = ref({rows: 1,text: "你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好"
})const width = ref(200)
</script>

指令形式

<template><div class="wrapper" :style="{ width: `${width}px` }"><span ref="targetRef" v-ellipsis="{ rows: options.rows, text: options.text }" /></div>
</template><script setup lang="ts">
import { ref } from "vue"
const options = ref({rows: 1,text: "你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好"
})const width = ref(200)
</script>

hook形式

<template><div class="wrapper" :style="{ width: `${width}px` }"  ref="wrapperRef"><span ref="targetRef" /></div>
</template><script setup lang="ts">
import { useEllipsis } from "vue-ellipsis-tooltip"
import { ref } from "vue"
const targetRef = ref()
const width = ref(200)
const options = ref({rows: 1,text: "你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好"
})
useEllipsis(targetRef, options.value, {effect: "dark"
})
</script>

在vite中使用

main.ts

import { createApp } from 'vue'
import "vue-ellipsis-tooltip/dist/style.css"
import vEllipsis from "vue-ellipsis-tooltip"
import App from './App.vue'
const app = createApp(App)
app.use(vEllipsis)
app.mount('#app')

Attributes

名称说明类型默认值
rows显示省略的行数number1
showTooltip配置省略时的弹出框booleanfalse
text显示的内容string‘’
disabled是否禁用booleanfalse

poperOptions(弹出窗属性)

名称说明类型默认值
effect主题dark / lightdark
teleported是否插入bodybooleanfalse
showArrow是否显示箭头booleantrue
popperClass弹出窗类名string‘’
offset出现位置的偏移量number12
showAfter在触发后多久显示内容,单位毫秒number0
hideAfter延迟关闭,单位毫秒number200
placementTooltip 组件出现的位置enum‘bottom’
zIndex弹窗层级number1024
popperOptionspopper.js 参数object{}

总结

该组件提供了一个灵活且易于集成的方式,以满足B端业务中处理文本溢出显示和Tooltip提示的需求,同时降低了开发成本并提高了用户体验。

Vue-Ellipsis

这篇关于vue3中实现文本显示省略号和tooltips提示框的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/873588

相关文章

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环