前端实现文本超出指定行数显示”展开”和”收起”效果

目录

      • 效果演示
      • 步骤一:实现整体框架
      • 步骤二:实现样式
      • 步骤三:js实现元素控制
      • 完整代码

效果演示

在这里插入图片描述

本文方法是利用js原生进行实现的,可根据相关vue或react语法进行相关的改写,并实现效果

步骤一:实现整体框架

 <div class='export-info-bar'><span class='ellipsis-text export-info-text'>测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试</span><span class='expand-button export-btn-group'>展开</span></div><div class='export-info-bar'><span class='ellipsis-text export-info-text'>测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试</span><span class='expand-button export-btn-group'>展开</span></div><div class='export-info-bar'><span class='ellipsis-text export-info-text'>测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试</span><span class='expand-button export-btn-group'>展开</span></div>

步骤二:实现样式

1、底部容器设置定位,按钮和文本容器利用z-index设计容器层级,并使按钮定位在右下角;
2、设置 高度=指定隐藏行数*一行文本的高度,此处一行高度为21px,指定两行隐藏,最大高度就为42px;
3、设置按钮背景为白色,覆盖在文本上方

    /* 底部容器 */.export-info-bar {position: relative;/* overflow: hidden; */margin-top: 10px;}/* 文本 */.ellipsis-text {position: relative;/* float: left; *//* (***)设置最大高度为两行的高度 */max-height: 42px; display: -webkit-box;-webkit-box-orient: vertical;overflow: hidden;word-break: break-all;word-wrap: break-word;/* 设置文本在按钮下方 */z-index: 0; }/* 按钮前方省略号的样式 */.pseudo-element {color: #000;margin-right: 5px;}/* 按钮 */.expand-button {/* (***) 设置定位,使按钮与最后一行平行并覆盖在最后一行上方 */position: absolute;/* 设置按钮浮动在右方 *//* float: right; *//* 默认隐藏按钮 */display: none;/* 将按钮向上移动一行 */right: 0px;bottom: -3px;color: skyblue;/* 此处背景一定要设置, */background: #fff;}

步骤三:js实现元素控制

    // 元素前方插入文本(因为js没有无法设置::before所以,实现了一个元素前方插入文本的方法)const addContentBefore = (element, content) => {// 创建一个新的伪元素const pseudoElement = document.createElement('span');pseudoElement.classList.add('pseudo-element');pseudoElement.textContent = content;// 将伪元素插入到目标元素的前面if (element.firstChild) {element.insertBefore(pseudoElement, element.firstChild);} else {element.appendChild(pseudoElement);}};const getMoreText = () => {// 获取文本容器const textContents = document.querySelectorAll('.export-info-text');// 获取按钮容器const expandButtons = document.querySelectorAll('.expand-button');// 检查文本是否有超出两行的文本,并显示展开按钮textContents.forEach((content, index) => {// 输出查看当前高度是否超过两行高度(根据当前字体大小进行适配)console.log(content.scrollHeight, content.clientHeight)if (content.scrollHeight > content.clientHeight) {expandButtons[index].style.display = 'block'; // 显示展开按钮addContentBefore(expandButtons[index], '...'); // 按钮前方模拟省略号}});// 为所有按钮绑定点击事件expandButtons.forEach((button, index) => {button.addEventListener('click', () => {// 切换文本的max-height属性,实现展开效果const content = textContents[index];if (content.style.maxHeight !== 'none') {// 如果未展开,展开所有文本content.style.maxHeight = 'none';button.textContent = '收起'; // 改变按钮文本addContentBefore(button, '');} else {// 如果已经展开,恢复到两行content.style.maxHeight = '42px'; // 恢复到两行的高度button.textContent = '展开'; // 恢复按钮文本addContentBefore(button, '...');}});});};getMoreText();

完整代码

<!DOCTYPE html>
<html><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><!-- 文本超出两行显示省略号,并设置“展开”,“收起”效果--><style>/* 底部容器 */.export-info-bar {position: relative;/* overflow: hidden; */margin-top: 10px;}/* 文本 */.ellipsis-text {position: relative;/* float: left; *//* (***)设置最大高度为两行的高度 */max-height: 42px; display: -webkit-box;-webkit-box-orient: vertical;overflow: hidden;word-break: break-all;word-wrap: break-word;/* 设置文本在按钮下方 */z-index: 0; }/* 按钮前方省略号的样式 */.pseudo-element {color: #000;margin-right: 5px;}/* 按钮 */.expand-button {/* (***) 设置定位,使按钮与最后一行平行并覆盖在最后一行上方 */position: absolute;/* 设置按钮浮动在右方 *//* float: right; *//* 默认隐藏按钮 */display: none;/* 将按钮向上移动一行 */right: 0px;bottom: -3px;color: skyblue;/* 此处背景一定要设置, */background: #fff;}</style>
</head><body><div class='export-info-bar'><span class='ellipsis-text export-info-text'>测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试</span><span class='expand-button export-btn-group'>展开</span></div><div class='export-info-bar'><span class='ellipsis-text export-info-text'>测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试</span><span class='expand-button export-btn-group'>展开</span></div><div class='export-info-bar'><span class='ellipsis-text export-info-text'>测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试</span><span class='expand-button export-btn-group'>展开</span></div><script type="text/javascript">// 元素前方插入文本const addContentBefore = (element, content) => {// 创建一个新的伪元素const pseudoElement = document.createElement('span');pseudoElement.classList.add('pseudo-element');pseudoElement.textContent = content;// 将伪元素插入到目标元素的前面if (element.firstChild) {element.insertBefore(pseudoElement, element.firstChild);} else {element.appendChild(pseudoElement);}};const getMoreText = () => {// 获取文本容器const textContents = document.querySelectorAll('.export-info-text');// 获取按钮容器const expandButtons = document.querySelectorAll('.expand-button');// 检查文本是否有超出两行的文本,并显示展开按钮textContents.forEach((content, index) => {// 输出查看当前高度是否超过两行高度(根据当前字体大小进行适配)console.log(content.scrollHeight, content.clientHeight)if (content.scrollHeight > content.clientHeight) {expandButtons[index].style.display = 'block'; // 显示展开按钮addContentBefore(expandButtons[index], '...'); // 按钮前方模拟省略号}});// 为所有按钮绑定点击事件expandButtons.forEach((button, index) => {button.addEventListener('click', () => {// 切换文本的max-height属性,实现展开效果const content = textContents[index];if (content.style.maxHeight !== 'none') {// 如果未展开,展开所有文本content.style.maxHeight = 'none';button.textContent = '收起'; // 改变按钮文本addContentBefore(button, '');} else {// 如果已经展开,恢复到两行content.style.maxHeight = '42px'; // 恢复到两行的高度button.textContent = '展开'; // 恢复按钮文本addContentBefore(button, '...');}});});};getMoreText();</script>
</body></html>

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

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

相关文章

c-periphery RS485串口库文档serial.md(serial.h)(非阻塞读)(VMIN、VTIME)

c-peripheryhttps://github.com/vsergeev/c-periphery 文章目录 NAMESYNOPSISENUMERATIONS关于奇偶校验枚举类型 DESCRIPTIONserial_new()serial_open()关于流控制软件流控制&#xff08;XON/XOFF&#xff09;硬件流控制&#xff08;RTS/CTS&#xff09;选择流控制方法 serial_…

独立3D网络游戏《战域重甲》开发与上架经验分享

“ 小编阿麟&#xff1a;心之所向便是光&#xff0c;我们都是追光者!这位独立游戏开发者的产品能力已经不输给许多小团队&#xff0c;希望他的故事和经验分享&#xff0c;可以给走在同样道路上的朋友一些信心和帮助。 背景介绍 2023年年底的时候&#xff0c;我突然有一个很强的…

硬件工程师笔面试真题汇总

目录 1、电阻 1&#xff09;上拉电阻的作用 2&#xff09;PTC热敏电阻作为电源电路保险丝的工作原理 2、电容 1&#xff09;电容的特性 2) 电容的特性曲线 3) 1uf的电容通常来滤除什么频率的信号 3、电感 4、二极管 1&#xff09;二极管特性 2&#xff09;二极管伏安…

HVV | .NET 攻防工具库,值得您拥有!

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

《破解验证码:用Requests和Selenium实现模拟登录的终极指南》

两种模拟登录方式(图形验证码) 超级鹰 打码平台&#xff0c;用于识别验证码 requests模拟登录 from chaojiying import Chaojiying_Client import requests from requests import Session from lxml import etree #获取图片信息 def get_pic_info(img_name):chaojiying Ch…

10个append()函数在Python程序开发中的创新应用

文末赠免费精品编程资料~~ 在Python编程的世界里&#xff0c;append()函数是列表操作中最常见的方法之一。它允许我们在列表的末尾添加一个元素&#xff0c;这一简单的功能却能激发无限的创造力。今天&#xff0c;我们将探讨append()函数在Python程序开发中的10种创新应用&…

代码随想录第23天|回溯

39.组合总和 题目链接/文章讲解&#xff1a; 代码随想录 视频讲解&#xff1a;带你学透回溯算法-组合总和&#xff08;对应「leetcode」力扣题目&#xff1a;39.组合总和&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 第一想法&#xff1a; 组合总和与第22天组合总…

爬虫实战-掌上高考网实战

1.确定需求&#xff1a;爬取什么数据爬取大学名称 2.找到数据源地址数据在哪个链接中https://api.zjzw.cn/web/api/?keyword&page1&province_id&ranktype&request_type1&size20&top_school_id[3703,2461,659,3117,597,1724]&type&uriapidata/…

2024电赛H题参考方案——自动行使小车

目录 一、题目要求 二、参考资源获取 三、参考方案 1、环境搭建及工程移植 2、移植MPU6050模块 3、移植TB6612电机驱动模块 其他模块根据需要移植 总结 一、题目要求 小编自认为&#xff1a;此次H题属于控制类题目&#xff0c;相较于往年较为简单&#xff0c;功能也算单一&…

【Java】韩顺平Java学习笔记 第19章 IO流

文章目录 文件概述常用的文件操作创建文件获取文件信息目录的操作和文件删除流的分类各抽象类常用子类对象FileInputStreamFileOutputStreamFileReaderFileWriter 节点流和处理流概念BufferedReaderBufferedWriterBufferedInputStream & BufferedOutputStream 对象流&#…

Python | TypeError: ‘module’ object is not callable

Python | TypeError: ‘module’ object is not callable 在Python编程中&#xff0c;遇到“TypeError: ‘module’ object is not callable”这类错误通常表明你尝试像函数一样调用了一个模块。这种错误通常是由于导入模块时的疏忽或误解导致的。本文将深入探讨此错误的根源&…

2024年7月23日~2024年7月29日周报

目录 一、前言 二、完成情况 2.1 一种具有边缘增强特点的医学图像分割网络 2.2 融合边缘增强注意力机制和 U-Net 网络的医学图像分割 2.3 遇到的困难 三、下周计划 一、前言 上周参加了一些师兄师姐的论文讨论会议&#xff0c;并完成了初稿。 本周继续修改论文&#xff0…

使用eclipse在新建的java项目中编辑xml文件时Unhandled event loop exception No more handles

处理方法&#xff1a;更换xml编辑器 Window ——》Preferences ——》General ——》Editors ——》File Associations 如果File types里面没有*.xml&#xff0c;则点击Add进行新增 选中*.xml&#xff0c;然后在Associated editors 选中想用的编辑器&#xff0c;设置为defaul…

小白也能读懂的ConvLSTM!(开源pytorch代码)

ConvLSTM 1. 算法简介与应用场景2. 算法原理2.1 LSTM基础2.2 ConvLSTM原理2.2.1 ConvLSTM的结构2.2.2 卷积操作的优点 2.3 LSTM与ConvLSTM的对比分析2.4 ConvLSTM的应用 3. PyTorch代码参考文献 仅需要网络源码的可以直接跳到末尾即可 1. 算法简介与应用场景 ConvLSTM&#x…

SAPUI5基础知识22 - 图标(Icons)

1. 背景 SAPUI5 提供了一套丰富的图标库&#xff0c;可以用于增强应用程序的视觉吸引力和用户体验。这些图标是矢量图形&#xff0c;可以在任何分辨率下保持清晰&#xff0c;并且可以自定义颜色和大小。 2. 示例 在 SAPUI5 中&#xff0c;图标可以通过 sap.ui.core.Icon 控件…

Redis快速入门基础

Redis入门 Redis是一个基于内存的 key-value 结构数据库。mysql是二维表的接口数据库 优点&#xff1a; 基于内存存储&#xff0c;读写性能高 适合存储热点数据(热点商品、资讯、新闻) 企业应用广泛 官网:https://redis.io 中文网:https://www.redis.net.cn/ Redis下载与…

The Llama 3 Herd of Models 第6部分推理部分全文

第1,2,3部分 介绍,概览和预训练 第4部分 后训练 第5部分 结果 6 Inference 推理 我们研究了两种主要技术来提高Llama 3405b模型的推理效率:(1)管道并行化和(2)FP8量化。我们已经公开发布了FP8量化的实现。 6.1 Pipeline Parallelism 管道并行 当使用BF16数字表示模型参数时…

家具购物小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;家具分类管理&#xff0c;家具新品管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;家具新品&#xff0c;家具公告&#xff0…

Linux网络——深入理解传入层协议TCP

目录 一、前导知识 1.1 TCP协议段格式 1.2 TCP全双工本质 二、三次握手 2.1 标记位 2.2 三次握手 2.3 捎带应答 2.4 标记位 RST 三、四次挥手 3.1 标记位 FIN 四、确认应答(ACK)机制 五、超时重传机制 六 TCP 流量控制 6.1 16位窗口大小 6.2 标记位 PSH 6.3 标记…

YOLOv5改进 | 卷积模块 | 无卷积步长用于低分辨率图像和小物体的新 CNN 模块SPD-Conv

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 改…