-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtableFreeze.js
73 lines (62 loc) · 2.39 KB
/
tableFreeze.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
"use strict";
function TableFreezeOptions() {
this.marginTop = 50;
this.marginLeft = 0;
this.fixedLines = 1;
this.fixedColumns = 0;
}
function tableFreeze(table, opts) {
var defaultOpts = new TableFreezeOptions;
var marginTop = (opts && opts.marginTop >= 0) ? opts.marginTop : defaultOpts.marginTop;
var marginLeft = (opts && opts.marginLeft >= 0) ? opts.marginLeft : defaultOpts.marginLeft;
var fixedLines = (opts && opts.fixedLines >= 0) ? opts.fixedLines : defaultOpts.fixedLines;
var fixedColumns = (opts && opts.fixedColumns >= 0) ? opts.fixedColumns : defaultOpts.fixedColumns;
function getTotalOffsetTop(ele) {
if (!ele) { return 0; }
return ele.offsetTop + getTotalOffsetTop(ele.offsetParent);
}
function getTotalOffsetLeft(ele) {
if (!ele) { return 0; }
return ele.offsetLeft + getTotalOffsetLeft(ele.offsetParent);
}
function refresh() {
var $trs = $(table).find('tr');
var $hdr = $trs.slice(0, 0 + fixedLines);
var scrollTop = $(window).scrollTop();
var scrollLeft = $(window).scrollLeft();
var offsetTop = getTotalOffsetTop(table) - marginTop - scrollTop;
var offsetLeft = getTotalOffsetLeft(table) - marginLeft - scrollLeft;
if (offsetTop < 0) {
var top = - offsetTop;
$hdr.css('position', 'relative')
.css('top', top + "px")
.css('z-index', 1);
} else {
$hdr.css('top', 0);
}
if (offsetLeft < 0) {
var left = - offsetLeft;
$trs.each(function () {
$(this).find('td,th').slice(0, fixedColumns)
.css('position', 'relative')
.css('left', left + "px");
});
} else {
$trs.each(function () {
$(this).find('td,th').slice(0, fixedColumns).css('left', 0);
});
}
}
$(window).on('scroll', refresh);
$(window).on('resize', refresh);
$(table).on('table-rendered', refresh);
}
$(function () {
$('.table-freeze').each(function () {
var $tb = $(this);
var opts = new TableFreezeOptions();
opts.fixedLines = + $tb.data('freeze-lines');
opts.fixedColumns = + $tb.data('freeze-columns');
tableFreeze(this, opts);
});
});