我的编程空间,编程开发者的网络收藏夹
学习永远不晚

小程序如何实现全文收起功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

小程序如何实现全文收起功能

这篇“小程序如何实现全文收起功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“小程序如何实现全文收起功能”文章吧。

一、需求

  • 位于多行文本右下角,展示”全文/收起“按钮

  • “展开”和“收起”两种状态的切换

  • 当文本不超过指定行数时,不显示”全文/收起“按钮

  • 文本显示【全文】展示状态下,更新数据,文本不被收起

二、实现思路

1、多行文本截断

主要用到用到 line-clamp,关键样式如下

.text-clamp3 {  overflow: hidden;  display: -webkit-box;  -webkit-box-orient: vertical;  -webkit-line-clamp: 3;}

2、判断文本是否超出指定行数,显示全文 收起 按钮

编写两段文本,一段展示完整的文本A,一段展示使用 line-clamp省略后的文本B,因为B有被截取,因此B的高度相对较小。对比两段文本的高度,便可以知道文本是否超出两行

在小程序里,可以使用wx.createSelectorQuery()获取文本高度

js

const query = wx.createSelectorQuery().in(this);query.selectAll(".showArea, .hideArea").boundingClientRect(res => {console.log(res, 'res')}).exec()

三、代码实现

1、初次版本

根据设计思路,立马上手代码

foldable.wxml

<view class="content">  <view class="contentInner content-inner-class showArea {{!onFold ? 'text-clamp' + maxLine : ''}}">{{content}}</view>  <view class="contentInner content-inner-class hideArea" style="width: {{width}}px">{{content}}</view>  <view class="foldInner fold-class {{position === 'right' ? 'flex-end' : 'flex'}}" wx:if="{{showFold}}">    <text class="fold" catchtap="handleFold">{{onFold ? unFoldText : onFoldText}}</text>  </view></view>

foldable.js

Component({  externalClasses: ['content-inner-class', 'fold-class'],  properties: {    content: {      type: String,      observer(val) {        if (this.data.onReady) {          this.getNodeClientReact()        }      }    },    maxLine: {      type: Number,      value: 1,      observer(value) {        if (!(/^[1-5]$/).test(value)) {          throw new Error(`maxLine field value can only be digits (1-5), Error value: ${value}`)        } else if (this.data.onReady) {          this.getNodeClientReact()        }      }    },    position: {      type: String,      value: "left"    },    foldable: {      type: Boolean,      value: true    },    // 收缩时文字    onFoldText: {      type: String,      value: "全文"    },    // 展开时文字    unFoldText: {      type: String,      value: "收起"    },  },  data: {    width: null,    onFold: false,    showFold: false,    onReady: false  },  lifetimes: {    attached() {      this.getNodeClientReact()      this.setData({        onReady: true      })    },  },  methods: {    getNodeClientReact() {      setTimeout(() => this.checkFold(), 10)    },    checkFold() {      const query = this.createSelectorQuery();      query.selectAll(".showArea, .hideArea").boundingClientRect(res => {        let showFold = res[0].height < res[1].height;        this.setData({          width: res[0].width,          showFold,        })      }).exec()    },    handleFold() {      this.setData({        onFold: !this.data.onFold      })    }  }})

foldable.wxss

.content {  width: 100%;  position: relative;  overflow: hidden;}.contentInner {  word-break: break-all;  width: 100%;  color: #2f3033;  font-size: 30rpx;  line-height: 1.35;}.hideArea {  display: -webkit-box;  overflow: hidden;  position: fixed;  top: 100vh;  left: -100vw;}.foldInner {  padding-top: 10rpx;  color: #6676bd;  font-size: 32rpx;}.foldInner .fold {  cursor: pointer;}.text-clamp1 {  overflow: hidden;  display: -webkit-box;  -webkit-box-orient: vertical;  -webkit-line-clamp: 1;}.text-clamp2 {  overflow: hidden;  display: -webkit-box;  -webkit-box-orient: vertical;  -webkit-line-clamp: 2;}.text-clamp3 {  overflow: hidden;  display: -webkit-box;  -webkit-box-orient: vertical;  -webkit-line-clamp: 3;}.text-clamp4 {  overflow: hidden;  display: -webkit-box;  -webkit-box-orient: vertical;  -webkit-line-clamp: 4;}.text-clamp5 {  overflow: hidden;  display: -webkit-box;  -webkit-box-orient: vertical;  -webkit-line-clamp: 5;}

2、修复版本

正常情况下,此方法可行,但是在级别文字下,会计算错误。经过测试,可将 节点是.hideArea的内容定位在.showArea节点下可解决

foldable.wxss

.hideArea {  display: -webkit-box;  overflow: hidden;    position: absolute;  top: 0;  left: 0;  z-index: -1;  color: #fff;}

3、增强版本

经过修复之后,本来是可以完美实现了,但是在测试过程中,第一次正常渲染是没有问题。但如果文本数据更新,会发现如果原来的文本从一行增加到两行时,使用wx.createSelectorQuery()计算的高度会有存在是实际高低的两倍的现象。导致会错误出现【全文】文字。然后文本从两行增加到三行或者多行都没问题,不太理解为什么会出现这个错误计算的现象。

为了弥补这个坑,我引入了lineHieght这个属性。

// foldable.jsComponent({    properties: {        lineHieght: {          type: Number,          observer(value) {            if (!(/^[0-9]*$/).test(value)) {              throw new Error(`lineHieght field value can only be digits`)            }          }        }    }})

通过lineHieght和最多可展示行数maxLine可以计算出,可在界面展示的最大高度。

// 文本可见的最大高度const maxHeight = this.data.lineHieght * this.data.maxLine;

当然了,我们也需要适配不同的设备,而且通过wx.createSelectorQuery()计算出来的结果是以px为单位的。

所以,行高需要根据设备尺寸去改变。因为我们是以宽度是750px尺寸为设计稿的,所以根据wx.getSystemInfoSync()可以获取设备信息,进而转换成px的尺寸。

// foldable.jschangeRpxToPx(rpxInteger) {  return wx.getSystemInfoSync().windowWidth / 750 * rpxInteger},

因此,更新checkFold方法

checkFold() {  const query = this.createSelectorQuery();  query.selectAll(".showArea, .hideArea").boundingClientRect(res => {    let showFold = res[0].height < res[1].height;    const lineHeightToPx = this.changeRpxToPx(this.data.LineHeight);    // 展示区域高度(即是可能会被截取的可见文字)    const showAreaHeight = res[0].height;    // 隐藏区域的高度(即是完整文本高度,偶然事件会计算错误)    const hideAreaHeight = res[1].height;    // 文本可见的最大高度    const maxHeight = lineHeightToPx * this.data.maxLine;    // 如果是一行文字,偶然计算错误,用行高判断    if (this.data.LineHeight && showAreaHeight <= maxHeight) {      showFold = hideAreaHeight > maxHeight    }    this.setData({      width: res[0].width,      showFold,    })  }).exec()},

4、最终版本

经过上一个版本,基本功能都已经实现。但是,如果文本超过最大行数,并且在展开全文的情况下,更新了文本,此时,全文/展开按钮会展示错误。

通过分析代码可知,在展开全文的状态下更新了文本,此时.showArea节点和.hideArea节点的高度一致,执行代码let showFold = res[0].height < res[1].height;,会返回false,因此按钮会消失。

因此解决方案为:

// 如果文本超出最大行数,并且是显示全文的状态下,再次更新了文字let onFold = falseif (showAreaHeight == hideAreaHeight && showAreaHeight > maxHeight) {  showFold = true  onFold = true}

所以最终版本的checkFold方法是:

checkFold() {  const query = this.createSelectorQuery();  query.selectAll(".showArea, .hideArea").boundingClientRect(res => {    let showFold = res[0].height < res[1].height;    const lineHeightToPx = this.changeRpxToPx(this.data.LineHeight);    // 展示区域高度(即是可能会被截取的可见文字)    const showAreaHeight = res[0].height;    // 隐藏区域的高度(即是完整文本高度,偶然事件会计算错误)    const hideAreaHeight = res[1].height;    // 文本可见的最大高度    const maxHeight = lineHeightToPx * this.data.maxLine;    // 如果是一行文字,偶然计算错误,用行高判断    if (this.data.LineHeight && showAreaHeight <= maxHeight) {      showFold = hideAreaHeight > maxHeight    }    // 如果文本超出最大行数,并且是显示全文的状态下,再次更新了文字    let onFold = false    if (showAreaHeight == hideAreaHeight && showAreaHeight > maxHeight) {      showFold = true      onFold = true    }    this.setData({      width: res[0].width,      showFold,      onFold,    })  }).exec()},

以上就是关于“小程序如何实现全文收起功能”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

小程序如何实现全文收起功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

小程序如何实现全文收起功能

这篇“小程序如何实现全文收起功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“小程序如何实现全文收起功能”文章吧。一、需求位
2023-06-29

Android如何实现仿微信朋友圈全文、收起功能

小编给大家分享一下Android如何实现仿微信朋友圈全文、收起功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!效果图具体代码(详细解释在代码注释中都有,这里就省
2023-05-30

Android开发中怎么实现一个全文收起功能

这期内容当中小编将会给大家带来有关Android开发中怎么实现一个全文收起功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先写一个布局,这个布局是每个子项的布局 item_text_list.xml<
2023-05-31

小程序客服功能如何实现

这篇“小程序客服功能如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“小程序客服功能如何实现”文章吧。  小程序客服功能
2023-06-26

小程序如何实现分享功能

要在小程序中实现分享功能,可以按照以下步骤操作:在小程序的页面中使用或标签创建一个分享按钮或分享图标。通过小程序API获取当前页面的路径,可以使用wx.getCurrentPages()方法获取当前页面的路由信息。调用小程序API中的wx.
小程序如何实现分享功能
2024-04-17

微信小程序如何实现美食展示与收藏功能

小编给大家分享一下微信小程序如何实现美食展示与收藏功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、项目展示今日美食是为用户提供各种美食的制作方法,详细介绍了
2023-06-29

小程序发起微信支付功能怎么实现

这篇文章主要讲解了“小程序发起微信支付功能怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“小程序发起微信支付功能怎么实现”吧!wx.requestPayment(OBJECT)发起微信
2023-06-26

php如何实现小程序登录功能

本篇内容介绍了“php如何实现小程序登录功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!RequestTask说明方法说明RequestT
2023-06-21

如何实现小程序canvas拖拽功能

这篇“如何实现小程序canvas拖拽功能 ”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何实现小程序canvas拖拽功能
2023-06-26

小程序如何实现计时器功能

这篇文章主要介绍“小程序如何实现计时器功能”,在日常操作中,相信很多人在小程序如何实现计时器功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”小程序如何实现计时器功能”的疑惑有所帮助!接下来,请跟着小编一起来
2023-07-02

小程序如何实现模糊搜索功能

本文小编为大家详细介绍“小程序如何实现模糊搜索功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“小程序如何实现模糊搜索功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.写好页面布局
2023-07-02

小程序如何实现侧滑删除功能

这篇“小程序如何实现侧滑删除功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“小程序如何实现侧滑删除功能”文章吧。1.页面布
2023-07-02

小程序中如何实现canvas拖动功能

这篇文章给大家分享的是有关小程序中如何实现canvas拖动功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。创建画布2023-06-21

微信小程序转发功能如何实现

这篇文章主要介绍“微信小程序转发功能如何实现”,在日常操作中,相信很多人在微信小程序转发功能如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”微信小程序转发功能如何实现”的疑惑有所帮助!接下来,请跟着小编
2023-06-26

微信小程序支付功能如何实现

这篇文章主要介绍了微信小程序支付功能如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序支付功能如何实现文章都会有所收获,下面我们一起来看看吧。微信小程序支付功能开发文档如下:小程序端,保留大部分的
2023-06-26

微信小程序如何实现计算器小功能

这篇文章主要介绍微信小程序如何实现计算器小功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!微信小程序现在越来越火爆了,我也看到很多在校大学生都在自学了,那些专门从事APP开发,网页开发的工作者更是看到了小程序的前景
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录