element-ui表格嵌套表格,鼠标移入时样式错乱-问题调研及处理办法

一、问题场景

当外层表格使用了fixed="right"属性后,鼠标移入时,高亮的样式发生错乱

js 复制代码
  <el-table :data="tableData">
    <el-table-column type="expand">
      <template slot-scope="props">
        <el-table :data="tableDataInner">
          <el-table-column prop="date" label="日期" width="180"> </el-table-column>
          <el-table-column prop="name" label="姓名" width="180"> </el-table-column>
          <el-table-column prop="address" label="地址"> </el-table-column>
        </el-table>
      </template>
    </el-table-column>
    <el-table-column label="商品 ID" prop="id" min-width="200"> </el-table-column>
    <el-table-column label="商品名称" prop="name" min-width="200"> </el-table-column>
    <el-table-column label="描述" prop="desc" min-width="200"> </el-table-column>
    <el-table-column label="描述" prop="desc" min-width="200"> </el-table-column>
    <el-table-column label="描述" prop="desc" min-width="200"> </el-table-column>
    <el-table-column label="描述" prop="desc" min-width="200" fixed="right">
    </el-table-column>
  </el-table>

鼠标移入到红色框时,红色框没有高亮,绿色框高亮了。原因是element-ui在计算的时候发生错误,hover-row类名错误地添加到绿色框元素上了。(github.com/ElemeFE/ele...

二、处理思路

  1. 先禁掉hover-row类的高亮效果

  2. 通过js的鼠标移入移出事件,给当前行添加或删除active类名,实现高亮效果

三、关键代码

给设置浮动列的表格添加一个类名(orderTable)

js 复制代码
<style lang="scss" scoped>
  .orderTable {
    // hover-row类渲染错误,去掉该样式效果
    ::v-deep .hover-row > td.el-table__cell {
      background-color: transparent;
    }
    // 设置active类名,通过js鼠标移入移出事件,动态添加或删除active类实现高亮效果
    ::v-deep tr.active td.el-table__cell {
      background-color: #f5f7fa !important;
    }
  }
</style>

再添加2个事件

js 复制代码
        @cell-mouse-enter="handleCellMouseEnter"
        @cell-mouse-leave="handleCellMouseLeave"


      // 鼠标移入触发
      handleCellMouseEnter(row, column, cell, event) {
        const parentDom = event.target.parentElement
        parentDom.classList.add('active')
        const trList = parentDom.parentElement.querySelectorAll('tr')
        const index = [...trList].findIndex(tr => [...tr.classList].includes('active'))
        const className =
          column.align === 'is-left'
            ? '.orderTable tbody'
            : '.orderTable .el-table__fixed-body-wrapper tbody'
        const targetTr = document.querySelector(className).querySelectorAll('tr')[index]
        targetTr.classList.add('active')
      },
      // 鼠标移出触发
      handleCellMouseLeave(row, column, cell, event) {
        const classList = ['.orderTable tbody', '.orderTable .el-table__fixed-body-wrapper tbody']
        for (const className of classList) {
          const trList = document.querySelector(className).querySelectorAll('tr')
          for (const tr of trList) {
            tr.classList.remove('active')
          }
        }
      },
相关推荐
万少10 小时前
HarmonyOS 开发必会 5 种 Builder 详解
前端·harmonyos
橙序员小站12 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
炫饭第一名15 小时前
速通Canvas指北🦮——基础入门篇
前端·javascript·程序员
王晓枫15 小时前
flutter接入三方库运行报错:Error running pod install
前端·flutter
符方昊15 小时前
React 19 对比 React 16 新特性解析
前端·react.js
ssshooter15 小时前
又被 Safari 差异坑了:textContent 拿到的值居然没换行?
前端
曲折15 小时前
Cesium-气象要素PNG色斑图叠加
前端·cesium
Forever7_15 小时前
Electron 淘汰!新的桌面端框架 更强大、更轻量化
前端·vue.js
Angelial16 小时前
Vue3 嵌套路由 KeepAlive:动态缓存与反向配置方案
前端·vue.js
jiayu16 小时前
Angular学习笔记24:Angular 响应式表单 FormArray 与 FormGroup 相互嵌套
前端