垂直滚动贴合
早在 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 |
使用方法
使用 ScrollResize 插件适用于 DataTables 非常简单 - 在您的页面中包含该插件的 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 上。如果你对改进有任何想法,请发送拉取请求,或在 论坛 中展开新讨论。
新年快乐!