给el-table合并后的分组表格边框添加明显样式

需 求:

一般要求分组都会进行表格合并,为了视觉上更直观。那需求就觉得这样边框线非常浅,数据多了就容易看岔劈,提出提亮合并后每组的边框线,为了能更直观区分组别。

效果图:

 代 码:以下是全代码,复制运行即可出现上图效果

<template>
  <el-table :data="tableData" border style="width: 50%" :span-method="spanMethod" :cell-class-name="cellclass">
    <el-table-column label="序号"  width="60" align="center">
		<template slot-scope="scope">{{scope.row.pageIndex}}</template>
	</el-table-column>
    <el-table-column prop="name" label="姓名" width="180"/>
    <el-table-column prop="date" label="日期" width="180"/>
    <el-table-column prop="address" label="地址"/>
  </el-table>
</template>

<script>
  export default {
    data() {
      return {
        tableData: [{
          gropNo:1,
          date: '2016-05-02',
          name: '王小虎',
          address: '上海市 1518 弄'
        }, {
          gropNo:1,
          date: '2016-05-04',
          name: '王小虎',
          address: '上海市1517 弄'
        }, {
          gropNo:2,
          date: '2016-05-01',
          name: '王小虎1',
          address: '浙江省15 弄'
        }, {
          gropNo:2,
          date: '2016-05-03',
          name: '王小虎1',
          address: '浙江省 1516 弄'
        }, {
          gropNo:2,
          date: '2016-05-08',
          name: '王小虎1',
          address: '浙江省1519 弄'
        }, {
          gropNo:3,
          date: '2016-05-09',
          name: '王小虎2',
          address: '江苏省 1519 弄'
        }],
        spanArr:[]  // 合并行数
      }
    },
    mounted(){
        this.tableDatas()
    },
    methods:{
        // 给符合条件边框提亮
        cellclass(data){
            if(data.row.isTop) return 'topStyle'
        },
        // 合并行和列
        spanMethod({rowIndex,columnIndex}) {
            if (columnIndex === 1 || columnIndex === 0 ) {
                //检查对象名称
                const _row = this.spanArr[rowIndex]
                const _col = _row > 0 ? 1 : 0
                return {
                    rowspan: _row,
                    colspan: _col
                }
            }
        },
        // 表格合并
        tableDatas() {
            let contactDot = 0
            let pageIndex = 1  //序号
            this.spanArr = []
            for (let index = 0; index < this.tableData.length; index++) {
                if (index === 0) {
                    // 这是第一组中第一行上边框样式
                    // this.$set(this.tableData,index,{...this.tableData[index],isTop:1})
                    this.spanArr.push(1)
                    this.tableData[0].pageIndex = pageIndex
                } else {
                    // 判断第二列
                    if (this.tableData[index].gropNo === this.tableData[index - 1].gropNo) {
                            this.spanArr[contactDot] += 1
                            this.spanArr.push(0)
                    } else {
                        // 这是其余组中第一行上边框样式
                        this.$set(this.tableData,index,{...this.tableData[index],isTop:1})
                        this.spanArr.push(1)
                        contactDot = index
                        pageIndex++
                        this.tableData[index].pageIndex = pageIndex
                    }
                }
            }
        },
    }
  }
</script>

<style scoped>
    ::v-deep th.el-table__cell{
        background-color: #66b1ffa6!important;
    }
    ::v-deep th.el-table__cell>.cell{
        color: #464748;
    }
     ::v-deep .topStyle {
        border-top:1px solid blue;
    }
</style>

 下面咱描述下我的思路:

        首先我们根据需求可以判断这个边框肯定是和合并的组有关系,但是审查元素可以看到这个合并的组并不是在一个元素中的,那就排除了给这个合并组添加border。那思路转化一下,我们修改边框颜色都是通过cell,那我们给每组合并数据中第一行添加border-top不就可以实现视觉分割了。

        那想法有了,咱就看下怎么实现,可以优先看下组件提供的原生属性,然后cell-class-name这个可以给单元格设置className的回调函数则可以解决这个问题。我们给合并组里的第一行都添加判断标识。在cell-class-name里判断满足条件的添加border-top样式即可

PS:表格合并有各种不同的方法,我上面的仅仅是其中一种,不同的方法添加标识代码的位置都不同。但是万变不离其宗,我的思路是只要给每个合并组中第一个添加标志那就完成了主要步骤,cell-class-name的判断依旧是相同的。所有代码都是为思路逻辑服务的。

以上,over!欢迎讨论~

在使用 `el-table` 时,若希望设置表格边框并避免边框重叠问题,可以结合 CSS 样式和组件属性进行控制。`el-table` 默认使用 `border-collapse: collapse` 来合并边框,以避免边框重复绘制的问题。但在某些自定义样式场景中,仍可能出现边框重叠或显示异常的情况。 为了更精细地控制边框样式并避免重叠,可以使用如下方法: ### 使用统一的边框颜色和样式 通过设置 `el-table` 的 `border` 属性启用边框,并在 CSS 中统一设置边框颜色和样式,确保所有单元格和行的边框一致,避免因颜色或样式不一致导致的视觉重叠。 ```vue <template> <el-table :data="tableData" border class="custom-table" > <el-table-column prop="name" label="姓名"></el-table-column> </el-table> </template> <style scoped> ::v-deep .custom-table .el-table { border-collapse: collapse; } ::v-deep .custom-table .el-table th, ::v-deep .custom-table .el-table td { border: 1px solid #ebeef5; } </style> ``` 此方法确保表格所有单元格的边框统一,并通过 `border-collapse: collapse` 合并边框,从而避免边框重叠[^1]。 ### 自定义边框样式 如果需要对不同列或行应用不同的边框样式(如虚线、粗细不同等),可以通过 `cell-class-name` 和 `row-style` 配合自定义 CSS 类实现。 ```vue <template> <el-table :data="tableData" border :cell-class-name="getCellClass" class="custom-table" > <el-table-column prop="name" label="姓名"></el-table-column> </el-table> </template> <style scoped> ::v-deep .custom-table .el-table .dashed-border { border: 1px dashed #f00; } </style> <script> export default { methods: { getCellClass({ columnIndex }) { return columnIndex === 0 ? 'dashed-border' : ''; } } } </script> ``` 该方法通过动态添加类名实现不同单元格的边框样式定制,同时保持整体表格边框的结构一致性,避免视觉上的重叠感。 ### 控制边框间距(使用 `border-spacing`) 如果需要使用 `border-collapse: separate` 来控制单元格之间的间距,应同时设置 `border-spacing` 以避免边框重叠。 ```css ::v-deep .custom-table .el-table { border-collapse: separate; border-spacing: 2px; } ``` 该方式适用于需要在单元格之间留白的场景,通过合理设置 `border-spacing` 控制边框之间的间距,防止视觉上的重叠。 --- ###
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值