微信小程序实现一个文字展开收起功能

news/2024/5/13 10:31:10/文章来源:https://blog.csdn.net/qq_45219069/article/details/131189305

1.0 需求背景

需求很常见,就是当一行文字过多时,显示省略号,然后显示展开两个字,点击,文字完全展示开,点击收起,回到省略形式,如下图

在这里插入图片描述

2.0 需求分析

有了上图,应该能更好理解,让我们再来细致分析下思路:

  1. 一行省略号,这个没啥难度,css可以实现(至于多行,差别不大)
  2. 展开和收起,初步构想是,收起状态时是通过css控制的省略号,那展开时,我们可以移除省略号的css,这样只需要添加、移除类名即可
  3. 如何确定当前行是否有省略号?这个问题,之前想过字体大小+屏幕宽度来计算一行最多能放下多少个字,实际发现,不够准确,后面想到另外一种方案;
    通过两个盒子嵌套外面大盒子只有一行文字高度,并且溢出隐藏,内层盒子就正常显示,当内层盒子高度 > 外层盒子,那么一定有省略号,故可以确定如下结构
 <!-- 外层盒子,固定只显示一行 -->
<view class="outer" style="height: {{outerHeight}}{{outerHeight == 'auto' ? '' : 'px'}}"><!-- 内层盒子,正常摆放,但是要动态添加省略号类名 --><view class="inner {{ show ? '' : 'ellipsis' }} " style="padding-right: {{ show ? '0' : paddingRight }}px;">{{text}}</view>
</view>
  1. **如何确定一行文字的高度呢?**由于考虑到组件的通用性,笔者这里想了一个办法,写一个dom,将其定位到页面看不见的地方,然后获取一下,并且这里面的字体大小由外部传入,这样就能保证,不管怎么设置都可以准确获取
    <!-- 用于获取一行高度dom -->
<view class="get-height" >获取一行高度的盒子
</view>

3.0 具体实现

上面列举了几个问题,以及解决思考,现在我们就来具体实现

首先,获取dom高度肯定是需要的,这里把它简单封装下

  /*** 获取dom信息* **/ getHeight(selector) {return new Promise((resolve,reject) => {const query = wx.createSelectorQuery().in(this)query.select(selector).boundingClientRect(function(res){resolve(res) }).exec()})},

剩下的,大概就是高度差的判断,决定是否有省略号,以及动态添加、移除css类名,这个过程不算复杂

其实还有一个问题,就是,当确定要显示省略号时,右边切换的dom是需要定位到当前行的末尾,同时,当前行业需要一个padding,而这个padding就是切换按钮的宽度,所以这里也有一点点逻辑

4.0 完整如下

html

<view class="intercept" style="font-size: {{fontSize}};" ><!-- 外层盒子,固定只显示一行 --><view class="outer" style="height: {{outerHeight}}{{outerHeight == 'auto' ? '' : 'px'}}"><view class="inner {{ show ? '' : 'ellipsis' }} " style="padding-right: {{ show ? '0' : paddingRight }}px;">{{text}}</view></view><view wx:if="{{ heightInfo.realHeight > heightInfo.baseHeight }}"class="collapse {{show ? 'collapse-fold' : ''}}"bindtap="toggle" >{{show ? '收起' : '展开'}}</view><!-- 用于获取一行高度dom --><view class="get-height" >获取一行高度的盒子</view>
</view>

js

// components/interceptText/interceptText.js.js
Component({/*** 组件的属性列表*/properties: {text: {type: String,value: ''},fontSize: {type: String,value: '28rpx'//  单位rpx}},/*** 组件的初始数据*/data: {heightInfo: {baseHeight: 0,realHeight: 0},show: true,// 需要动态设置的外层盒子高度outerHeight: 0,paddingRight: 0},lifetimes: {async attached() {this.calculateHeight()},},/*** 组件的方法列表*/methods: {/*** 动态获取展开文字宽度* 确保展开、收起文字能显示* **/ async getCollapseWidth() {let res = await this.getHeight('.collapse')if(!res) returnthis.setData({paddingRight: `${res.width}` || 30})},  /*** 计算高度差,判断是否有省略号* **/ async calculateHeight() {return Promise.all([this.getHeight('.get-height'),this.getHeight('.inner')]).then((res) => {let [baseRes,realRes] = reslet baseHeight = parseInt(baseRes.height || 0)let realHeight = parseInt( realRes.height || 0)if(!baseHeight || !realHeight) {this.setData({outerHeight: 'auto',})return}this.setData({heightInfo: {baseHeight,realHeight},outerHeight: baseHeight,show: !(realHeight > baseHeight)})// 计算展开、收起wx.nextTick(() => {this.getCollapseWidth()})})},/*** 获取dom信息* **/ getHeight(selector) {return new Promise((resolve,reject) => {const query = wx.createSelectorQuery().in(this)query.select(selector).boundingClientRect(function(res){resolve(res) }).exec()})},/*** 展开状态切换* **/ toggle() {this.setData({ show: !this.data.show,outerHeight: this.data.show ? this.data.heightInfo.baseHeight : this.data.heightInfo.realHeight})},}
})

css

.intercept{position: relative;
}
.outer{overflow: hidden;
}
.get-height{position: absolute;z-index: -9999;top: -100%;left: -100%;height: auto;
}
.ellipsis{display: -webkit-box;text-overflow: ellipsis;overflow: hidden;-webkit-line-clamp: 1;-webkit-box-orient: vertical;
}
.collapse{position: absolute;right: 0;bottom: 0;width: fit-content;color: #1989fa;
}
.collapse-fold{position: unset;
}

5.0 总结

笔者认为,实现该功能的难点是如何判断当前行是否应该省略,这里采取一个高度差的办法,基本就没有兼容性问题,不过实际中发下,文字会有闪烁,这是因为高度都是动态计算导致的,展开、收起,可能改为插槽更合适点

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

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

相关文章

第十五个“世界海洋日”:水声功率放大器能为海洋水下声呐研究做些什么?

2023年6月8日&#xff0c;第十五个“世界海洋日”到来&#xff0c;今年的海洋日我们除了要聚焦海洋生态保护和海洋资源的可持续发展及利用&#xff0c;我们同样把视线聚焦在海洋科学研究上&#xff0c;海洋水下声呐技术&#xff0c;就是我们本次的主题。 作为能良好驱动声呐&am…

热门bi报表软件推荐,哪款bi报表软件更功能更强大?

随着商业智能&#xff08;BI&#xff09;的不断发展和应用&#xff0c;越来越多的企业开始关注和使用BI报表软件。但是在众多的BI报表软件中&#xff0c;如何选择一款既功能强大又易于使用的软件&#xff0c;成为了许多企业和个人面临的难题。下面将为大家介绍5款热门的BI报表软…

测试工程师常见的面试问题及回答建议

说起软件测试近几年的发展&#xff0c;其实已悄无声息地发生了巨大的变化。前几年随着互联网行业的迅猛发展&#xff0c;软件测试人才稀缺&#xff0c;低门槛高薪资促使大批毕业生和转行人员一窝蜂地涌入。而现在&#xff0c;软件测试发展太快&#xff0c;纵观各大招聘网站&…

新项目之初性能测试工作如何前移?

最近刚接手一个新项目&#xff0c;在最开始的时候要求对这个项目做性能测试&#xff0c;产品经理也给不出性能需求&#xff0c;只因为这个项目是电商项目&#xff0c;可能会有高并发&#xff0c;秒杀的场景&#xff0c;所以产品经理要求我们对这个项目必须做性能测试&#xff0…

【计算摄影学】总目录

1.数码相机 《数码相机中的图像传感器和信号处理》和《光与赢的魔幻乐园有趣的透镜》 1.1 数码相机概览 1.2 数码相机中光学系统 2.图像传感器 《数码相机中的图像传感器和信号处理》和《智能cmos图像传感器与应用》 2.1 图像传感器基础知识 2.2 CCD图像传感器 2.3 CMOS图像…

mac m1(arm)安装brew(Homebrew)

安装 使用国内脚本安装 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"安装完成后使用brew安装tcping试试 brew install tcping发现报错 Error: Cannot install in Homebrew on ARM processor in Intel default prefi…

SpringBoot(基础篇)

SpringBoot基础篇 入门案例 在创建SpringBoot项目时&#xff0c;会出现以下不需要的文件&#xff0c;如果每次都手动删除的话&#xff0c;就会很麻烦。 教你一招 在setting设置中找到Editor&#xff0c;选择File Types–>Ignored Files and Folders–>点击号&#xff…

接口自动化测试,HttpRunner框架参数化进阶实战,你要的都有...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、获取返回包数据…

python高级-socket和web相关

目录 一、socket 1.客户端开发 2.tcp客户端 3.tcp服务端 4.连接的注意事项 5.多任务服务端 二、静态web 1.请求报文 2.响应头 3.静态web服务器 4.socket静态页面 5.多进程模拟404和200状态码 6.面向对象多任务 结语 一、socket 1.客户端开发 创建客户端套接字对…

001、体系结构之概述

1.TiDB简介 TiDB 是 PingCAP 公司⾃主设计、研发的开源分布式关系型数据库&#xff0c;是⼀款同时⽀持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing,HTAP) 的融合型分布式数据库产品&#xff0c;具备⽔平扩容或者缩容、⾦融级⾼可⽤、实时HTA…

两个链表相加

描述 假设链表中每一个节点的值都在 0 - 9 之间&#xff0c;那么链表整体就可以代表一个整数。 给定两个这种链表&#xff0c;请生成代表两个整数相加值的结果链表。 数据范围&#xff1a;0≤n,m≤1000000&#xff0c;链表任意值 0≤val≤9 要求&#xff1a;空间复杂度 O(n)…

智慧矿山成行业新趋势,千寻位置助力企业数字化转型

随着政策推动和科技发展&#xff0c;智慧矿山已成为矿业行业的趋势和未来的方向。 智慧矿山就是以矿山数字化、信息化为前提和基础&#xff0c;对矿山生产、人员健康与安全、技术支持与后勤保障等进行主动感知、自动分析、快速处理&#xff0c;最终实现安全矿山、无人矿山、高效…

3ds Max - Pivot Painter Tool

很久之前的笔记&#xff0c;整理归档&#xff1b; Pivot Painter Tool是3dsMax中的插件&#xff0c;主要是辅助将Mesh中每个Element生成自己的Pivot Position&#xff0c;方便如使用World Position Offset对每个Element进行精确控制&#xff0c;导入使用Pivot Painter Tool工具…

java读取文件内容

直接上代码&#xff0c;两个类&#xff1a;一个工具类&#xff0c;一个测试类 工具类代码&#xff1a; package org.example.study.util;import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils;import java.io.*; import java.nio.charset.Charset…

企业转型在搭建BI时,需要注意什么

如今&#xff0c;商业智能BI在全世界范围内掀起了一股热潮&#xff0c;形成了一个庞大的市场&#xff0c;在信息化时代&#xff0c;企业需要借助BI来进行更好的成长。 在这种全新的社会、商业BI环境下&#xff0c;各行各业的企业都开始寻求探索新的商业模式&#xff0c;通过转…

python + pytest 接口自动化 —— 参数关联

什么是参数关联&#xff1f; 参数关联&#xff0c;也叫接口关联&#xff0c;即接口之间存在参数的联系或依赖。在完成某一功能业务时&#xff0c;有时需要按顺序请求多个接口&#xff0c;此时在某些接口之间可能会存在关联关系。 比如&#xff1a;B接口的某个或某些请求参数是…

Spring Security--会话管理

就像登录qq一样&#xff0c;一个手机登录会将另外一个手机挤下线&#xff0c;这个就叫会话管理。 这个东西非常简单&#xff0c;在默认情况下可以登录n多次&#xff0c;一旦开启&#xff0c;就不允许登录多个。 什么是一个会话。 我们简单理解就是一个浏览器的同一个用户算一…

0基础转行,网路工程和网络安全哪个更有发展前景?

对于初学者而言&#xff0c;初入IT行业最重要的就是选择一个热门且前景好的职业&#xff0c;而网络工程和网络安全作为IT行业的热门职业必然成为很多人的首选&#xff0c;那么网络工程和网络安全哪个发展前景好?小编带大家详细了解一下。 首先&#xff0c;我们对网络工程和网络…

聊一聊近期测试行情以及个人的感受

众所周知&#xff0c;去年年底的裁员潮再加上今年的疫情影响&#xff0c;失业、找工作成为了蛮多人的当务之急。最近一些招聘网站也出现被刷爆的情况&#xff0c;其中顺利找到工作的并不多&#xff0c;说明行情很冷&#xff0c;但是总有许多人顺利跳槽。 其实对于大牛来说&…

工具篇--4 消息中间件-RabbitMq 模型介绍

1 介绍: RabbitMQ 是一个开源的消息中间件&#xff0c;它实现了 AMQP&#xff08;高级消息队列协议&#xff09;标准&#xff0c;并且支持多种语言和操作系统&#xff0c;包括 Java、Python、Ruby、PHP、.NET、MacOS、Windows、Linux 等等。RabbitMQ 提供了可靠的消息传递机制…