正文 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