iT邦幫忙

1

[實戰之Datatable] 表頭跨欄及表身多列(搭配jQuery)

最近看到一個有趣的需求(需支援ie11)
希望能在datatable套件下,可以做到表頭(thead)跨欄
以及表身(tbody)可以有多列一行的展示(如下圖)
https://ithelp.ithome.com.tw/upload/images/20200818/20129441sLwyStjfrn.png

那先來看表頭的部份,基本上這邊不難
只要把thead做好後,在columnDefs對好欄位的數量即可
但注意要加好寬度(個人非常建議)
這樣datatable套件就會自動幫你排好好的
但如果開了scrollX, autoWith之後,又是另一個故事了

拉回來,表頭解決完之後
雖然datatable套件有提供多列或欄位折疊的機制
但對於user操作來說較不直觀所以希望比照傳統方式做跨列(rowspan)
所以思路是這樣:先用ul&li做出列的資料,調整css樣式,然後再來同步每個ul下的高度(如上圖的第二項)

首先,用ul&li做出列的資料
這邊就直接在datatable的render做字串組合就不多述
但記得給後面會用到的className: colMultiLine

再來,調整css樣式部份,其中為了ie,把first-child獨立出來處理

    .colMultiLine {
        padding: 10px 0px 0px 0px !important;
        vertical-align: top !important;
    }
    .colMultiLine ul {
        margin: 0px;
        padding: 0px;
    }
    .colMultiLine ul li{
        border-bottom: 1px solid #e5e5ca;
        min-height: 25px;
        line-height: 20px;
    }
    .colMultiLine ul li:first-child {
        border-top: 0px !important;
    }

到這邊,多列的基礎已經達成,剩下li的高度不一的問題

所以jQuery這時就上場,下例選的是用datatable的initComplete事件綁定
但還是要依個自需求決定用那個事件

    initComplete: function () {
        $('.datatable tbody tr').each(function () {
            var cnt = $(this).find('td ul:eq(0) li').length;
            if (cnt > 0) {
                for (var i = 1; i <= cnt; i++) {
                    var maxHeight = Math.max.apply(null, $(this).find('td ul li:nth-child(' + i + ')').map(function () {
                        return $(this).height();
                    }).get());
                    $(this).find('td ul li:nth-child(' + i + ')').height(maxHeight);
                }
            }
        });
    }

最後到這,大致的需求已經成形
剩下一些細節優化的環節
比如 li裡有padding或margin的話,計算時要列入考慮
比如 資料列數過多(通常是未分頁狀況下)時,會有效能上的考量
比如 瀏覽器resize時的相對處理做法

以上做個筆記


尚未有邦友留言

立即登入留言