在 Vue 3 中实现“折叠”与“展开”文本内容

news2024/9/24 12:52:26

偶然间遇到一个场景,怎么判断一段文本是否超过 5 行或者指定行数,并在超过时显示 "展开/收起" 按钮。那应该如何实现呢?

在 Vue 3 的项目下实现:

<template>
  <div class="text-container">
    <div class="text-content" ref="textContentRef" :class="{ collapsed: showFullText }">
      {{ longText }}
    </div>
    <!-- 仅在内容超过 5 行时显示展开/收起按钮 -->
    <button v-if="isOverflowing" @click="toggleText" class="toggle-btn">
      {{ showFullText ? '收起' : '展开' }}
    </button>
  </div>
</template>

<script setup>
import { ref, onMounted, nextTick } from 'vue'

// showFullText:记录当前文本是展开还是折叠状态
const showFullText = ref(false)
// isOverflowing:用来判断文本是否超出了 5 行
const isOverflowing = ref(false)
const textContentRef = ref(null)

// 模拟长文本
const longText = `
  这是一个很长的文本,可以用来展示折叠效果。这个文本很长很长,需要在界面上显示多行,而我们希望默认显示 5 行的内容。
  如果超过 5 行,则展示展开按钮。点击展开按钮后,显示所有内容。如果再次点击收起按钮,恢复到 5 行展示。
  心灵鸡汤(凑字数):所有的失败都是为成功做准备。抱怨和泄气,只能阻碍成功向自己走来的步伐。
  放下抱怨,心平气和地接受失败,无疑是智者的姿态。抱怨无法改变现状,拼搏才能带来希望。
  真是金子,只要自己不把自己埋没,只要一心想着闪光,就总有闪光的那一天。
`

// 切换展开和收起状态
const toggleText = () => {
  showFullText.value = !showFullText.value
}

// 计算是否溢出 5 行
const calculateOverflow = () => {
  const el = textContentRef.value
  if (el) {
    const lineHeight = parseFloat(getComputedStyle(el).lineHeight) // 获取行高
    const maxVisibleHeight = lineHeight * 5 // 计算出 5 行的最大高度
    // scrollHeight:内容的实际高度(包含不可见部分)
    isOverflowing.value = el.scrollHeight > maxVisibleHeight // 判断是否超出 5 行
  }
}

// 在组件挂载时执行文本溢出检查
onMounted(() => {
  nextTick(() => {
    calculateOverflow()
  })
})
</script>

<style scoped>
.text-container {
  max-width: 600px;
  margin: 0 auto;
  font-size: 16px;
  line-height: 1.5;
  border: 2px solid pink;
  border-radius: 5px;
  padding: 18px;
}

.text-content {
  overflow: hidden;
  display: -webkit-box; /* 需要这行以启用多行省略号 */
  -webkit-box-orient: vertical; /* 垂直排列 */
  -webkit-line-clamp: 5; /* 限制为 5 行 */
  max-height: calc(5 * 1.5em); /* 5 行的最大高度 */
  transition: max-height 0.3s ease; /* 添加过渡效果 */
}

.text-content.collapsed {
  max-height: none; /* 展开时显示所有内容 */
  -webkit-line-clamp: unset; /* 移除行数限制 */
}

.toggle-btn {
  background-color: transparent;
  border: none;
  color: orange;
  cursor: pointer;
  margin-top: 10px;
  padding: 0;
}
</style>

展示为:

对代码进行注释:

1、text-content 是存放长文本的地方,默认显示 5 行,超出部分通过 max-height 和 -webkit-line-clamp 进行隐藏,并通过 transition 实现展开/折叠的动画效果。

2、collapsed 类控制文本展开时移除 max-height 和 -webkit-line-clamp,显示所有内容。

注意📢:

1、line-height 与行数计算

这里的 line-height 被设定为 1.5,表示每行的高度是文本字体大小的 1.5 倍。在实际项目中,需要根据实际的 line-height  和字体大小来调整。

2、-webkit-line-clamp 属性

-webkit-line-clamp 是一个非标准的 CSS 属性,兼容性需要注意,尤其是在非 WebKit 内核的浏览器中。

3、性能考虑

计算 scrollHeight 和 clientHeight 的操作会触发浏览器的重排(Reflow),因此建议避免在高频操作中使用,如 resize 或 scroll 事件中。

其他实现方法

1、使用 JavaScript 动态裁剪文本字符串,只显示前 n 个字符,剩余部分用省略号 ... 替代。

const shortenedText = longText.slice(0, 100) + '...';

但可能没有办法指定行数

2、使用第三方库,比如:Clamp.js,它可以更灵活地处理多行文本的裁剪和展开。

Clamp(document.getElementById('my-text'), { clamp: 5 });

总结:

上述例子展示了如何在 Vue 3 中动态判断文本是否超出 5 行,并通过按钮实现折叠和展开功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2160390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数位dp(算法篇)

算法篇之数位dp 数位dp 概念&#xff1a; 数位dp是一种计数用的dp&#xff0c;一般是要统计一个区级[l,r]内满足一些条件的数的个数所谓数位dp&#xff0c;就是对数位进行dp&#xff0c;也就是个位、十位等相对于普通的暴力枚举&#xff0c;数位dp快就快在它的记忆化&#x…

牛客小白月赛101(上)

tb的区间问题 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码 #include <iostream> #include <climits>using namespace std;int main() {int n, k;cin >> n >> k;int arr[50000];for (int i 0; i < n; i) {cin >> arr[i];}int …

HDL coder使用手册

&#x1f4a1; 由于本科毕设女朋友准备使用FPGA完成&#xff0c;因此写这篇文章帮助她快速上手HDL coder的使用&#xff0c;降低前期入门的难度。 支持生成HDL代码的simulink库 名字中含有HDL的库中的模块一般都可以用来生成HDL代码。直接搜索模块名称&#xff0c;比如搜索fir&…

SpringBoot整合InfluxDB(实战)

一、简单介绍InfluxDB是什么&#xff1f; InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成&#xff0c;着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据&#xff0c;IoT行业的实时数据等场景。 1、主要特点 时间序列数据存储 专门…

网页跨域异常100%解决(谷歌浏览器)

目的&#xff1a; 1.开发过程中&#xff0c;经常出现浏览器提示跨域 2.原因新版本浏览器拦截跨域请求 3.错误关键消息如下&#xff1a; Access-Control-Allow-Origin cess to XMLHttpRequest at http://192.168.1.104:3080/api/Login/Store from origin http://yingyongliere…

sheng的学习笔记-AI-K-摇臂赌博机(K-armed bandit)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 强化学习 sheng的学习笔记-AI-强化学习&#xff08;Reinforcement Learning, RL&#xff09;-CSDN博客 基础知识 单步强化学习任务 先考虑比较简单的情形&#xff1a;最大化单步奖赏&#xff0c;即仅考虑一步操作。需注意…

【LVIO-SLAM】 激光slam理论与实践

【LVIO-SLAM】 激光slam理论与实践 1. 激光slam理论与实践1.1 2D激光SLAM1.2 3D激光SLAM 2. 激光雷达运动畸变去除2.1 Lidar数学模型与点云去畸变2.2 运动畸变 3. 激光slam的前端配准3.1 帧间匹配3.2 3.2 ICP (Iterative Closest Point)3.3 PI-ICP (Point-to-Line Iterative Cl…

虚幻引擎游戏保存/加载存档功能

函数名功能Does Save Game Exist检查存档是否存在Load Game from Slot加载存档Save Game to Slot保存存档Delete Game in Slot删除存档 Slot Name 是插槽名字 存档都是通过插槽名字来 读取/加载/检查/删除的 先创建一个SaveGame类 , 这个类里可以存放要保存的数据 , 比如 玩家…

Unity Debug时出现请选择unity实例

Unity Debug时出现请选择unity实例 问题描述 出现请选择unity实例&#xff0c;并且选择框里为空。 出现原因 你打开了两个Unity工程&#xff0c;在附加时&#xff0c;不知道加在哪个Unity工程上。 解决方法 在调试窗口中点击“附加Unity调试程序”&#xff0c;然后在弹出…

Linux文件IO(三)-Linux系统如何管理文件

1.静态文件与 inode 文件在没有被打开的情况下一般都是存放在磁盘中的&#xff0c;譬如电脑硬盘、移动硬盘、U 盘等外部存储设备&#xff0c;文件存放在磁盘文件系统中&#xff0c;并且以一种固定的形式进行存放&#xff0c;我们把他们称为静态文件。 文件储存在硬盘上&#…

[000-002-01].第29节:MySQL执行流程

1、MySQL的查询流程&#xff1a; 客户端请求进入到数据库服务器后&#xff0c;先进行查询缓存&#xff0c;如果命中&#xff0c;那么就返回结果&#xff1b;如果没命中&#xff0c;进入到解析器&#xff0c;进行词法解析和语法解析&#xff0c;生成解析树&#xff1b;然后进入到…

Python在AI中的应用--使用决策树进行文本分类

Python在AI中的应用--使用决策树进行文本分类 文本分类决策树什么是决策树 scikit算法 使用scikit的决策树进行文章分类一个文本分类的Python代码使用的scikit APIs说明装入数据集决策树算法类类构造器&#xff1a; 构造决策树分类器产生输出评估输出结果分类准确度分类文字评估…

langchain介绍以及简单实用

1,介绍 LangChain是一个用于开发由大语言模型支持的应用程序的框架。它提供了大量组件来帮助我们构建LLM支持的应用程序。 其主要是有六大功能组成。 LLMs(大语言模型&#xff08;生成式语言模型&#xff09;)&#xff0c;Prompts(提示词)&#xff0c;Memory(记忆力)&#xff…

电器行业文件加密怎么做?防泄密哪种方法实用?

管控需求 1.电子文档&#xff08;源代码、设计图纸、设计方案等&#xff09;数据不同应用场景下如何有效保护&#xff1b; 2.发给第三方或外部单位的成果数据没有任何限制&#xff0c;对方可拷贝、篡改、截屏、盗用&#xff0c;严重损害单位的利益&#xff1b; 3.对员工出差…

基于单片机巡迹避障智能小车系统

文章目录 前言资料获取设计介绍设计程序具体实现截图设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们…

[Python学习日记-28] 开发基础练习1——股票查询程序

[Python学习日记-28] 开发基础练习1——股票查询程序 简介 题目及效果参考 源码与解析 简介 该练习使用了列表、字典、字符串等之前学到的数据类型&#xff0c;用于巩固实践之前学习的内容&#xff0c;题目当中使用到的数据均摘录与东方财富网&#xff0c;最好在学习完前面的…

【论文阅读】Grounding Language with Visual Affordances over Unstructured Data

Abstract 最近的研究表明&#xff0c;大型语言模型&#xff08;llms&#xff09;可以应用于将自然语言应用于各种各样的机器人技能。然而&#xff0c;在实践中&#xff0c;学习多任务、语言条件机器人技能通常需要大规模的数据收集和频繁的人为干预来重置环境或帮助纠正当前的…

USB总线同步数据采集卡6路高速模拟量采集带DIO功能USB2884/2885/2886

USB2884/2885/2886 数据采集卡 概述&#xff1a; 系统框图&#xff1a; 规格参数&#xff1a; 板卡外形图&#xff1a; 尺寸图及元器件功能说明&#xff1a;

图像识别OCR(Tess4J)

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

ZBrush入门使用介绍——16、ArrayMesh

大家好&#xff0c;我是阿赵。   继续介绍ZBrush的用法。这次看看ArrayMesh功能。   简单来说&#xff0c;ArrayMesh功能是可以复制很多个模型&#xff0c;然后根据路径排列。 一、 从阵列预设生成ArrayMesh 先把模型转换成多边形网格体 这时候&#xff0c;ArrayMesh的选…