Redbattle
踩坑
环境
项目
配置
知识点
踩坑
环境
项目
配置
知识点
  • 视频方案
  • DNS
  • 主题切换
  • 图片性能优化
  • 富文本预览
  • 区域滚动方法
  • 底部固定区域
  • CSS实现背景透明文字不透明
  • 文字展开收起
  • 二次开发
  • scheme
2024-10-17

文字展开收起

<template>
  <div class="rb-collapse" :style="boxStyle">
    <div class="rb-collapse-content" :class="{ 'rb-collapse-content-active': isActive }" ref="rb_content">
      <div
        v-if="isMoreLine"
        class="rb-collapse-more"
        :class="{ 'rb-collapse-more-active': isActive }"
        @click="handleMore"
      ></div>
      <div class="rb-collapse-text" v-html="contentText"></div>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'RBCollapse',
    props: {
      contentText: {
        type: String,
        default: ''
      },
      contentColor: {
        type: String,
        default: ''
      },
      moreColor: {
        type: String,
        default: ''
      },
      fontSize: {
        type: String,
        default: ''
      },
      line: {
        type: Number,
        default: 2
      }
    },
    data() {
      return {
        isMoreLine: false,
        isActive: false,
        boxStyle: {}
      }
    },
    mounted() {
      const height = this.$refs['rb_content'].scrollHeight || 0
      const lineHeight = Math.round(parseFloat(window.getComputedStyle(this.$refs['rb_content']).lineHeight))
      this.isMoreLine = height / lineHeight > this.line

      if (this.contentColor) {
        this.boxStyle['--contentColor'] = this.contentColor
      }
      if (this.moreColor) {
        this.boxStyle['--contentColor'] = this.moreColor
      }
      if (this.fontSize) {
        this.boxStyle['--fontSize'] = this.fontSize
      }
      if (this.line) {
        this.boxStyle['--line'] = this.line
      }
    },
    methods: {
      handleMore() {
        this.isActive = !this.isActive
        this.$emit('more', this.isActive)
      }
    }
  }
</script>

<style lang="less" scoped>
  .rb-collapse {
    --contentColor: #333;
    --moreColor: #409eff;
    --fontSize: 14px;
    --line: 2;
    display: flex;
    &-content {
      position: relative;
      font-size: var(--fontSize);
      color: var(--contentColor);
      overflow: hidden;
      text-overflow: ellipsis;
      line-height: 1.5;
      max-height: calc(1.5em * var(--line));
      transition: 0.3s max-height;
      &::before {
        content: '';
        height: 100%;
        margin-bottom: -0.5em;
        float: right;
      }
    }
    &-more {
      position: relative;
      float: right;
      line-height: 1.5;
      clear: both;
      font-size: var(--fontSize);
      margin-left: 1em;
      color: var(--moreColor);
      cursor: pointer;
      perspective: 1000;
      transform: translateY(-1em);
      &::after {
        content: '展开';
        display: block;
      }
    }
    &-content-active {
      max-height: none;
      &::after {
        visibility: hidden;
      }
    }
    &-more-active {
      &::before {
        visibility: hidden;
      }
      &::after {
        content: '收起';
      }
    }
    &-text {
      font-size: var(--fontSize);
      color: var(--contentColor);
    }
  }
</style>
最近更新
01
烧虾球
05-13
02
二次开发
12-20
03
CSS实现背景透明文字不透明
07-20
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式