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')
          }
        }
      },
相关推荐
计算机魔术师20 分钟前
Suno 发布 v6 音乐模型,推出 v6、v6-wild、v6-mini 三个版本
前端
whyweplay37 分钟前
elpis : DSL动态组件学习
前端
用户921080262861 小时前
前端 Vue 专栏 06:异步更新机制、任务队列与 nextTick
前端
晴天161 小时前
Chrome DevTools 深度调试指南
前端·chrome·chrome devtools
林冠宏_指尖下的幽灵1 小时前
AI发展下的后编程时代思考
前端·人工智能·后端
_山海2 小时前
Bun入门指南
前端·javascript·后端
想睡懒觉2 小时前
我用 CSS 3D 做了个星空隧道 Loading,没有 Three.js
前端
labixiong2 小时前
transition 写在 CSS 变量上为什么不生效?给变量补张「类型身份证」
前端·css·html
YHL2 小时前
🧠 Agent 记忆进阶:总结压缩与向量检索 —— 从截断到 Milvus 长期记忆
前端·人工智能
用户921080262862 小时前
前端 Vue 专栏 05:从 Object.defineProperty 到 Proxy,彻底理解 Vue 响应式原理
前端