el-table 选择列合计,fixed固定某列,合计行放在表格上方,设计合计行样式

本文介绍了如何在Vue.js的el-table组件中实现表格的合计行显示在上方,并自定义合计行样式的详细步骤。通过设置`show-summary`和`:summary-method`属性,配合`getSummaries`方法计算指定列的总计。同时,使用CSS对合计行进行样式调整,包括背景色、字体加粗和对齐方式等,实现了美观的表格合计行效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

        选择特定的几列进行合计,并将el-table的合计行放在表格上方,并修改合计行样式。

 最终展示为:


解决方案:

关键代码:

show-summary

:summary-method="getSummaries"

不写summary-method方法,默认计算所有数字列

      <el-row>
        <el-col :span="12">
          <el-row class="selectTableBox">
            <el-table
              ref="tableBox"
              v-loading="loading"
              class="tableBox"
              max-height="38vh"
              :data="tableList"
              show-summary
              :summary-method="getSummaries"
              style="width: 100%"
              :cell-style="{'text-align': 'center'}"
              :header-cell-style="{'text-align': 'center'}"
            >
            <!-- 固定序号列 -->
              <el-table-column label="序号" fixed type="index" width="80" align="center" />
              <el-table-column label="编号" prop="revenueShareNo" min-width="80" show-overflow-tooltip />
              <el-table-column label="名称" prop="productName" min-width="100" show-overflow-tooltip />
              <el-table-column label="金额" prop="amount" min-width="100" show-overflow-tooltip />
              <el-table-column label="特价" prop="bargainPrice" min-width="100" show-overflow-tooltip />
              <el-table-column label="涨幅" prop="increase" min-width="100" show-overflow-tooltip />
              <el-table-column label="月份" prop="businessMonth" min-width="100" show-overflow-tooltip />
              <el-table-column label="备注" prop="remark" min-width="100" show-overflow-tooltip />
              <el-table-column label="更新人" prop="updatedBy" min-width="200" show-overflow-tooltip />
            </el-table>
          </el-row>
        </el-col>
      </el-row>

 

// 合计行 方法
      getSummaries(param) {
        const { columns, data } = param
        const sums = []
        columns.forEach((column, index) => {
          if (index === 0) {
            sums[index] = '合计'
            return
          }
          // 这里添加需要进行合计的列的名称
          const sumColArr = ['金额', '特价']
          if (sumColArr.includes(column.label)) {
            const values = data.map((item) => Number(item[column.property]))
            if (!values.every((value) => isNaN(value))) {
              sums[index] = values.reduce((prev, curr) => {
                const value = Number(curr)
                if (!isNaN(value)) {
                  return prev + curr
                } else {
                  return prev
                }
              }, 0)
                .toFixed(2) // 固定两位小数
              sums[index] += '' // 这里可以添加单位 如: sums[index] += '元'
            } else {
              sums[index] = ' '
            }
          }
        })
        return sums
      },

 写完合计行的方法,此时表格样式为:

 接下来对表格样式进行修改:

  .selectTableBox{
    margin: 20px;
    // 合计行样式
    /deep/ .has-gutter tr td .cell:empty::before{
      content:'';
    }
    /deep/ .el-table__footer-wrapper tbody td,
    .el-table__header-wrapper tbody td {
      background-color: #e3f3ff !important;
    }
    /deep/ .el-table__footer-wrapper .is-leaf {
      background-color: #e3f3ff !important;
    }
    /deep/ .el-table__fixed-footer-wrapper tbody td {
      border-top: 1px solid #ebeef5;
      background-color: #e3f3ff;
      font-weight: bold;
      color: #f50b0b;
      text-align: center !important;
    }
    /deep/ .has-gutter tr td .cell {
      text-align: center;
      font-weight: bold;
      color: #f50b0b;
    }

    /deep/ .el-table {
      display: flex;
      flex-direction: column;
    }

    /* order默认值为0,只需将表体order置为1即可移到最后,这样合计行就上移到表体上方 */
    /deep/ .el-table__body-wrapper {
      order: 1;
    }

    // 若没有固定列,以下代码可以不写
    // 将固定列放在首行
    /deep/ .el-table__fixed-body-wrapper {
      top: 96px !important; // 根据自己的项目进行微调
    }

    /deep/ .el-table__fixed-footer-wrapper {
      z-index: 0;
      top: 48px; // 根据自己的项目进行微调
    }

  }

最终效果为:

 

<think>根据用户需求,用户希望在表格整体设置背景色的情况下,实现固定背景不透明。即表格整体有背景色(可能带有透明度),但固定(如固定左侧或右侧的)需要保持不透明。 分析: 1. 表格整体设置背景色:通常可以通过设置表格的CSS背景属性来实现,可能使用rgba来设置带透明度的背景。 2. 固定:在Element UI中,固定是通过额外的div和绝对定位来实现的,因此固定实际上是独立于表格主体的。 3. 问题:如果给整个表格设置了透明背景,那么固定也会继承这个透明背景,因为固定表格的一部分。但是用户希望固定不透明。 解决方案: 我们可以通过分别设置表格主体和固定样式来实现: - 表格主体(非固定部分)设置透明背景。 - 固定部分设置不透明背景。 但是,由于Element UI的固定是通过额外的div渲染,并且有特定的类名,我们可以通过CSS选择器分别设置。 具体步骤: 1. 给整个表格设置一个背景色(可能是带透明度的rgba),这样表格主体和固定都会应用这个颜色。 2. 然后,我们通过CSS覆盖固定样式,将其背景色设置为不透明的颜色(通常是和整体背景色相同但不透明的颜色,或者用户指定的颜色)。 注意:固定Element UI中有特定的类名,比如: - 固定表格的左侧:`.el-table__fixed`(左侧固定),`.el-table__fixed-right`(右侧固定- 固定的表头:`.el-table__fixed-header-wrapper` - 固定的主体:`.el-table__fixed-body-wrapper` 因此,我们可以这样设置: 假设我们给整个表格设置的背景色是带透明度的:`rgba(245, 247, 250, 0.5)` 那么固定我们希望是不透明的,可以取同样的颜色但不透明:`rgb(245, 247, 250)` 但是注意,固定本身是一个独立的层,它覆盖在表格主体上。所以我们需要分别设置固定的表头、主体和底部(如果有合计)的背景色。 参考引用[3]中使用了样式穿透(::v-deep),这是因为在Vue中,如果样式加了scoped,就需要穿透才能作用到子组件的样式。 因此,我们可以这样写CSS(使用SCSS语法,假设在Vue单文件组件的style中,并且使用了scoped): ```css <style scoped> /* 设置整个表格的透明背景 */ /deep/ .el-table, /deep/ .el-table__expanded-cell { background-color: rgba(245, 247, 250, 0.5) !important; } /* 设置表格内背景颜色(包括表头、、单元格) */ /deep/ .el-table th, /deep/ .el-table tr, /deep/ .el-table td { background-color: transparent !important; /* 注意:这里设置为透明,让表格主体的背景透出 */ } /* 设置固定的背景为不透明 */ /deep/ .el-table__fixed, /deep/ .el-table__fixed-right { background-color: rgb(245, 247, 250) !important; /* 使用不透明的背景色 */ } /* 固定的表头 */ /deep/ .el-table__fixed-header-wrapper { background-color: rgb(245, 247, 250) !important; } /* 固定的主体 */ /deep/ .el-table__fixed-body-wrapper { background-color: rgb(245, 247, 250) !important; } /* 固定的底部(合计) */ /deep/ .el-table__fixed-footer-wrapper { background-color: rgb(245, 247, 250) !important; } </style> ``` 注意:这里我们将表格主体(非固定)的单元格背景也设置为透明,这样整个表格的背景色(rgba半透明)就会显示出来。而固定则使用不透明的背景色覆盖。 但是,这样设置后,固定的颜色可能和表格主体的颜色在视觉上不一致(因为主体是半透明,可能会透出下面的内容,而固定不透明)。如果用户希望固定的颜色和表格主体的颜色看起来一致,那么固定的背景色应该和表格主体背景色去掉透明度后的颜色一致,并且固定下面的内容不会透出。 另外,如果用户设置了背景色,那么可能还需要单独处理固定背景色,使其与表格主体的背景色保持一致(但不透明)。这里我们假设用户没有设置背景色,或者背景色也是透明的。 如果用户设置了斑马纹(stripe)或者hover效果,那么固定也需要做相应的处理,这里不再展开。 总结:通过覆盖固定样式,将其背景色设置为不透明,同时保证表格主体是透明背景,即可实现需求。 相关问题: 1. 如何设置Element UI表格的斑马纹样式,同时固定不透明? 2. 在Vue中,如何避免样式穿透(/deep/)被废弃的问题? 3. 如何动态改变表格的背景色,并同时保持固定不透明?</think>### 解决方案:实现固定背景不透明 在表格整体设置背景色的情况下,要使固定保持不透明,关键是通过 CSS 分层控制背景色。以下是具体实现方法: ```css /* 整体表格容器设置透明背景 */ .el-table { background-color: rgba(245, 247, 250, 0.5) !important; /* 半透明背景 */ } /* 固定单独设置不透明背景 */ .el-table__fixed, .el-table__fixed-right { background-color: rgb(245, 247, 250) !important; /* 不透明背景 */ z-index: 2; /* 确保固定在上层 */ } /* 固定单元格样式 */ .el-table__fixed th.el-table__cell, .el-table__fixed td.el-table__cell, .el-table__fixed-right th.el-table__cell, .el-table__fixed-right td.el-table__cell { background-color: inherit !important; /* 继承固定背景 */ } ``` #### 实现原理: 1. **分层控制** - 表格主体使用 `rgba()` 设置半透明背景 - 固定使用 `rgb()` 设置相同颜色值的不透明背景 - 通过 `z-index` 确保固定覆盖在主体上方[^1] 2. **样式穿透** 使用 `/deep/` 或 `::v-deep` 穿透组件作用域样式(Vue环境)[^3] 3. **继承机制** 固定单元格使用 `background-color: inherit` 继承父容器的不透明背景[^4] #### 注意事项: 1. 固定颜色值需与表格背景色**相同**的 RGB 值(去掉透明度) 2. 如果使用斑马纹(`stripe`),需单独设置固定的斑马纹样式 3. 在 Vue 中推荐使用 `::v-deep` 替代 `/deep/`(语法更新) > 示例效果:表格主体呈半透明状态,固定保持不透明,且文字内容不受透明度影响[^2][^4] --- ### 相关问题 1. 如何实现 Element UI 表格斑马纹效果下的固定不透明? 2. Vue 3 中如何使用 `::v-deep` 正确穿透组件样式? 3. 表格固定出现渲染错位时如何调试? 4. 如何动态切换表格背景色同时保持固定不透明? 5. 在 Ant Design Vue 中如何实现相同的固定效果?[^4] [^1]: 通过分层控制背景色实现固定不透明 [^2]: RGBA 与 RGB 颜色模式的区别应用 [^3]: Vue 样式穿透的实现方式 [^4]: 不同 UI 框架的固定实现对比
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值