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')
          }
        }
      },
相关推荐
yingyima5 小时前
VS Code 正则替换技巧:从凌晨3点的服务器报警开始
前端
默_笙5 小时前
🛬 我让 AI 帮我写了一个打飞机游戏,结果 Canvas 把我整不会了
前端·javascript
梯度不陡5 小时前
AI 到底能不能从零写软件?ProgramBench 和 RepoZero 给出了两种答案
前端·javascript·面试
冬奇Lab6 小时前
每日一个开源项目(第137篇):Penpot - 真正开源的设计协作工具,SVG 原生格式消灭设计-开发鸿沟
前端·开源·设计
nuIl6 小时前
实现一个 Coding Agent(7):Skills
前端·agent·cursor
nuIl6 小时前
实现一个 Coding Agent(8):会话持久化与多会话
前端·agent·cursor
jt君424267 小时前
React Native JSI 深入剖析 — 第 5 部分中文技术整理:用 HostObject 把 C++ 类暴露给 JavaScript
前端·react native
胡萝卜术7 小时前
滑动窗口最大值:从暴力到单调队列,层层优化全解析
前端·javascript·面试
fluffyox7 小时前
Notion 的公式栏里,藏着一台虚拟机——逆向 + 用 600 行 JS 复刻它的编译器与栈式 VM
前端
kyriewen8 小时前
2026 年了,这 6 个 npm 包可以卸载了——浏览器原生 API 已经能替代
前端·javascript·npm