jQuery表格可拖动调整列宽度大小
发布时间:2015-12-15, 15:15:58 分类:HTML | 编辑 off 网址 | 辅助
正文 7553字数 117,674阅读
html<style type="text/css">
*{margin:0;padding:0;list-style-type:none;}
a,img{border:0;}
table{empty-cells:show;border-collapse:collapse;border-spacing:0;}
body{font:12px/180% Arial, Helvetica, sans-serif, "新宋体";}
.demo{width:760px;margin:40px auto;}
.demo h2{font-size:18px;height:52px;color:#3366cc;text-align:center;}
.listext th{background:#eee;color:#3366cc;}
.listext th,.listext td{border:solid 1px #ddd;text-align:left;padding:10px;font-size:14px;}
.rc-handle-container{position:relative;}
.rc-handle{position:absolute;width:7px;cursor:ew-resize;*cursor:pointer;margin-left:-3px;}
</style>
<div class="demo">
<h2>jQuery拖动调整表格列宽度</h2>
<table width="100%" class="table listext" data-resizable-columns-id="demo-table">
<thead>
<tr>
<th data-resizable-column-id="#">#</th>
<th data-resizable-column-id="first_name">First Name</th>
<th data-resizable-column-id="last_name">Last Name</th>
<th data-resizable-column-id="username" id="username-column" data-noresize>Username</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Mark</td>
<td>Otto</td>
<td>@mdo</td>
</tr>
<tr>
<td>2</td>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<td>3</td>
<td colspan="2">Larry the Bird</td>
<td>@twitter</td>
</tr>
</tbody>
</table>
</div>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.js"></script>
<script type="text/javascript" src="js/jquery.resizableColumns.js"></script>
<script type="text/javascript">
$(function(){
$("table").resizableColumns({});
});
</script>
Run code
Cut to clipboard
jquery.resizableColumns.js
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
__slice = [].slice;
(function($, window) {
var ResizableColumns;
ResizableColumns = (function() {
ResizableColumns.prototype.defaults = {
store: window.store,
rigidSizing: false
};
function ResizableColumns($table, options) {
this.mousedown = __bind(this.mousedown, this);
var _this = this;
this.options = $.extend({}, this.defaults, options);
this.$table = $table;
this.tableId = this.$table.data('resizable-columns-id');
this.createHandles();
this.restoreColumnWidths();
this.syncHandleWidths();
$(window).on('resize.rc', (function() {
return _this.syncHandleWidths();
}));
}
ResizableColumns.prototype.destroy = function() {
this.$handleContainer.remove();
this.$table.removeData('resizableColumns');
return $(window).off('.rc');
};
ResizableColumns.prototype.createHandles = function() {
var _this = this;
this.$table.before((this.$handleContainer = $("<div class='rc-handle-container' />")));
this.$table.find('tr th').each(function(i, el) {
var $handle;
if (_this.$table.find('tr th').eq(i + 1).length === 0 || (_this.$table.find('tr th').eq(i).attr('data-noresize') != null) || (_this.$table.find('tr th').eq(i + 1).attr('data-noresize') != null)) {
return;
}
$handle = $("<div class='rc-handle' />");
$handle.data('th', $(el));
return $handle.appendTo(_this.$handleContainer);
});
return this.$handleContainer.on('mousedown', '.rc-handle', this.mousedown);
};
ResizableColumns.prototype.syncHandleWidths = function() {
var _this = this;
this.$handleContainer.width(this.$table.width());
return this.$handleContainer.find('.rc-handle').each(function(_, el) {
return $(el).css({
left: $(el).data('th').outerWidth() + ($(el).data('th').offset().left - _this.$handleContainer.offset().left),
height: _this.$table.height()
});
});
};
ResizableColumns.prototype.saveColumnWidths = function() {
var _this = this;
return this.$table.find('tr th').each(function(_, el) {
var id;
if ($(el).attr('data-noresize') == null) {
id = _this.tableId + '-' + $(el).data('resizable-column-id');
if (_this.options.store != null) {
return store.set(id, $(el).width());
}
}
});
};
ResizableColumns.prototype.restoreColumnWidths = function() {
var _this = this;
return this.$table.find('tr th').each(function(_, el) {
var id, width;
id = _this.tableId + '-' + $(el).data('resizable-column-id');
if ((_this.options.store != null) && (width = store.get(id))) {
return $(el).width(width);
}
});
};
ResizableColumns.prototype.mousedown = function(e) {
var $currentGrip, $leftColumn, $rightColumn, idx, leftColumnStartWidth, rightColumnStartWidth,
_this = this;
e.preventDefault();
this.startPosition = e.pageX;
$currentGrip = $(e.currentTarget);
$leftColumn = $currentGrip.data('th');
leftColumnStartWidth = $leftColumn.width();
idx = this.$table.find('tr th').index($currentGrip.data('th'));
$rightColumn = this.$table.find('tr th').eq(idx + 1);
rightColumnStartWidth = $rightColumn.width();
$(document).on('mousemove.rc', function(e) {
var difference, newLeftColumnWidth, newRightColumnWidth;
difference = e.pageX - _this.startPosition;
newRightColumnWidth = rightColumnStartWidth - difference;
newLeftColumnWidth = leftColumnStartWidth + difference;
if (_this.options.rigidSizing && ((parseInt($rightColumn[0].style.width) < $rightColumn.width()) && (newRightColumnWidth < $rightColumn.width())) || ((parseInt($leftColumn[0].style.width) < $leftColumn.width()) && (newLeftColumnWidth < $leftColumn.width()))) {
return;
}
$leftColumn.width(newLeftColumnWidth);
$rightColumn.width(newRightColumnWidth);
return _this.syncHandleWidths();
});
return $(document).one('mouseup', function() {
$(document).off('mousemove.rc');
return _this.saveColumnWidths();
});
};
return ResizableColumns;
})();
return $.fn.extend({
resizableColumns: function() {
var args, option;
option = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
return this.each(function() {
var $table, data;
$table = $(this);
data = $table.data('resizableColumns');
if (!data) {
$table.data('resizableColumns', (data = new ResizableColumns($table, option)));
}
if (typeof option === 'string') {
return data[option].apply(data, args);
}
});
}
});
})(window.jQuery, window);
Run code
Cut to clipboard
演示
http://demo.zhaotexiao.com/jquery/201405/270/index.html
Run code
Cut to clipboard
(支付宝)给作者钱财以资鼓励 (微信)→
暂无评论 »