Vue实现文本溢出展开收起详情功能

2022-07-22 0 1,059

这类功能很常见,其实之前也写过,今天特意整理出来分享给大家,我这里分装成一个组件,大家有需要的可以复制即用。

<template>
  <div class="text-expand" ref="textExpand">
    <div v-if="!(showPopover && showPopoverJudge)">
      <span class="text-expand-content" :style="expandStyle">
        {{ text === null || text === undefined || text === '' ? '--' : text }}
      </span>
      <div class="expander">
        <span v-if="showBtn && showBtnJudge">
          <span v-if="!showFull" class="action action-expand" @click.stop="showFullFn(true)">
            展开
            <i v-if="showBtnIcon" class="el-icon-caret-bottom" />
          </span>
          <span v-else class="action action-pack" @click.stop="showFullFn(false)">
            收起
            <i v-if="showBtnIcon" class="el-icon-caret-top" />
          </span>
        </span>
      </div>
    </div>
    <el-popover v-else :placement="popoverPlace" trigger="hover">
      <div class="popover-content">
        {{ text }}
      </div>
      <span class="text-expand-content" :style="expandStyle" slot="reference">{{ text }}</span>
    </el-popover>
  </div>
</template>
<script>
export default {
  props: {
    text: {
      // 文本内容
      type: String,
      default: () => '',
    },
    expand: {
      // 折叠显示行数
      type: Number,
      default: () => 3,
    },
    showBtn: {
      // 展开、折叠按钮
      type: Boolean,
      default: true,
    },
    showBtnIcon: {
      // 展开、折叠icon
      type: Boolean,
      default: true,
    },
    showPopover: {
      // popover显示全文本
      type: Boolean,
      default: false,
    },
    popoverPlace: {
      // popover位置
      type: String,
      default: 'bottom',
    },
  },
  data() {
    return {
      showFull: false, // 是否展示全文本
      expandStyle: '',
      showBtnJudge: false, // 判断是否需要折叠展示按钮
      showPopoverJudge: false, // 判断是否需要折叠展示popover
    };
  },
  watch: {
    text: function () {
      this.textExpand();
    },
  },
  mounted() {
    this.textExpand();
  },
  methods: {
    showFullFn(value) {
      this.expandStyle = value
        ? ''
        : `display: -webkit-box;word-break: break-all;-webkit-line-clamp: ${this.expand};-webkit-box-orient: vertical;text-overflow: ellipsis;overflow: hidden;`;
      this.showFull = value;
    },
    textExpand() {
      // 判断是否需要折叠
      this.$nextTick(() => {
        const { expand } = this;
        const textExpandStyle = window.getComputedStyle(this.$refs.textExpand);
        const textExpandHeight = parseFloat(textExpandStyle.height); //获取总高度
        const textExpandLineHeight = parseFloat(textExpandStyle.lineHeight); //获取行高
        // 计算行高
        const rects = Math.ceil(textExpandHeight / textExpandLineHeight);
        if (rects <= expand) {
          // 不需要折叠展示
          this.showBtnJudge = false;
          this.showPopoverJudge = false;
        } else {
          this.showBtnJudge = true;
          this.showPopoverJudge = true;
          this.expandStyle = `display: -webkit-box;word-break: break-all;-webkit-line-clamp: ${this.expand};-webkit-box-orient: vertical;text-overflow: ellipsis;overflow: hidden;`;
        }
      });
    },
  },
};
</script>
<style lang="less" scoped>
.text-expand {
  &-content {
    word-break: break-all;
    white-space: pre-wrap;
  }
  .expander {
    text-align: right;
    .action {
      display: inline-block;
      font-size: 14px;
      color: #0281f0;
      cursor: pointer;
      i {
        display: inline;
        font-size: 12px;
      }
    }
    .action.action-pack {
      margin-left: 0;
    }
  }
}
.popover-content {
  max-width: 40vw;
  max-height: 30vh;
  overflow: hidden;
  overflow-y: auto;
  word-break: break-all;
}
</style>

本文仅仅简单介绍了平常工作中常见的需求,同一种需求不同状态下写,代码也会不一样,写文章也是为了更好的总结,从中慢慢积累经验。

收藏 (0) 打赏

感谢您的支持,我们会继续努力的!

打开支付宝/微信/QQ扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1. 本站所有教学内容和资源均来源于本站原创和网络收集以及用户自主上传,如有侵权请带证联系本站客服进行处理!邮箱:team@lcwl.fun
2. 对于非本站原创的资源不保证所提供下载资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系本站客服处理,有奖励!
3. 除本站原创教学或资源外其余资源您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 本站原创资源如需商用还请申请商业授权,否则本站有权追究其法律责任!
5. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有学币奖励额外收入!

凌晨资源网 前端开发 Vue实现文本溢出展开收起详情功能 https://www.lingchenw.cn/jishu/3207.html

常见问题
  • 本站所有付费教程均可单独付费或者开会员学习,自己购买或者开了会员就可以学习,来凌晨学院报名学习送会员,并且有讲师一对一辅导培训教学,师生互动化,定期布置作业等
查看详情
  • 本站所有资源版权均属于原作者所有,资源中标注可商用的可以商用的代表是本团队自主研发公布可商用的产品,未标注可商用所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务

学习手机编程软件开发
手机编程软件开发

你知道吗?用手机也能开发制作软件,满足自己的编程心,做属于自己的软件

报名学习
自媒体短视频
副业做自媒体短视频

想做自媒体短视频剪辑给自己多一份副业,只需一部手机你也可以

报名学习
搭建网站必备云互联主机
链未云互联

搭建网站,后台云服务等必备云服务器互联主机,IDC云主机

现在使用
Fa快捷助手
用手点一点就能开发做软件

不用记编程语法,不用一行一行手敲代码,用手点一点就能开发制作软件

点击下载