自定义表格(包含表头固定,冻结列,行数据合并)

今天分享一个自定义的表格,最近使用bootstrap-table的表格,发现很多问题,在网上找也找不到最好的解决办法,偏偏测试提的很多BUG都和bootstrap-table的展示有关,我真的会谢,谁懂看bootstrap-table源码的痛苦啊...

分享之前先帮孩子解决解决问题吧:

(都是bootstrap-table的,知道的可以提供下解决办法或者思路)

1.使用固定表头,拖动表格会出现错乱对不齐的问题(偶尔会出现滚动条出现在表格内部)

2.表格有二级表头时,打开列拖动功能,拖动列之后整个表格就乱了,以至于现在都不能把这两个功能一起用

3.刷新表格的时候表格td每次的长短都不一样(相同数据情况下,多次点击查询,宽度一直变一直变...)

4.带子表的表格,当点击子表+号打开子表的时候,父表内容和表头对不齐(最后解决办法我是直接给重刷拉长)

行内编辑 x-edit和tooltip都被测试各种吐槽,这些功能的兼容性感觉真的不行...但是单独使用都还可以,都怀疑自己是不是少引入了啥关键的js,有知道的大佬知会我一声。

拜谢

拜谢

好了吐槽完进入正文,虽然感觉bootstrap-table有很多小毛病,但是用起来也确实很方便,具体大家可以去bootstrap官网上去看哈,这里就不赘述了,但是它提供的很多方法都很实用,功能还是很完善的。

终于在一个外包项目中,要自己开发一个表格,这个表格也就应运而生啦(思路提供给大家,考虑到td里面有些操作和展示定制化比较多,我在代码里就删除了,大家可以自己添加和再封装)

思路:获取表格数据->根据列和配置判断是否合并活冻结->渲染生成->设置css固定表头或冻结列

项目是一个学校课程表格

先上图

 

创建表头:(这里进行了表头的合并)

var thead = $('<thead></thead>')
                var headTR = $('<tr class="schoolClassInfo_table_head"/>');
                var headDateTD = $('<td class="topDiv" colspan="2" style="min-width: 150px;width:150px;">日期</td>');
                headTR.append(headDateTD);
//请求后插入表头列及数据

数据插入和渲染就不写了,应该都OK,主要就是一个冻结列和固定表头

固定表头及冻结列:(表格结构暂时就清空啦)

<div class="schoolClassInfo_tablePanl">
     <table class="schoolClassInfo_table" border="0" cellpadding="0" cellspacing="0">
        <thead>
            <tr class="schoolClassInfo_table_head">
                <td class="topDiv"></td><td></td><td></td><td></td><td></td>
            </tr>
        </thead>
        <tr>
            <td class="noonClass"></td><td></td><td></td><td></td>
        </tr>
      </table>
 </div>

//固定工表头
.schoolClassInfo_table thead {
        border-left: 1px solid #DFE2EB;
        border-top: 1px solid #DFE2EB;
        position: sticky;
        top: 0;
        left: 0;
        right: 0;
        display: table;
        table-layout: fixed;
        z-index: 19;
    }

//冻结列
 .noonClass{
        position: sticky; /* 首列使用粘性属性,固定到原位置 */
        position: -webkit-sticky;
        left: -1px; /* 使用sticky时需要配置定位标识 */
        background-color: #fea26a;
        color: #fff;
        z-index: 10; /* 在滑动时,后面的内容会覆盖掉前首列单元,需要设置z级别 */
    }
//处理冻结列和表头固定导致第一个表头td滑动问题
.topDiv{
        position: sticky; /* 首列使用粘性属性,固定到原位置 */
        position: -webkit-sticky;
        left: -1px; /* 使用sticky时需要配置定位标识 */
        top: 0px;
        background-color: #fea26a;
        color: #fff;
        border: 1px solid;
        z-index: 19; /* 在滑动时,后面的内容会覆盖掉前首列单元,需要设置z级别 */
    }

代码大致如上,数据清了自己拉出来的,没跑过,见谅。

附带一句:冻结列固定表头同时使用时,给冻结列设置一下颜色(不然全文字滑动时会堆叠)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,为您介绍如何使用Vue编写一个满足要求的动态表格。 首先,在Vue中可以使用element-ui组件库中的el-table和el-table-column来实现表格的渲染和展示。在el-table中,我们可以设置固定表头(即标题冻结窗口)的属性为:fixed="true",这样就可以实现固定表头的效果。 其次,我们可以使用自定义指令来实现自动分配单元格宽的功能。在指令中,我们可以获取表格容器的宽度和表格数,然后根据这些信息计算每个单元格的高和宽。这样,就可以自动适应不同的表格大小。 最后,关于合并单元格的功能,可以使用element-ui中的el-table-column的属性:span-method来实现。在这个函数中可以判断当前单元格的数据是否与其相邻单元格的数据相同,如果相同则返回一个对象,包含合并数和数。 完整的代码如下: ``` <template> <div ref="tableContainer"> <el-table :data="tableData" style="width: 100%" :row-style="rowStyle" :cell-style="cellStyle" :span-method="spanMethod"> <el-table-column v-for="(item, index) in tableHeader" :key="index" :label="item.label" :prop="item.prop" :width="item.width"></el-table-column> </el-table> </div> </template> <script> export default { data() { return { tableHeader: [ { label: '1', prop: 'col1', width: '' }, { label: '2', prop: 'col2', width: '' }, { label: '3', prop: 'col3', width: '' }, // 更多 ], tableData: [ { col1: '数据1', col2: '数据2', col3: '数据3' }, { col1: '数据1', col2: '数据2', col3: '数据3' }, { col1: '数据4', col2: '数据5', col3: '数据6' }, // 更多 ] } }, mounted() { this.setCellSize() window.addEventListener('resize', this.setCellSize) }, methods: { // 设置单元格高和宽 setCellSize() { const tableContainer = this.$refs.tableContainer const tableWidth = tableContainer.clientWidth const tableHeader = this.tableHeader const tableColumns = tableHeader.length const cellWidth = Math.floor(tableWidth / tableColumns) tableHeader.forEach(item => { item.width = cellWidth + 'px' }) }, // 判断单元格是否需要合并 spanMethod({ row, column, rowIndex, columnIndex }) { if (rowIndex === 0) { // 第一不需要合并 return { rowspan: 1, colspan: 1 } } const prevRowData = this.tableData[rowIndex - 1] const currentRowData = this.tableData[rowIndex] if (prevRowData[column.property] === currentRowData[column.property]) { // 与上一数据相同,需要合并 return { rowspan: 0, colspan: 0 } } else { // 数据不同,不需要合并 return { rowspan: 1, colspan: 1 } } }, // 设置样式 rowStyle() { return { height: '40px' } }, // 设置单元格样式 cellStyle() { return { padding: '5px' } } }, beforeDestroy() { window.removeEventListener('resize', this.setCellSize) } } </script> ``` 在这个例子中,我们使用了mounted钩子函数来在组件挂载后设置单元格的高和宽,并且添加了一个resize事件监听器来在窗口大小改变时重新计算单元格大小。 同时,我们使用了rowStyle和cellStyle函数来设置和单元格的样式,可以根据需要自修改。 希望这个例子能够帮助您实现满足要求的动态表格
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

格乌恩

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值