vue中,使用css实现多行文本【展开收起】功能

vue中,使用css实现多行文本【展开收起】功能

先看看效果:
在这里插入图片描述
1.父组件

<template>
  <div>
    <ul class="ul_list">
      <li ref="descRef" v-for="item in list" :key="item.id">
        <ListItem :listData="item"></ListItem>
      </li>
    </ul>
  </div>
</template>
<script>
import ListItem from "./module/ListItem";  
export default {
  name: "ParentPage",
  components: { ListItem },
  data() {
    return {
      list: [
        {
          id: "0",
          desc: "123123,456,123123,456,123123,456,123123,456,123123,456,123123,456,",
        },
        {
          id: "1",
          desc: "这是文本内容,这是文本内容",
        },
        {
          id: "2",
          desc: "这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,这是文本内容,",
        },
      ],
    };
  }
};
</script>
<style scoped lang="scss">
.ul_list {
  width: 200px;
  margin: 50px 200px 0;
  li {
	  list-style: none;
	  border-bottom: 1px solid #ddd;
	  padding: 10px 0;
	  border: 1px solid #eee;
	  border-radius: 8px;
	  margin: 6px 6px 6px 0;
	  background: #eee;
	  padding: 6px;
	  display: flex;
	  overflow: hidden;
  }
}
</style>
  1. ListItem 子组件(重点
<template>
  <div ref="listDom" class="item" :class="{ spreadSty: isSpread }">
    <div class="btn" v-if="showBtn" @click="isSpread = !isSpread">
      {{ isSpread ? "收起>" : "展开>" }}
    </div>
    <div class="desc">{{ listData.desc }}</div>
  </div>
</template>
<script>
export default {
  name: "ListItem",
  props: {
    listData: {
      type: Object,
      default: () => {},
    },
  },
  data() {
    return {
      showBtn: false,  //是否显示【展开/收起】按钮
      isSpread: false, 
    };
  },

  watch: {
    "listData.id": {
      immediate: true,
      handler() {
      //判断是否显示【展开/收起】按钮
        this.$nextTick(() => {
          const { clientHeight, scrollHeight } = this.$refs.listDom;
          this.showBtn = scrollHeight > clientHeight;
        });
      },
    },
  },
};
</script>
<style scoped lang="scss">
.item {
  text-align: left;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  text-overflow: ellipsis;
  overflow: hidden;
  line-height: 20px;
  .desc {
    word-break: break-all;  /*英文换行*/
  }
  /*重点1 使用伪元素进行浮动*/
  &::before {
    content: "";
    float: right;
    /*动态高度,使用负margin, 性能比calc 好一点*/
    height: 100%;
    margin-top: -20px;
    /*height: calc(100% - 20px);*/
  }
  .btn {
    position: relative;
    /*重点2 按钮设置浮动,并使用clear: both 将按钮移到文本右下角*/
    float: right;
    clear: both;
    font-size: 14px;
    height: 20px;
    line-height: 20px;
    padding: 0 4px;
    background: purple;
    cursor: pointer;
    color: #fff;
    margin-left: 10px;
  }
   /*重点3  展开时的样式*/
  &.spreadSty {
    -webkit-line-clamp: 999;  /*设置一个足够大的行数就可以了*/
  }
}

本文借鉴自:CSS 实现多行文本“展开收起”

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
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`的值。 通过以上代码和样式设置,就可以实现一个简单的多文本展开收起功能

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值