`
big_student
  • 浏览: 40294 次
  • 性别: Icon_minigender_1
  • 来自: 宝鸡
社区版块
存档分类
最新评论

jquery实现表格可变列宽插件开发

阅读更多

工作中用到了表格的可变列宽,网上看了下,自己也实现了一个,整理贴记录。

测试环境chromeie8firefox

jquery版本1.8.2

 

原理:监听table第一行的mousemove事件,当鼠标位置在某列的边框附近时,mousedown即可拖动该列,mouseup时结束。其中当拖动时,2种方式:拖动时列宽随时变化,另一种是拖动结束时最后才计算列宽,采用后者相对好点,可以减少对dom的操作,提高性能和友好性。

参考ext grid的实现方式,当拖动时有2条参考线,分别表示列的左边框和右边框,通过拖动右边框来实现大小的改变。

 

表格样例

 

<table id="tbl"border="1" cellspacing="0" cellpadding="0">
		<tr>
			<th style="width:100px">col1</th>
			<th style="width:100px">col2</th>
			<th style="width:200px">col3</th>
			<th style="width:200px">col4</th>
			<th style="width:300px">col5</th>
		</tr>
		<tr>
			<td>1</td><td>1</td><td>1</td><td>1</td><td>1</td>
		</tr>
		<tr>
			<td>2</td><td>2</td><td>2</td><td>2</td><td>2</td>
		</tr>	
		<tr>
			<td>3</td><td>3</td><td>3</td><td>3</td><td>3</td>
		</tr>
		<tr>
			<td>4</td><td>4</td><td>4</td><td>4</td><td>4</td>
		</tr>
</table>
 

代码是经过很多次修改的,应该把一步步测试修改的记录下的,完整功能的代码看起来逻辑没有一步步来清晰了,代码如下

//全局变量
var resizing = false; //是否为拖动状态
var resizable = false; //当时是否可拖动
var minWidth = 20;	//没列的最小宽度
var resizeHeader;	//当前拖动的列
var leftLine;		//左参考线
var rightLine;		//有参考线
$(function(){
	//监听标题行的mouosemove事件
	$("table th").mousemove(function(e){
		var target = $(e.target);
		if(resizing){
			//当已经在拖动变化列宽时
			onDraging(e);
		}else if(fnIsLeftEdge(e)){
			//靠近左边框时,将当前的处理header
                        //设置为左边的一个,这样就相当于是拖动列
			//的右边框,可以只计算该header的右边框参
                        //考线的移动,方便处理
			resizeHeader = target.prev();
			//不响应第一列的左边框拖动事件
			if(resizeHeader.length == 0)
				return;
			//当鼠标停在左边框时,设置当前为可拖动状态
			resizable = true;			
			//设置鼠标样式为拖动时的样式
			target.css("cursor", "col-resize");
		}else if(fnIsRightEdge(e)){
			//当鼠标停留在右边框时
			resizeHeader = target;
			resizable = true;
			target.css("cursor", "col-resize");	
		}else{
			//超出可拖动的区域,设为不可拖动状态
			resizable = false;
			target.css("cursor", "default");
		}
	});
	//当在拖动列上点击鼠标
	$("table th").mousedown(function(e){
		onDragingStart(e);		
	});
	//当在document上移动鼠标,因为拖动可能超出表格的范围
	$(document).mousemove(function(e){
		onDraging(e);
	});
	//当拖动而释放时候未在标题行的释放也需要结束拖动
	$(document).mouseup(function(e){
		onDragingEnd(e);
	});
});
/**
 * 计算当前鼠标位置是不是在可拖动的范围内
 * @param event e目标事件
 * @side boolean true表示在左边边框附近,false表示右边
 * @return boolean true在表格边框附近,false未在
 */
function _fnIsColEdge(e, side){
	var target = $(e.target);
	var x = e.pageX;
	var offset = target.offset();
	var left = offset.left;
	var right = left + target.outerWidth();
	return side ? x<=left+2 : x >=right-2;
}
/**
 * 计算当前鼠标位置是不是在左边框附近
 * @param event e目标事件
 * @return boolean true是, false否
 */
function fnIsLeftEdge(e){
	return _fnIsColEdge(e, true);
}
/**
 * 计算当前鼠标位置是不是在右边框附近
 * @param event e目标事件
 * @return boolean true是, false否
 */
function fnIsRightEdge(e){
	return _fnIsColEdge(e, false);
}
/**
 * 初始化拖动状态
 * @param event e目标事件
 * @return void
 */
function onDragingStart(e){
	//当前是否为拖动状态
	if(resizable){
		var target = $(e.target);
		//设置当前文本不可选中,否则拖动时会选中文本
		if(!$.browser.mozilla){
			$(document).bind("selectstart", function(){	return false; });
		}else{
			$("body").css("-moz-user-select", "none");
		}
		//创建参考线
		if(!leftLine){
			leftLine = $("<div></div>");
			leftLine.addClass("resize_line");
			leftLine.appendTo("body");
			rightLine = leftLine.clone();
			rightLine.appendTo("body");
		}
		//显示参考线
		leftLine.css({"top":resizeHeader.offset().top, "left": resizeHeader.offset().left, "height": $("table").innerHeight()});
		rightLine.css({"top":resizeHeader.offset().top, "left": e.pageX, "css":"col-resize", "height": $("table").innerHeight()});
		leftLine.show();
		rightLine.show();
		//设置为已经在拖动
		resizing = true;
	}
}
/**
 * 列宽拖动中
 * @param event e目标事件
 * @return void
 */
function onDraging(e){
	//如果已经在拖动
	if(resizing){
		//拖动后的列宽不能小于最小列宽
		if(e.pageX - resizeHeader.offset().left > minWidth){
			rightLine.css("left", e.pageX);
		}
	}
}
/**
 * 鼠标释放拖动结束,改变列宽,结束拖动状态
 * @param event e目标事件
 * @return void
 */
function onDragingEnd(e){
	//如果已经在拖动
	if(resizing){
		resizing = false;
		//隐藏参考线
		rightLine.hide();
		leftLine.hide();
		//设置文本可以选中
		if(!$.browser.mozilla){
			$(document).unbind("selectstart");
		}else{
			$("body").css("-moz-user-select", "");
		}
		//计算设置新的列宽
		doResize();
	}
}
/**
 * 设置新的列宽
 * @param event e目标事件
 * @return void
 */
function doResize(){
	//计算列宽的变化值
	var newWidth = parseInt(rightLine.css("left"), 10) - resizeHeader.offset().left - resizeHeader.width();
	//设置新列宽
	resizeHeader.width(resizeHeader.width() + newWidth);
}

参考线的样式

 

.resize_line{
	width:0px;
	border-style: solid;
	border-color: #0066FF;
	border-width: 0 1px 0 1px;
	position:absolute;
}
 

 

整理修改后可作为jquery的插件使用,附件是示例和插件代码。

 

目前对分组的header即使用了rowspan和colspan的没有做处理,有时间再做更新,有兴趣的人也可以扩展和完善。

分享到:
评论
2 楼 djcbpl 2013-11-18  
根本不启用
1 楼 sison 2013-01-06  
hi 把header 分组的更新完啊

相关推荐

    jQuery 表格工具集

    Flexigrid – Web 2.0 Javscript Grid for jQuery – 可变列宽,自动适应表头宽度,可通过 Ajax 连接 XML 数据源,类似 Ext Grid,但基于 jQuery 因此更轻量小巧。 Chromatable JQuery Plugin – 固定表头,可...

    网页模板——jQuery实现表格头和列固定插件RWD Table.zip

    网页模板中的jQuery实现表格头和列固定插件RWD Table是一种高效的方法,用于优化数据密集型网页的用户体验。在处理大量数据时,尤其在响应式设计中,保持表格的可读性和可操作性至关重要。RWD Table插件通过固定表头...

    bootstrap-table拖拽表格改变列宽

    // 使用colResizable插件实现列宽拖动 $('#table').colResizable({ fixed: false, // 是否固定列宽 liveDrag: true, // 是否实时拖动 helper: function (index, th) { // 自定义拖动辅助元素,例如增加边框 $...

    jQuery简单仿Excel表格功能插件.zip

    jQuery,作为一款轻量级的JavaScript库,提供了丰富的API和插件资源,使得这些功能的实现变得相对简单。本篇将介绍一个基于jQuery的仿Excel表格功能插件,它可以帮助开发者快速构建具有Excel特色的交互式表格。 ...

    jQuery拖动表格列宽度resizableColumns 附件包含demo

    在jQuery中实现表格列宽度可拖动调整,通常会依赖于插件。在这个案例中,我们有两个相关的JavaScript文件:`jquery-1.7.2.min.js`是基础的jQuery库,而`jquery.resizableColumns.js`则是实现列宽调整功能的插件。 `...

    jQuery实现鼠标可拖动调整表格列宽度

    为了实现表格列宽度的可拖动调整功能,我们需要引入jQuery核心库文件、store.js文件和一个名为jquery.resizableColumns.js的插件文件。这些文件提供了实现功能所需的基础功能和具体方法。具体代码如下: ```html ...

    jQuery股票数据表格插件mmGrid.js

    **jQuery股票数据表格插件mmGrid.js** 在Web开发中,数据展示是不可或缺的一部分,尤其在金融领域,如股票市场,高效地展示大量实时数据至关重要。`jQuery股票数据表格插件mmGrid.js`应运而生,它为开发者提供了一...

    jqgrid jquery 表格插件

    总的来说,jqGrid是一款功能齐全、高度可定制的jQuery表格插件,对于开发高效的数据管理界面非常有用。无论是新手还是经验丰富的开发者,都能从中受益。通过深入学习和实践,你可以利用jqGrid构建出符合业务需求的...

    Tabulator是一款非常实用的基于jQueryUI的表格插件

    Tabulator是一款功能强大的jQuery UI插件,专门用于创建交互式、可定制的表格。这款工具以其易用性和灵活性而受到开发者们的青睐。在JavaScript开发领域,特别是在处理数据展示时,Tabulator提供了一种高效的方式,...

    Jquery colResizable 插件 可拖动表格的宽度

    colResizable 插件正是基于jQuery构建的,它的主要功能是为表格(`&lt;table&gt;`元素)添加拖动列宽的功能。在网页中,表格是一种常用的数据展示方式,但默认情况下,用户无法直接调整表格列的宽度。colResizable插件解决...

    拖拽表格列移动的插件

    首先,这个插件的核心功能是使表格列变得可拖动。在传统的HTML表格中,列的顺序通常是静态的,而通过这个插件,开发者可以为用户提供一个动态的、直观的方式来重新排列列。用户只需用鼠标拖动列头,就能改变列的位置...

    十五款提高表格操作的jQuery插件

    15. **GridStack**:虽然主要是用于布局,但GridStack也可以用于创建可拖动、可调整大小的表格,适用于需要动态调整列宽的应用。 以上这些jQuery插件都有各自的优点和适用场景,开发者可以根据项目需求选择合适的...

    jQuery响应式表格插件basictable.zip

    jQuery响应式表格插件Basictable是Web开发中一个实用的工具,专为在不同设备上提供优秀的用户体验而设计。这个插件的核心功能是通过调整表格的布局和样式,使其在台式机、平板和手机等不同屏幕尺寸下都能保持良好的...

    jQuery 表格插件整理

    8. DataTables - 是一个非常强大且功能全面的jQuery表格插件,包括可变列宽、分页浏览、现场过滤、多列排序、智能列宽以及从各种数据源获取数据的能力。 9. jqGrid Plugin - 基于Ajax的jQuery表格插件,能够从...

    实现boostrap表格td宽度可自由拖动。

    为了实现"bootstrap表格td宽度可自由拖动"的功能,我们需要借助额外的库或者自定义JavaScript代码来实现。在本场景中,我们关注的关键词是"表格td 自由拉伸",这通常意味着我们需要实现列宽的动态调整。 首先,我们...

    jquery Table响应式表格插件特效代码

    **jQuery Table响应式表格插件** 是一个专为网页设计...总的来说,jQuery Table响应式表格插件通过其强大的功能和易用性,为网页开发带来了极大的便利,使得创建响应式表格变得不再复杂,是现代网页开发者的得力助手。

    Jquery 拖动列插件

    综上所述,jQuery拖动列插件是提高网页表格交互性的重要工具,它通过监听和处理鼠标事件,实现了用户自定义列宽的功能。通过深入理解其工作原理和应用方式,开发者可以更好地利用这一插件,提升网站或应用的用户体验...

    使表格的标题列可左右拉伸jquery插件封装

    用户可以通过左右移动鼠标来改变列宽,从而使表格的列宽度变小或变大,提高显示内容的适应性和用户的交互体验。 3. jQuery插件的实现方式: 在示例代码中,插件名为jquery.tableresize.js。它通过定义一个函数封装...

Global site tag (gtag.js) - Google Analytics