多行文本的文字展示全部和收起功能

2024-06-19 05:52

本文主要是介绍多行文本的文字展示全部和收起功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

组件代码:

<template><!-- 外层容器,使用相对定位 --><div class="relative"><!-- 文本容器,根据 expanded 状态决定是否应用 line-clamp-4--><div :class="{ 'line-clamp-4': !expanded }" ref="textContainer">{{ text }}</div><!-- 展开/收起按钮,只有在文本需要折叠时才显示,使用绝对定位 --><buttonv-if="isCollapsible"@click="toggleExpand"class="text-blue-500 absolute -right-6 bottom-0">{{ expanded ? '收起' : '展开' }}</button></div>
</template><script setup>
import { ref, onMounted, nextTick } from 'vue'// 定义组件的 props
const props = defineProps({text: {type: String,required: true},fontSize: {type: String,required: false,default: '12px'}
})const expanded = ref(false)  // 控制文本是否展开
const isCollapsible = ref(false)  // 控制文本是否需要折叠
const textContainer = ref(null)  // 引用文本容器// 切换展开/收起状态的函数
const toggleExpand = () => {expanded.value = !expanded.value
}// 检查文本是否需要折叠的函数
const checkCollapsible = () => {nextTick(() => {const width = textContainer.value.clientWidth  // 获取文本容器的宽度const dummyElement = document.createElement('div')dummyElement.style.position = 'absolute'dummyElement.style.visibility = 'hidden'dummyElement.style.width = `${width}px`dummyElement.style.fontSize = props.fontSize  // 设置字体大小dummyElement.style.lineHeight = getComputedStyle(textContainer.value).lineHeightdummyElement.innerText = props.textdocument.body.appendChild(dummyElement)const lineHeight = parseInt(getComputedStyle(dummyElement).lineHeight)  // 获取行高const totalHeight = dummyElement.clientHeight  // 获取文本总高度document.body.removeChild(dummyElement)const maxHeight = lineHeight * 4 + 5  // 设定最大高度(假设最多显示4行)isCollapsible.value = totalHeight > maxHeight  // 判断是否需要折叠})
}// 组件挂载时执行的操作
onMounted(() => {checkCollapsible()  // 检查文本是否需要折叠window.addEventListener('resize', checkCollapsible)  // 监听窗口大小变化,重新检查
})
</script><style scoped>
</style>

效果图:
在这里插入图片描述
在这里插入图片描述
优化版本,展开全部文字 展示在文本域后面。需要做一个截取文本操作。

<template><div><div ref="textContainer" :class="{ 'line-clamp-4': !expanded }"><span v-if="!expanded">{{ truncatedText }}</span><span v-else>{{ text }}</span><button v-if="isCollapsible" @click="toggleExpand" class="text-blue-500 ml-2">{{ expanded ? '收起' : '展开全部' }}</button></div></div>
</template><script setup>
import { ref, onMounted, nextTick } from 'vue'// 定义组件的 props
const props = defineProps({text: {type: String,required: true},fontSize: {type: String,required: false,default: '12px'},targetLines: {type: Number,required: false,default: 4}
})// 定义响应式变量
const expanded = ref(false)  // 控制文本是否展开
const isCollapsible = ref(false)  // 控制文本是否需要折叠
const textContainer = ref(null)  // 引用文本容器
const truncatedText = ref('')  // 存储截断的文本// 切换展开/收起状态的函数
const toggleExpand = () => {expanded.value = !expanded.value
}// 检查文本是否需要折叠的函数
const checkCollapsible = () => {nextTick(() => {const width = textContainer.value.clientWidthconst dummyElement = document.createElement('div')dummyElement.style.position = 'absolute'dummyElement.style.visibility = 'hidden'dummyElement.style.width = `${width}px`dummyElement.style.fontSize = props.fontSize  // 设置字体大小dummyElement.style.lineHeight = getComputedStyle(textContainer.value).lineHeightdummyElement.style.whiteSpace = 'pre-wrap'dummyElement.style.wordWrap = 'break-word'dummyElement.innerText = props.textdocument.body.appendChild(dummyElement)const lineHeight = parseInt(getComputedStyle(dummyElement).lineHeight)  // 获取行高const maxHeight = lineHeight * props.targetLines  // 设定最大高度isCollapsible.value = dummyElement.clientHeight > maxHeight  // 判断是否需要折叠if (isCollapsible.value) {// 截断文本以适应最大高度let totalHeight = 0let truncated = ''const words = props.text.split(' ')for (let i = 0; i < words.length; i++) {const word = words[i]dummyElement.innerText = truncated + word + ' ' + '... 展示全部'if (dummyElement.clientHeight > maxHeight) breaktruncated += word + ' '}truncatedText.value = truncated.trimEnd() + '...'} else {truncatedText.value = props.text}document.body.removeChild(dummyElement)})
}// 组件挂载时执行的操作
onMounted(() => {checkCollapsible()  // 检查文本是否需要折叠window.addEventListener('resize', checkCollapsible)  // 监听窗口大小变化,重新检查
})
</script><style scoped></style>

效果图:
在这里插入图片描述
在这里插入图片描述

这篇关于多行文本的文字展示全部和收起功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

如何评价Ubuntu 24.04 LTS? Ubuntu 24.04 LTS新功能亮点和重要变化

《如何评价Ubuntu24.04LTS?Ubuntu24.04LTS新功能亮点和重要变化》Ubuntu24.04LTS即将发布,带来一系列提升用户体验的显著功能,本文深入探讨了该版本的亮... Ubuntu 24.04 LTS,代号 Noble NumBAT,正式发布下载!如果你在使用 Ubuntu 23.

TP-LINK/水星和hasivo交换机怎么选? 三款网管交换机系统功能对比

《TP-LINK/水星和hasivo交换机怎么选?三款网管交换机系统功能对比》今天选了三款都是”8+1″的2.5G网管交换机,分别是TP-LINK水星和hasivo交换机,该怎么选呢?这些交换机功... TP-LINK、水星和hasivo这三台交换机都是”8+1″的2.5G网管交换机,我手里的China编程has

Django中使用SMTP实现邮件发送功能

《Django中使用SMTP实现邮件发送功能》在Django中使用SMTP发送邮件是一个常见的需求,通常用于发送用户注册确认邮件、密码重置邮件等,下面我们来看看如何在Django中配置S... 目录1. 配置 Django 项目以使用 SMTP2. 创建 Django 应用3. 添加应用到项目设置4. 创建

使用 Python 和 LabelMe 实现图片验证码的自动标注功能

《使用Python和LabelMe实现图片验证码的自动标注功能》文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合Pa... 目录使用 python 和 LabelMe 实现图片验证码的自动标注环境准备必备工具安装依赖实现自动标注核心

通过C#和RTSPClient实现简易音视频解码功能

《通过C#和RTSPClient实现简易音视频解码功能》在多媒体应用中,实时传输协议(RTSP)用于流媒体服务,特别是音视频监控系统,通过C#和RTSPClient库,可以轻松实现简易的音视... 目录前言正文关键特性解决方案实现步骤示例代码总结最后前言在多媒体应用中,实时传输协议(RTSP)用于流媒体服

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节