垂直捲軸調整
早在 2015 年,我為 DataTables 介紹了一個外掛程式,該程式能夠動態更改表格的頁面長度,使其適合容器內。當啟用分頁且停用捲軸時,這項功能運作良好,但 DataTable 的垂直調整也自然適用於捲軸。
在這篇文章中,我將介紹一個在啟用捲軸時適用於 DataTables 的等效外掛程式 - 最終結果如下所示
姓名 | 職位 | 辦公室 | 薪資 |
---|---|---|---|
Tiger Nixon | 系統架構師 | 愛丁堡 | $320,800 |
Garrett Winters | 會計 | 東京 | $170,750 |
Ashton Cox | 初級技術作家 | 舊金山 | $86,000 |
Cedric Kelly | 資深 Javascript 開發人員 | 愛丁堡 | $433,060 |
Airi Satou | 會計 | 東京 | $162,700 |
Brielle Williamson | 整合專家 | 紐約 | $372,000 |
Herrod Chandler | 銷售助理 | 舊金山 | $137,500 |
Rhona Davidson | 整合專家 | 東京 | $327,900 |
Colleen Hurst | Javascript 開發人員 | 舊金山 | $205,500 |
Sonya Frost | 軟體工程師 | 愛丁堡 | $103,600 |
Jena Gaines | 辦公室經理 | 倫敦 | $90,560 |
Quinn Flynn | 支援主管 | 愛丁堡 | $342,000 |
Charde Marshall | 區域總監 | 舊金山 | $470,600 |
Haley Kennedy | 資深行銷設計師 | 倫敦 | $313,500 |
Tatyana Fitzpatrick | 區域總監 | 倫敦 | $385,750 |
Michael Silva | 行銷設計師 | 倫敦 | $198,500 |
Paul Byrd | 財務長 (CFO) | 紐約 | $725,000 |
Gloria Little | 系統管理員 | 紐約 | $237,500 |
Bradley Greer | 軟體工程師 | 倫敦 | $132,000 |
Dai Rios | 人事主管 | 愛丁堡 | $217,500 |
Jenette Caldwell | 開發主管 | 紐約 | $345,000 |
Yuri Berry | 行銷長 (CMO) | 紐約 | $675,000 |
Caesar Vance | 售前支援 | 紐約 | $106,450 |
Doris Wilder | 銷售助理 | 雪梨 | $85,600 |
Angelica Ramos | 執行長 (CEO) | 倫敦 | $1,200,000 |
Gavin Joyce | 開發人員 | 愛丁堡 | $92,575 |
Jennifer Chang | 區域總監 | 新加坡 | $357,650 |
Brenden Wagner | 軟體工程師 | 舊金山 | $206,850 |
Fiona Green | 營運長 (COO) | 舊金山 | $850,000 |
Shou Itou | 區域行銷 | 東京 | $163,000 |
Michelle House | 整合專家 | 雪梨 | $95,400 |
Suki Burks | 開發人員 | 倫敦 | $114,500 |
Prescott Bartlett | 技術作家 | 倫敦 | $145,000 |
Gavin Cortez | 團隊領導 | 舊金山 | $235,500 |
Martena Mccray | 售後支援 | 愛丁堡 | $324,050 |
Unity Butler | 行銷設計師 | 舊金山 | $85,675 |
Howard Hatfield | 辦公室經理 | 舊金山 | $164,500 |
Hope Fuentes | 秘書 | 舊金山 | $109,850 |
Vivian Harrell | 財務總監 | 舊金山 | $452,500 |
Timothy Mooney | 辦公室經理 | 倫敦 | $136,200 |
Jackson Bradshaw | 總監 | 紐約 | $645,750 |
Olivia Liang | 支援工程師 | 新加坡 | $234,500 |
Bruno Nash | 軟體工程師 | 倫敦 | $163,500 |
Sakura Yamamoto | 支援工程師 | 東京 | $139,575 |
Thor Walton | 開發人員 | 紐約 | $98,540 |
Finn Camacho | 支援工程師 | 舊金山 | $87,500 |
Serge Baldwin | 資料協調員 | 新加坡 | $138,575 |
Zenaida Frank | 軟體工程師 | 紐約 | $125,250 |
Zorita Serrano | 軟體工程師 | 舊金山 | $115,000 |
Jennifer Acosta | 初級 Javascript 開發人員 | 愛丁堡 | $75,650 |
Cara Stevens | 銷售助理 | 紐約 | $145,600 |
Hermione Butler | 區域總監 | 倫敦 | $356,250 |
Lael Greer | 系統管理員 | 倫敦 | $103,500 |
Jonas Alexander | 開發人員 | 舊金山 | $86,500 |
Shad Decker | 區域總監 | 愛丁堡 | $183,000 |
Michael Bruce | Javascript 開發人員 | 新加坡 | $183,000 |
Donna Snider | 客戶支援 | 紐約 | $112,000 |
使用方式
使用 DataTables 的 ScrollResize 外掛程式非常簡單 - 在您的頁面上包含外掛程式的 Javascript
然後在您的 DataTable 初始化中指定 scrollResize
選項來啟用該功能,同時使用 scrollY
來啟用捲軸
$('#myTable').DataTable( {
scrollResize: true,
scrollY: 100,
scrollCollapse: true,
paging: false
} );
請注意,您通常在使用 ScrollResize 時也會停用分頁,如此處所做,但這不是強制性的(分頁對於改善較大資料集的效能很有用)。
版面配置
在 DataTable 初始化時,給予 scrollY
的值(在上面的範例中為 100px)實際上並不重要,因為表格的捲軸容器會自動調整大小以符合表格放置的容器。這是一個重點,因為定義表格高度的不是 DataTable 本身,而是放置它的 DOM 容器元素。
在上面的範例中,使用 div
元素作為表格的包裝,並使用 Javascript 來調整容器大小。沒有額外的 Javascript 告訴 DataTables 它需要調整大小 - 這是由 ScrollResize 外掛程式自動決定的,保持初始化簡單且腳本效能良好(請參閱下面的實作部分了解如何做到這一點)。
雖然您可能希望為您的最終用戶提供調整表格容器大小的能力,但這種方法的真正好處可以透過 DataTables 自動調整自身以適應您定義的版面配置來看出
實作
與原始的分頁調整大小外掛程式一樣,為了讓 ScrollResize 自動調整表格大小,它需要知道何時發生調整大小。我們可以在 DataTables API 中提供和觸發 Javascript 方法,但這對開發人員不友善,因為頁面上的每次更新或重繪都需要呼叫該方法。能夠自動確定何時需要發生這種情況會更好。
問題在於,瀏覽器只有在視窗大小變更時才會觸發調整大小事件 - 而不是在 DOM 元素移動時觸發(因為這樣做效率會非常低)。分頁調整大小外掛程式使用 object
來知道容器何時已調整大小,但這在 IE 中導致了樣式問題。ScrollResize 使用基本相同的概念,但使用 iframe
,它沒有任何此類樣式問題
var that = this;
var obj = $('<iframe/>')
.css( {
position: 'absolute',
top: 0,
left: 0,
height: '100%',
width: '100%',
zIndex: -1,
border: 0
} )
.attr( 'frameBorder', '0' )
.attr( 'src', 'about:blank' );
obj[0].onload = function () {
var body = this.contentDocument.body;
var height = body.offsetHeight;
var contentDoc = this.contentDocument;
var defaultView = contentDoc.defaultView || contentDoc.parentWindow;
defaultView.onresize = function () {
// Three methods to get the iframe height, to keep all browsers happy
var newHeight = body.clientHeight || body.offsetHeight;
var docClientHeight = contentDoc.documentElement.clientHeight;
if ( ! newHeight && docClientHeight ) {
newHeight = docClientHeight;
}
if ( newHeight !== height ) {
height = newHeight;
// Resize has happened - trigger callback
}
};
};
obj
.appendTo( host )
.attr( 'data', 'about:blank' );
有了知道何時發生調整大小的程式碼,我們需要做的就是更新 DataTables 的捲軸容器(減去標頭和頁腳的高度),使其完美地適合容器。
這種自動知道容器元素何時已調整大小的基本實作幾乎肯定會進入 DataTables 2.0(更多關於 2018 年的消息),因為它抽象化了許多問題,例如需要呼叫 columns.adjust()
當隱藏的表格變成可見時。
歡迎回饋
一如既往,非常歡迎改進和建議!此外掛程式的程式碼託管在 GitHub 上。如果您有任何改進的想法,請發送提取請求,或在論壇中開啟新的討論。
新年快樂!