
view.js.tablescroll.min.js Maven / Gradle / Ivy
/*
tablescroll.js 1.0.0 2017-06-09
Copyright(C) 2017 [email protected]
License at http://www.apache.org/licenses/LICENSE-2.0
required jQuery 1.8 over
*/
(function($) {
$.extend({
scrollbarWidth: function() {
var width;
if(width == undefined) {
var outer = $('').appendTo('body');
var inner = $('').appendTo(outer);
width = inner.innerWidth() - inner.height(60).innerWidth();
outer.remove();
}
return width;
}
});
$.fn.extend({
widths: function(widths) {
var i = 0;
return this.each(function() {
var w = $(this).innerWidth() - Math.floor($(this).width());
var width = -w;
for(var j = 0, j2 = $(this).attr('colspan') || 1; j < j2; j++) {
width += widths.get(i) + w;
i++;
}
$(this).width(width);
});
},
sum: function() {
var n = 0;
this.each(function() {
n += Number(this);
});
return n;
},
tableScroll: function(height, space) {
space = Number(space) || 0;
return this.each(function() {
var $this = $(this);
var heads = $this.find('thead tr:first th,thead tr:first td');
var bodys = $this.find('tbody tr:first th,tbody tr:first td');
var foots = $this.find('tfoot tr:first th,tfoot tr:first td');
var caption = $this.find('caption');
if($this.parent().attr('data-id') == 'inner') {
$this.unwrap();
var outer = $this.parent();
$this.css({'margin-top': outer.css('margin-top'), 'margin-right': outer.css('margin-right'), 'margin-bottom': outer.css('margin-bottom'), 'margin-left': outer.css('margin-left')});
$this.unwrap();
heads.width('');
bodys.width('');
foots.width('');
$this.find('thead').css({position: '', top: '', display: '', 'overflow-y': ''});
$this.find('tbody').css({display: ''});
$this.find('tfoot').css({position: '', bottom: '', display: ''});
caption.css({bottom: '', width: '', position: ''});
}
if(height === false) {
return;
}
var margin = 'margin-top:' + $this.css('margin-top') + ';margin-right:' + $this.css('margin-right') + ';margin-bottom:' + $this.css('margin-bottom') + ';margin-left:' + $this.css('margin-left');
$this.css({'margin-top': 0, 'margin-right': 0, 'margin-bottom': 0, 'margin-left': 0});
var captionHeight = caption.outerHeight();
var fixedHeight = $this.outerHeight() - $this.find('tbody').outerHeight();
var headHeight = fixedHeight - $this.find('tfoot').outerHeight() - captionHeight;
var footHeight = fixedHeight - $this.find('thead').outerHeight() - captionHeight;
var top = 0;
var bottom = 0;
if(caption.length > 0) {
if(caption.css('caption-side') == 'bottom') {
bottom = captionHeight + 'px';
caption.css('bottom', 0);
footHeight += captionHeight;
} else {
top = captionHeight + 'px';
caption.css('top', 0);
headHeight += captionHeight;
}
caption.css({width: '100%', position: 'absolute'});
}
$this.wrap('')
.wrap('');
var widths = bodys.map(function() {
return $(this).outerWidth() + space;
});
var width = $this.outerWidth();
var over = widths.sum() - width;
if(over > 0) {
var minus = Math.floor(over / widths.length);
var rest = over % widths.length;
widths = widths.map(function() {
var n = minus;
if(rest > 0) {
n++;
rest--;
}
return this - n;
});
}
$this.find('thead').css({position: 'absolute', top: top, display: 'block', 'overflow-y': 'scroll'});
$this.find('tbody').css({display: 'block'});
$this.find('tfoot').css({position: 'absolute', bottom: bottom, display: 'block'});
heads.widths(widths, space);
$this.find('tbody tr').each(function() {
$(this).find('td,th').widths(widths, space);
});
foots.widths(widths, space);
$this.parent().parent().width($this.find('thead').outerWidth() + $.scrollbarWidth());
});
}
});
var resize = function() {
$('table[data-scroll]').tableScroll();
};
var timer;
$(window).on('resize', function() {
if (timer != null) {
clearTimeout(timer);
}
timer = setTimeout(resize, 100);
}).on('load', function() {
resize();
});
})(jQuery);
© 2015 - 2025 Weber Informatics LLC | Privacy Policy