el-table中的某个字段最多显示两行,超出部分显示“...详情”,怎么办

文章目录

背景

需求

比如,有如下一个表格,请你实现它:

要求:

  • 最多显示两行
  • 超出部分显示为:"...详情"
  • 点击详情,展开全部内容

说明:本例以vue2版本为例,其他的同理

需求分析

Element UIel-table组件,给我们提供了一个好用的属性show-overflow-tooltip,即:

  • 最多显示一行
  • 超出显示省略号
  • 鼠标悬停时显示全部内容

效果如下:

但是,我们现在需要显示两行,所以这个属性不符合我们的需求。

解决方案

在线体验

灵感来源

我在其他论坛上看到一篇文章:https://juejin.cn/post/7347221074704777226

他的核心思想是用CSS 滚动驱动动画CSS 样式查询等较新的CSS属性来实现,是比较好的思路,确实也实现了。

但是不适用在el-table中:

  • 新属性不是100%兼容,需要较新的浏览器版本(Chrome 115+);
  • el-table有某些样式影响,所以导致无法实现;

该博主的示例代码如下:

效果如下:

也有一些其他人的实现思路,有异曲同工之妙,此处不一一细说了。

我的实现方案

思路:既然是在el-table中,那就需要自定义写样式,且表格中有循环,基于上述代码受影响而不生效,所以此处只能用js来辅助了,纯靠CSS是行不通的了。

我的示例代码如下:

javascript 复制代码
<template>
   <el-table :data="tableData">
      <el-table-column label="URL地址" prop="url" align="center" />
      <el-table-column label="作废原因" prop="remark" align="center" width="270">
        <template v-slot="scope">
          <div class="remark-cell">
            <div
              :class="['remark-content', { 'expanded': scope.row.isExpanded }]"
              :ref="`remarkRef_${scope.$index}`"
              :data-index="`remarkRef_${scope.$index}`"
            >
              {{ scope.row.remark }}
            </div>
            <span
              v-if="scope.row.needExpand"
              class="expand-btn"
              @click="toggleExpand(scope.row)"
            >{{ scope.row.isExpanded ? '收起' : '详情' }}</span>
          </div>
        </template>
      </el-table-column>
    </el-table>
</template>
<script>
export default {
  data() {
tableData: [
        {
          id: 1,
          isExpanded: false,
          needExpand: false,
          remark: '汉水东流,都洗尽、髭胡膏血。人尽说、君家飞将,旧时英烈。破敌金城雷过耳,谈兵玉帐冰生颊。想王郎、结髮赋从戎,传遗业。腰间剑,聊弹铗。尊中酒,堪为别。况故人新拥,汉坛旌节。马革裹尸当自誓,蛾眉伐性休重说。但从今、记取楚楼风,庾台月。","translate":"汉水滔滔,向东流去;它冲净了那些满脸长着鬍鬚的敌人嘴上沾着人民的膏血。人们都说:当年你家的飞将军,英勇威列地打击敌人。攻破敌人坚固的城池的时候,迅速勇猛,像迅雷过耳那么快;在玉帐里谈论兵法或者是研究战术的时候,态度激昂兴奋,语言慷慨激烈,两颊都结了冰。回想王郎,你才到结发的年令,就从事戎马生活。'
        },
        {
          id: 2,
          isExpanded: false,
          needExpand: false,
          remark: '111',
        },
        {
          id: 3,
          isExpanded: false,
          needExpand: false,
          remark: '大江东去、浪淘尽、髭胡膏血。人尽说、君家飞将,旧时英烈。破敌金城雷过耳,谈兵玉帐冰生颊。想王郎、结髮赋从戎,传遗业。腰间剑,聊弹铗。尊中酒,堪为别。况故人新拥,汉坛旌节。马革裹尸当自誓,蛾眉伐性休重说。但从今、记取楚楼风,庾台月。","translate":"汉水滔滔,向东流去;它冲净了那些满脸长着鬍鬚的敌人嘴上沾着人民的膏血。人们都说:当年你家的飞将军,英勇威列地打击敌人。攻破敌人坚固的城池的时候,迅速勇猛,像迅雷过耳那么快;在玉帐里谈论兵法或者是研究战术的时候,态度激昂兴奋,语言慷慨激烈,两颊都结了冰。回想王郎,你才到结发的年令,就从事戎马生活。'
        },
      ],
  },
  methods: {
 // 切换展开状态
    toggleExpand(row) {
      this.$set(row, 'isExpanded', !row.isExpanded)
    },

    // 检查是否需要展开按钮
    checkNeedExpand() {
      this.$nextTick(() => {
        this.tableData.forEach((row, index) => {
          const refKey = `remarkRef_${index}`
          const el = this.$refs[refKey]

          if (el && el.scrollHeight > el.clientHeight) {
            this.$set(row, 'needExpand', true)
          } else {
            this.$set(row, 'needExpand', false)
          }
        })
      })
    }
  }
}
</script>
<style lang="scss" scoped>
.remark-cell {
  position: relative;
  width: 100%;
  padding-right: 8px;
}

.remark-content {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
  word-break: break-all;
  line-height: 1.5;
}

.remark-content.expanded {
  -webkit-line-clamp: unset;
}

.expand-btn {
  color: #409EFF;
  cursor: pointer;
  margin-left: 4px;
  position: absolute;
  right: -10px;
  bottom: -3px;
}

.expand-btn:hover {
  opacity: 0.8;
}
</style>

我的效果图如下:

总结

实现的不是很完美,但是也达到了它的效果,大家有啥好方法吗,可以评论一下。

相关推荐
前端老石人6 小时前
前端开发中的 URL 完全指南
开发语言·前端·javascript·css·html
CAE虚拟与现实6 小时前
五一假期闲来无事,来个前段、后端的说明吧
前端·后端·vtk·three.js·前后端
Sarvartha6 小时前
三目运算符
linux·服务器·前端
晓晨的博客6 小时前
ROS1录制的bag包转换为ROS2格式
前端·chrome
Wect6 小时前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·typescript
donecoding7 小时前
别再让 pnpm 跟着 nvm 跑了!独立安装终极指南
前端·node.js·前端工程化
GISer_Jing7 小时前
AI全栈转型_TS后端学习路线
前端·人工智能·后端·学习
竹林8187 小时前
被The Graph的GraphQL查询坑了三天,我用一个真实DeFi项目把链上数据索引彻底搞懂了
前端·graphql
漫游的渔夫7 小时前
前端开发者做 Agent:别只会执行,用 4 类失败策略让 AI 知道怎么停
前端·人工智能·typescript
用户059540174467 小时前
把多级缓存一致性验证从手工测试换成 Pytest 参数化,Bug 排查时间缩短 90%
前端·css