【vue】实现超过两行或多行显示展开收起 (单个展开收起和数组多个展开收起)

1.单个展开收起

1.实现功能如下图:

在这里插入图片描述

2.代码

1.html代码

<div class="top">
      <span
        :style="{ 'max-height': textOpenFlag ? textHeight : '' }"
        :class="{ unfoldText: textOpenFlag }"
        class="titleText"
        ref="textContainer"
      >
        调查问卷表调查问卷表调查问卷表调查问卷表调查问卷表调查问卷表调查问卷表调查问卷表调查问卷表调查问卷表调查问卷表
      </span>
      <span
        v-if="showBtnFlag"
        @click="textOpenFlag = !textOpenFlag"
        class="btn"
        >{{ textOpenFlag ? "展开" : "收起" }}</span
      >
</div>
  1. js 代码
data () {
  return {
	 textHeight: '',  // 想要显示的高度
     textOpenFlag: false,  // 展开/收起 判定
     showBtnFlag: false,  // 是否显示展开收起
  }
},
mounted() {
   this.$nextTick(() => {
      setTimeout(() => {
       this.showAllText ();
     }, 300);
  });
},
methods: {
  showAllText () {
     // 默认展示两行数据的高度,20是一行的高度可以自定义 *2 表示展示两行 如果想要显示n行就*n
      let twoHeight = 20 * 2;
      this.textHeight = `${twoHeight}px`;
      let curHeight = this.$refs.textContainer.offsetHeight;
      if (curHeight > twoHeight) {
        this.textOpenFlag = true;
        this.showBtnFlag = true;
      } else {
        this.textOpenFlag = false;
        this.showBtnFlag = false;
      }
  }
}
  1. css代码
.top{
	  font-size: 14px;
      color: #333333;
      position: relative;
      .hiddenText {
        overflow: hidden;
        display: block;
      }
      .hiddenText:after {
        z-index: 3;
        content: "...";
        position: absolute;
        bottom: 2px;
        right: 55px;
        width: 14px;
        padding-left: 15px;
        background: linear-gradient(to right, rgba(255, 255, 255, 0.1), #fff 45%);
      }
	 .btnMore{
	   color: #34B7B9;
	   position: absolute;
	   right: 0;
	   bottom: 0;
	   background-color: #fff;
	}
}

2.多个情况展示

  1. html代码
<div class="more" v-for="(item, index) in moreList" :key="item.index">
    <div class="top">
       <span
         :style="{'max-height': item.textOpenFlag ? textHeight : ''}"
         :class="{hiddenText: item.textOpenFlag}"
          class="textMore"
          ref="textContainer"
        >{{moreListName[index].join('、')}}</span>
       <span
         v-if="item.textOpenFlag !== null"
         @click="item.textOpenFlag = !item.textOpenFlag"
         class="btnMore"
       >{{item.textOpenFlag ? '【展开】':'【收起】'}}</span>
   </div>
   <div class="bottom">
      <div class="time">
         <span>{{moment(item.paidAt * 1000).format('YYYY-MM-DD hh:mm')}}</span>
         <span>{{item.price}}</span>
      </div>
     <div class="app">仅支持在APP中测试</div>
  </div>
 </div>
  1. js 代码
data () {
  return {
  	 moreList: [],   // 数据数组
	 textHeight: '',  // 想要显示的高度
     textOpenFlag: false,  // 展开/收起 判定
     showBtnFlag: false,  // 是否显示展开收起
  }
},
mounted() {
   this.getTableList()  // 调用后端获取数据
},
methods: {
  async getTableList () {
      const res = await getIndividual({ page: -1, pageSize: 10 })
      this.moreList = res.data.records   //后端获取数据赋值给数组
      this.moreList.forEach((ele, index) => {
        this.$set(  // 给获取到的数组数据  添加属性来判定 展示/收起
          this.moreList,
          index,
          Object.assign({}, ele, { textOpenFlag: null })
        )
      })
      this.$nextTick(() => {
        this.showTextAll()
      })
    },
  showTextAll () {
      // 默认展示两行数据的高度,20是一行的高度可以自定义 *2 表示展示两行 如果想要显示n行就*n
      const twoHeight = 20 * 2
      this.textHeight = `${twoHeight}px`
      const txtDom = this.$refs.textContainer
      for (let i = 0; i < txtDom.length; i++) {
        const curHeight = txtDom[i].offsetHeight
        if (curHeight > twoHeight) {
          this.$set(
            this.moreList,
            i,
            Object.assign({}, this.moreList[i], { textOpenFlag: true })
          )
        } else {
          this.$set(
            this.moreList,
            i,                              // 如果高度够的话就为null 不显示展示/收起按钮
            Object.assign({}, this.moreList[i], { textOpenFlag: null })  
          )
        }
      }
   }
}

css代码和单个情况的css样式一样,如上所示 不需要改动

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Vue实现多行文本的展开收起功能可以通过计算多行文本的高度来进行判断,并使用Vue的条件渲染来实现展开收起效果。 首先,在data中定义一个变量,例如`isExpanded`,用于控制文本的展开收起状态,默认值设为`false`。 然后,在模板中使用条件渲染来根据`isExpanded`的值展示不同的内容。 例如,使用`v-if`指令来判断是否展开,如果展开显示完整文本,否则只显示指定行数的文本。可以使用`v-text`指令来绑定文本内容。通过CSS的`line-clamp`属性来设置文本行数,超出的部分将被省略。 ``` <template> <div> <div v-if="isExpanded"> <div v-text="text"></div> </div> <div v-else> <div class="clamp-line" v-text="text"></div> </div> <button @click="toggleExpand"> {{ isExpanded ? '收起' : '展开' }} </button> </div> </template> <script> export default { data() { return { isExpanded: false, text: "这是一段多行文本" }; }, methods: { toggleExpand() { this.isExpanded = !this.isExpanded; } } }; </script> <style scoped> .clamp-line { display: -webkit-box; overflow: hidden; text-overflow: ellipsis; -webkit-line-clamp: 3; /* 设置为需要显示的行数 */ -webkit-box-orient: vertical; } </style> ``` 以上代码中,点击按钮时会触发`toggleExpand`方法,通过修改`isExpanded`的值来切换展开收起状态。根据`isExpanded`的值,使用不同的模板来渲染文本内容。 按钮的文本内容也根据`isExpanded`的值来显示展开”或“收起”。点击按钮时,会调用`toggleExpand`方法切换`isExpanded`的值。 通过以上代码和样式设置,就可以实现一个简单的多行文本展开收起的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值