微信小程序列表实现文字内容超出隐藏并显示全文/收起按钮
针对这个功能,产品的需求如下
由于我们项目是教育类产品所以这里这个功能会用在发动态这里,就像微信朋友圈那样,我们叫班级圈。
用户发班级圈时,可以发布文字内容、图片、视频,文字可以输入500个字。这样的话,如果列表一次展示全部文字,如果用户真有500个文字就基本一条动态占用了整屏高度,对于用户体验来说,用户一眼看到的东西太少了,所以产品就提出了需要折叠文字需求,并说明文字需要满6行的时候折叠,并显示全文按钮,当用户点击全文按钮时要展开所有内容,当点击收起按钮又变回折叠状态。

说完需求,现在来说说问题
首先,开发过小程序的朋友都知道,小程序内部是无法操作dom的,也就是说根本没有dom这个东西。
但是,需求是需要内容满足6行,并且满足6行后才显示全文按钮,才可以操作,如果是不满足六行的,是不应该显示全文按钮的,直接正常展示就行,这里问题就来了。

如何折叠文本,让文本超出隐藏?
如果小程序不能操作dom,如何判断显示全文按钮?
我的解决方案
第一个问题
其实第一个问题不是问题,因为我们都知道文本多行超出隐藏是可以直接使用css就能解决的,所以下面我就直接贴出实现代码

display: -webkit-box;
  word-break: break-all;
  text-overflow: ellipsis;
  overflow: hidden;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 7;
第二个问题
下面我们来说说第二个问题,如何去判断满足6行就显示全文按钮。
虽说小程序是不能操作dom的,但是能不能获取到dom的一些信息呢?
答案是可以的,小程序API确实提供了一套能够去获取节点上的一些信息接口,接口名叫createSelectorQuery,创建一个选择器对象,通过选择器对象提供的方法去做一些操作,这里我们需要用到选择器对象的两个方法

select('css selector')
boundingClientRect(fn)
首先,通过select去选择我们需要获取信息的节点,参数是css的选择器,只能选择单个节点,如果需要选择多个节点可使用selectAll。然后再通过boundingClientRect方法查询布局的位置请求,相对于显示区域,以像素为单位。其功能类似于DOM的getBoundingClientRect。
该方法参数可接受一个回调,回调参数接受一个查询到的信息对象,其对象有以下信息

id :节点ID
dataset: 节点的dataset
left: 节点的左边界坐标
right: 节点的右边界坐标
top:节点的上边界坐标
bottom:节点的下边界坐标
width: 节点的宽度
height: 节点的高度
下面是一个完整示例

Page({
  getRect () {
    wx.createSelectorQuery().select('#the-id').boundingClientRect(function(rect){
      rect.id      // 节点的ID
      rect.dataset // 节点的dataset
      rect.left    // 节点的左边界坐标
      rect.right   // 节点的右边界坐标
      rect.top     // 节点的上边界坐标
      rect.bottom  // 节点的下边界坐标
      rect.width   // 节点的宽度
      rect.height  // 节点的高度
    }).exec()
  },
  getAllRects () {
    wx.createSelectorQuery().selectAll('.a-class').boundingClientRect(function(rects){
      rects.forEach(function(rect){
        rect.id      // 节点的ID
        rect.dataset // 节点的dataset
        rect.left    // 节点的左边界坐标
        rect.right   // 节点的右边界坐标
        rect.top     // 节点的上边界坐标
        rect.bottom  // 节点的下边界坐标
        rect.width   // 节点的宽度
        rect.height  // 节点的高度
      })
    }).exec()
  }
})
下面说一下这个exec(),它的作用是执行所有的请求,请求结果按请求次序构成数组,在callback的第一个参数中返回出来。
以上说完了获取节点信息的方法,可能大家心中会有疑问,为什么我要提这些东西?因为我们需要判断用户现在的文本高度,所以需要获取当前用户发布的文字内容高度,通过高度去评判内容是否满足来6行。

实现
第一实现方式
我发布了一个超过六行文本动态,然后分别打印出了在安卓和ios机器上的六行高度,这样就有了判断依据,先获取当前文本高度,如果等于了六行高度就显示全文按钮,下面是代码

<text class="x-collapse-txt x-clr-dgray {{isOpen ? 'x-collapse-open' : ''}}">
    {{content}}
  </text>
  <view class="x-collapse-btn" catchtap="open" wx:if="{{height == 133 || height == 154}}">{{!isOpen ? '全文' : '收起'}}</view>
  <script>
  const {pageImgHost} = getApp()
  Component({
    options: {
      styleIsolation: 'isolated'
    },
    properties: {
      content: {
        type: String,
        value: ''
      }
    },
    data: {
      pageImgHost,
      height: '',
      isOpen: false
    },
    methods: {
      open () {
        this.setData({
          isOpen: !this.data.isOpen
        })
      },
      getHeight (cls) {
        return new Promise(resolve => {
          const query = wx.createSelectorQuery().in(this)
          query.select(cls).boundingClientRect(res => {
            resolve(res.height)
          }).exec()
        })
      }
    },
    attached () {
      this.getHeight('.x-collapse-txt').then(height => {
        this.setData({
          height
        })
      })
    }
  })
  </script>
现在如果像上面那样写是有兼容问题,就是安卓机型太多了,有的设备六行高度是不一样的,不可能给不一样高度的手机都获取一个高度写成判断,也就是说我们把判断依据的目标值写死了,这样是很要命的,所以这个就直接被pass了。

第二实现方式
经过上面暴露的问题,我们把判断的目标值写死了这样是不行的,那怎么样可以不写死呢?下面我是这样做的,我在结构里面多写了一个节点,然后定位到了看不见到地方,这个节点输入了很多文本内容,让撑满6行高度,然后通过获取高度的方式直接获取这个节点高度,这样一来我们就不管什么什么机型手机都能拿到当前这个机器上6行高度都目标值,这样一来就有了一个精准都目标值,就有了精确条件了。修改上方代码后,是这样的

<text class="x-collapse-txt x-clr-dgray {{isOpen ? 'x-collapse-open' : ''}}">
    {{content}}
  </text>
  <text class="x-collapse-ctxt x-clr-dgray x-p">我我我我我我我我我我我我</text>
  <view class="x-collapse-btn" catchtap="open" wx:if="{{height === h}}">{{!isOpen ? '全文' : '收起'}}</view>

<script>
  const {pageImgHost} = getApp()
  Component({
    options: {
      styleIsolation: 'isolated'
    },
    properties: {
      content: {
        type: String,
        value: ''
      }
    },
    data: {
      pageImgHost,
      height: '',
      isOpen: false,
      h: 0
    },
    methods: {
      open () {
        this.setData({
          isOpen: !this.data.isOpen
        })
      },
      getHeight (cls) {
        return new Promise(resolve => {
          const query = wx.createSelectorQuery().in(this)
          query.select(cls).boundingClientRect(res => {
            console.log(res.height)
            resolve(res.height)
          }).exec()
        })
      }
    },
    attached () {
      Promise.all([
        this.getHeight('.x-collapse-ctxt'),
        this.getHeight('.x-collapse-txt')
      ]).then(([h, height]) => {
        this.setData({
          h,
          height
        })
      })
    }
  })
  </script>

<style>
  .x-collapse-txt, .x-collapse-ctxt {
    line-height: 40rpx;
    font-size: 28rpx;
    margin-top: -24rpx;
    display: -webkit-box;
    word-break: break-all;
    text-overflow: ellipsis;
    overflow: hidden;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 7;
  }
  .x-collapse-open {
    display: block;
  }
  .x-collapse-btn-wrap {
    display: flex;
    justify-content: flex-end;
  }
  .x-collapse-btn {
    font-size: 28rpx;
    width: 60rpx;
    line-height: 60rpx;
    color: #5b6a91;
  }
  .x-p {
    position: fixed;
    top: 200%;
    z-index: -10;
  }
  </style>

微信小程序列表实现文字内容超出隐藏并显示全文/收起按钮相关推荐

  1. 小程序 WXS响应事件(超出两屏显示返回顶部按钮)

    小程序 WXS响应事件(超出两屏显示返回顶部按钮) 两种解决办法: view页面形式实现: <wxs module="test" src="./test.wxs&q ...

  2. 微信小程序-canvas绘制文字实现自动换行

    微信小程序-canvas绘制文字实现自动换行 在使用微信小程序canvas绘制文字时,时常会遇到这样的问题:因为canvasContext.fillText参数为 我们只能设置文本的最大宽度,这就产生 ...

  3. 微信小程序获取输入框(input)内容

    微信小程序---获取输入框(input)内容 wxml <input placeholder="请输入手机号码" maxlength="11" type= ...

  4. 微信小程序详解 php,微信小程序列表开发详解

    本文主要和大家分享微信小程序列表开发详解,主要以代码的形式和大家分享,希望能帮助到大家. 一.知识点 (一).列表渲染 wx:for tip:wx:for="array"可以等于参 ...

  5. 微信小程序列表加载动画示例

    微信小程序列表加载动画 微信小程序列表加载动画示例 实现思路 什么是动画? 导航栏设置 列表动画加载 完整代码demo 微信小程序列表加载动画示例 初学微信小程序开发,记录一下.网上找了很久这种效果, ...

  6. 微信 html 字体 自动换行,详解微信小程序-canvas绘制文字实现自动换行

    在使用微信小程序canvas绘制文字时,时常会遇到这样的问题:因为canvascontext.filltext参数为 我们只能设置文本的最大宽度,这就产生一定的了问题.如果我们绘制的文本长度不确定或者 ...

  7. 微信小程序图片与文字安全检测security.msgSecCheck和security.imgSecCheck

    微信小程序线上版本涉及到内容发布评论等,就需要进行安全检测,否则官方会上传一些huang图等敏感信息,这样就对我们的小程序的运行非常的不友好. 微信小程序图片与文字安全检测security.msgSe ...

  8. php渲染页面简单例子,微信小程序如何渲染html内容(示例讲解)

    本篇文章给大家带来的内容是关于微信小程序如何渲染html内容(示例讲解),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 最近又做了一个新的小程序关于物流订单查询 遇到了一个小问题:数 ...

  9. 微信小程序实现html格式内容

    最近项目上遇到在微信小程序里需要显示新闻内容,新闻内容是通过接口读取的服务器中的富文本内容,是html格式的,小程序默认是不支持html格式的内容显示的,那我们需要显示html内容的时候,就可以通过w ...

最新文章

  1. auto drop ssh failed ip address
  2. FISCO BCOS 2.0发布:新增群组架构克服吞吐瓶颈
  3. vue2.0移除或更改的一些东西
  4. Nature methods | Alevin-fry, 一种高效准确的单细胞测序数据预处理工具
  5. 实战:RedisCluster搭建和扩容(伪集群:4主4从)
  6. python 字符串替换多个_python同时替换多个字符串方法示例
  7. python中文件打开的合法模式组合_以下选项中,不是Python文件打开的合法模式组合是:...
  8. SSH框架下的在线人数统计的一种解决途径
  9. Delphi 10.4.2 (RAD Studio 10.4.2 )安装教程图解
  10. 产品读书《一页纸项目管理》
  11. scratch课程案例——猜拳游戏
  12. ISE14.7从程序设计到下载
  13. 记录下docker命令
  14. linux桌面下雪,一个让桌面下雪的ruby 小程序 snow
  15. php storm官网,phpstorm官方版
  16. 阿里达摩院最新FEDformer,长程时序预测全面超越SOTA | ICML 2022
  17. 怎么下载电脑自带的office版本
  18. edge浏览器怎么设置activex_微软Edge浏览器将不再支持ActiveX等老技术
  19. 通达信波段王指标公式主图_通达信超级大波段主图指标公式
  20. 第28节 防火墙基本知识、工作原理及工作模式

热门文章

  1. 数字未来:世界正走向新的“破茧时刻”
  2. 查看服务器是否支持ipv6(Linux)
  3. 手游IP+精细化运营 掌握游戏运营的核心才能武动乾坤
  4. 什么是工业机器人的自由度?
  5. 分布式存储Ceph-octopus版本手动实践部署与运维管理
  6. 刘强东“退位”,东哥的兄弟们怎么办?| 文末送书
  7. Ubuntu 使用 PPA 安装ffmpeg 4
  8. 从华为任正非罕见接受外媒采访透漏出来的强大的华为基因
  9. 江阴学院计算机网络,【计算机维护论文】谈计算机网络技术课程思政实践(共4150字)...
  10. java函数方法详解(简单易懂)