2015 年 4 月 10 日,星期五

垂直頁面調整

在許多網路應用程式和網頁控制面板中,通常需要讓顯示的佈局和內容自動縮放以適應使用者的瀏覽器,讓您可以呈現統一且流暢的介面。響應式技術在如何處理水平寬度方面已發展成熟,但垂直調整大小帶來了其獨有的挑戰。

在這篇文章中,我將介紹一個新的 DataTables 外掛程式,該外掛程式會自動更改表格的頁面長度,以適應給定的垂直區域。實際的 DataTables 介面非常簡單(僅使用 page.len() 方法和 draw()),但是了解何時更改頁面長度非常有趣,因此我也將討論所使用的技術。

下方顯示了使用該外掛程式的演示。為了本演示的目的,我圍繞表格建立了一個可調整大小的方塊,您可以點擊並拖曳,這將導致表格的頁面長度自動更改以適應方塊

姓名職位辦公室年齡開始日期薪資
Tiger Nixon系統架構師愛丁堡612011-04-25$320,800
Garrett Winters會計師東京632011-07-25$170,750
Ashton Cox初級技術作者舊金山662009-01-12$86,000
Cedric Kelly資深 Javascript 開發人員愛丁堡222012-03-29$433,060
Airi Satou會計師東京332008-11-28$162,700
Brielle Williamson整合專家紐約612012-12-02$372,000
Herrod Chandler銷售助理舊金山592012-08-06$137,500
Rhona Davidson整合專家東京552010-10-14$327,900
Colleen HurstJavascript 開發人員舊金山392009-09-15$205,500
Sonya Frost軟體工程師愛丁堡232008-12-13$103,600
Jena Gaines辦公室經理倫敦302008-12-19$90,560
Quinn Flynn支援主管愛丁堡222013-03-03$342,000
Charde Marshall區域總監舊金山362008-10-16$470,600
Haley Kennedy資深行銷設計師倫敦432012-12-18$313,500
Tatyana Fitzpatrick區域總監倫敦192010-03-17$385,750
Michael Silva行銷設計師倫敦662012-11-27$198,500
Paul Byrd財務長 (CFO)紐約642010-06-09$725,000
Gloria Little系統管理員紐約592009-04-10$237,500
Bradley Greer軟體工程師倫敦412012-10-13$132,000
Dai Rios人事主管愛丁堡352012-09-26$217,500
Jenette Caldwell開發主管紐約302011-09-03$345,000
Yuri Berry行銷長 (CMO)紐約402009-06-25$675,000
Caesar Vance售前支援紐約212011-12-12$106,450
Doris Wilder銷售助理雪梨232010-09-20$85,600
Angelica Ramos執行長 (CEO)倫敦472009-10-09$1,200,000
Gavin Joyce開發人員愛丁堡422010-12-22$92,575
Jennifer Chang區域總監新加坡282010-11-14$357,650
Brenden Wagner軟體工程師舊金山282011-06-07$206,850
Fiona Green營運長 (COO)舊金山482010-03-11$850,000
Shou Itou區域行銷東京202011-08-14$163,000
Michelle House整合專家雪梨372011-06-02$95,400
Suki Burks開發人員倫敦532009-10-22$114,500
Prescott Bartlett技術作者倫敦272011-05-07$145,000
Gavin Cortez團隊領導舊金山222008-10-26$235,500
Martena Mccray售後支援愛丁堡462011-03-09$324,050
Unity Butler行銷設計師舊金山472009-12-09$85,675
Howard Hatfield辦公室經理舊金山512008-12-16$164,500
Hope Fuentes秘書舊金山412010-02-12$109,850
Vivian Harrell財務總監舊金山622009-02-14$452,500
Timothy Mooney辦公室經理倫敦372008-12-11$136,200
Jackson Bradshaw總監紐約652008-09-26$645,750
Olivia Liang支援工程師新加坡642011-02-03$234,500
Bruno Nash軟體工程師倫敦382011-05-03$163,500
Sakura Yamamoto支援工程師東京372009-08-19$139,575
Thor Walton開發人員紐約612013-08-11$98,540
Finn Camacho支援工程師舊金山472009-07-07$87,500
Serge Baldwin資料協調員新加坡642012-04-09$138,575
Zenaida Frank軟體工程師紐約632010-01-04$125,250
Zorita Serrano軟體工程師舊金山562012-06-01$115,000
Jennifer Acosta初級 Javascript 開發人員愛丁堡432013-02-01$75,650
Cara Stevens銷售助理紐約462011-12-06$145,600
Hermione Butler區域總監倫敦472011-03-21$356,250
Lael Greer系統管理員倫敦212009-02-27$103,500
Jonas Alexander開發人員舊金山302010-07-14$86,500
Shad Decker區域總監愛丁堡512008-11-13$183,000
Michael BruceJavascript 開發人員新加坡292011-06-27$183,000
Donna Snider客戶支援紐約272011-01-25$112,000
姓名職位辦公室年齡開始日期薪資
點擊並拖曳我!

使用

使用此外掛程式非常簡單 - 從 DataTables CDN 在您的頁面上包含頁面調整大小外掛程式

JS

然後選擇以下兩個選項之一,為您的表格啟用此功能

選項 1:pageResize 選項新增至您的 DataTables 初始化

$('#example').DataTable( {
    pageResize: true
} );

選項 2:將類別 pageResize 新增至您的 HTML 表格 - 例如

<table id="myTable" class="display pageResize">
    <thead> ... </thead>
    <tbody> ... </tbody>
</table>

CSS

頁面調整大小外掛程式不需要任何特定的 CSS,但您可能希望使用 CSS 來隱藏 DataTables 預設顯示的分頁長度控制項

div.dt-length {
    display: none;
}

隱藏頁面長度控制項的另一個選項是使用 layout 選項。

此外,在 IE 中,您會發現有一個邊框無法使用 CSS 移除。不幸的是,解決此問題的唯一方法是在包裝器元素的背景顏色中使用純色(即定義 DataTables 應佔用高度的元素)

#myContainer {
    background-color: white;
}

需求

  • 必須啟用分頁功能 (paging - 預設在 DataTables 中啟用)
  • 必須啟用頁面長度變更功能 (lengthChange - 同樣預設啟用)
  • 每行的高度必須相等 - 如果您使用 DataTables 預設樣式表,請將類別 nowrap 新增至您的表格。這是為了使調整計算快速且有效率。
  • DataTable 所在的容器元素必須具有定義的高度,表格會填滿該高度(高度可以彈性調整,例如 vh CSS 單位)。

運作方式

此外掛程式的程式碼非常小 - 未壓縮時只有 4K,因此您可以快速瀏覽程式碼並了解其運作方式。快速說明:它會計算容器中可用的高度,移除表格控制項、標頭和頁尾的高度,然後根據列高計算剩餘空間中可以顯示多少列。最後,使用 page.len() 設定表格長度,並使用 draw() 繪製表格。

有趣的部分在於我們考慮程式碼如何知道何時調整大小。您會在上面的演示中注意到,不需要調整視窗大小即可重新繪製表格,也不需要任何 API 呼叫來告知元件其大小已調整。

由於只有視窗物件具有調整大小事件,我們不能只監聽容器元素上的事件,但我們可以做的是使用 object 標籤建立新的 HTML 文件,將其插入容器元素,然後監聽其調整大小事件!object 設定為適應容器,因此它觸發的任何調整大小事件都是主機節點大小變更的結果。

此程式碼也非常簡單

var obj = $('<object/>')
    .css( {
        position: 'absolute',
        top: 0,
        left: 0,
        height: '100%',
        width: '100%',
        zIndex: -1
    } )
    .attr( 'type', 'text/html' )
    .attr( 'data', 'about:blank' );

obj[0].onload = function () {
    var body = this.contentDocument.body;
    var height = body.offsetHeight;

    this.contentDocument.defaultView.onresize = function () {
        var newHeight = body.offsetHeight;

        if ( newHeight !== height ) {
            height = newHeight;

            // Resize has occurred - do something!
        }
    }
};

obj.appendTo( host );

這個想法非常有用,如果證明在此外掛程式中成功,我將考慮將其包含在 DataTables 核心中,因為它可以解決諸如在隱藏的捲動表格可見時需要呼叫 columns.adjust()、在調整大小時手動更新 FixedColumns 以及其他常見問題。

歡迎回饋

一如既往,非常歡迎改進和建議!此外掛程式的程式碼託管在 GitHub 上。如果您對改進有任何想法,請發送提取請求,或在論壇中開啟新的討論。

我特別希望解決的一個缺點是與 Responsive 的完全整合。雖然 Responsive 在大多數情況下可以在啟用此外掛程式的情況下正確運作,但顯示的子列將不會納入列數計算中,從而導致垂直對齊問題。這可能會透過在 Responsive 中引入新選項來解決,該選項會在快顯面板中顯示隱藏資訊,而不是在子列中顯示。