【uniapp】CSS实现多行文本展开收起的文字环绕效果

1. 效果图

  • 收起状态

  • 展开状态

2. 代码实现

html 复制代码
<view class="word-wrap" id="descriptionTxt">
  <view class="fold-text" v-if="isFold">
    <text class="fold-btn" @click="changFold">全文</text>
    <text>{{ describe || '' }}</text>
  </view>
  <view class="unfold-text" v-if="!isFold">
    <text>{{ describe || '' }}</text>
    <text v-if="showFold" style="color: #bdc1c5; float: right; margin-left: 10rpx" @click="changFold">收起</text>
  </view>
</view>
js 复制代码
data: {
  return {
    describe: '', // 动态获取文本内容
    showFold: false, // 是否展示全文/收起
    isFold: false, // 右下角文字:true-全文 false-收起
  }
}

methods: {
  // 判断文本是否超过五行,默认展开
  checkTextLines() {
    const query = uni.createSelectorQuery().in(this)
    query
      .select('#descriptionTxt')
      .boundingClientRect(res => {
        // 获取文本内容的高度
        const contentHeight = res.height
        const lineHeight = rpxTopx(46) // 文字的行高
        const lines = Math.ceil(contentHeight / lineHeight)
        // 判断文本行数是否达到了5行
        if (lines > 5) {
          this.showFold = true
        } else {
          this.showFold = false
        }
      })
      .exec()
  },
  // 切换展开/收起
  changFold() {
    this.isFold = !this.isFold
  }
}
css 复制代码
.word-wrap {
  display: flex;
  
  // 收起状态
  .fold-text {
    font-size: 28rpx;
    color: #484848;
    line-height: 46rpx;
    text-align: justify;
    word-break: break-all;
    line-break: anywhere;
    white-space: pre-wrap;
    display: -webkit-box;
    overflow: hidden;
    -webkit-line-clamp: 5;
    -webkit-box-orient: vertical;
  }
  .fold-text::before {
    content: '';
    float: right;
    width: 0;
    /* 用整个容器高度减去按钮的高度,发现高度失效了,这里需要给 .fold-text 包裹一层,然后设置 display: flex */
    /* height: calc(100% - 46rpx); */

    /* 或者用margin负值来实现(性能会比 calc 略好一点) */
    height: 100%;
    margin-bottom: -46rpx;
  }
  .fold-btn {
    color: #bdc1c5;
    float: right;
    clear: both;
    margin-left: 10rpx;
  }
  
  // 未收起状态
  .unfold-text {
    font-size: 28rpx;
    color: #484848;
    line-height: 46rpx;
    text-align: justify;
    word-break: break-all;
    line-break: anywhere;
    white-space: pre-wrap;
  }
}

经测试:部分机型会有bug,后面就没用这种方法了,不知道大家有没有更好的方法实现这种效果,欢迎留言~。

具体原理请参考大佬文章:前端实现超出文字显示展开收起的功能

相关推荐
tanxiaomi18 分钟前
阿里云 OSS 前端直传实战:表单上传 + Policy 模式详解
前端·阿里云·云计算
Moment20 分钟前
面向前端的 9 大 RAG 进阶方法 ☺️☺️☺️
前端·后端·面试
江城开朗的豌豆21 分钟前
React全家桶:从"玩具"到"生产力"的奇妙之旅
前端·javascript·react.js
这里有鱼汤24 分钟前
A股牛市背后:花姐分享独家Python脚本,揭示哪些行业和个股推动上证指数上涨
前端
Mike_jia25 分钟前
Dozzle:实时监控Docker日志的轻量级神器,运维效率提升300%!
前端
前端小巷子29 分钟前
Vue渲染器解析
前端·vue.js·面试
晓得迷路了33 分钟前
栗子前端技术周刊第 95 期 - Next.js 15.5、Rslint、2025 年 CSS 现状报告...
前端·javascript·css
江城开朗的豌豆42 分钟前
React传送门createPortal
前端·javascript·react.js
石小石Orz42 分钟前
使用Trae将油猴脚本打包成谷歌插件
前端·trae
盛夏绽放7 小时前
jQuery 知识点复习总览
前端·javascript·jquery