vue封装一个多行文本展开收起的组件

该代码示例展示了一个Vue组件,用于处理文本的展开和收起效果。利用CSS的`-webkit-line-clamp`属性限制显示的行数,通过Vue的响应式数据`isAll`和`showCtro`控制按钮状态及文本显示。点击按钮时,切换文本的显示高度和‘展开/收起’文字。
摘要由CSDN通过智能技术生成
<template>
  <div class="content">
    <div class="text" :class="[isAll ? props.longClass : '']">
      <label for="exp" class="btn" v-if="showCtro" @click.stop="isAll = !isAll">
        <span class="words">{{ isAll ? '展开' : '收起' }}</span>
      </label>
      <span ref="reportText" v-html="textHtml" />
    </div>
  </div>
</template>

<script setup>
  import { defineComponent, ref, watch, onMounted, nextTick } from 'vue'
  const props = defineProps({
    text: {
      type: String,
      default: ''
    },
    textHtml: {
      type: String,
      default: ''
    },
    longClass: {
      type: String,
      default: 'long'
    }
  })
  const showCtro = ref(false)
  const isAll = ref(false)
  const reportText = ref('')
  const classObj = ref({
    long: 75
  })

  watch(
    () => props.text,
    async () => {
      isAll.value = false
      showCtro.value = false
      await nextTick()
      const key = props.longClass
      if (props.text) {
        showCtro.value = isAll.value = reportText.value?.offsetHeight > classObj.value[key]
      }
    },
    {
      immediate: true
    }
  )
</script>

<style lang="less" scoped>
  .content {
    height: 100%;
    display: flex;
  }

  .text {
    width: 100%;
    color: #333;
    font-size: 14px;
  }

  .long {
    height: 64px;
    display: -webkit-box;
    overflow: hidden;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
  }

  .btn {
    float: right;
    clear: both;
    margin-right: 8px;
    color: #514def;
    cursor: pointer;
  }
  .text::before {
    content: '';
    float: right;
    width: 0;
    height: calc(100% - 20px);
  }
  .exp:checked + .text {
    -webkit-line-clamp: 999; /*设置一个足够大的行数就可以了*/
  }
</style>

实现思路:

        1、 利用css样式让展开收起按钮浮动后,与文本处在同一个空间内

        2、通过动态样式,来切换展开和收起的不同文本样式和高度

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值