JQuery拖动表头边框线调整表格列宽效果代码


Posted in Javascript onSeptember 10, 2014

类似于桌面程序中的表格拖动表头的效果,当鼠标停留在表头边框线上时,鼠标会变成表示左右拖动的形状,接着拖动鼠标,会在表格中出现一条随鼠标移动的竖线,最后放开鼠标,表格列宽会被调整。最近比较空闲,便自己动手尝试实现,在此分享下小小的成果。

首先需要如图所示的鼠标图标文件,在自己的硬盘中搜索*.cur,肯定能找到。

为了能在所有需要该效果的页面使用,并且不需要更改页面任何HTML,我把所有的代码整合在 $(document).ready(function() {}); 中,并写入一个独立的JS文件。

用一个1像素宽的DIV来模拟一条竖线,在页面载入后添加到body元素中

$(document).ready(function() {
$("body").append("<div id=\"line\" style=\"width:1px;height:200px;border-left:1px solid #00000000; position:absolute;display:none\" ></div> ");
});

接下来是鼠标移动到表格纵向边框上鼠标变型的问题,起初我考虑在表头中添加一个很小的块级元素触发mousemove 和mouseout事件,但为了简单起见,我还是选择为整个表头添加该事件。

在TH的mousemove事件中处理鼠标变型:

$("th").bind("mousemove", function(event) {
var th = $(this);
//不给第一列和最后一列添加效果
if (th.prevAll().length <= 1 || th.nextAll().length < 1) {
return;
}
var left = th.offset().left;
//距离表头边框线左右4像素才触发效果
if (event.clientX - left < 4 || (th.width() - (event.clientX - left)) < 4) {
th.css({ 'cursor': '/web/Page/frameset/images/splith.cur' });
//修改为你的鼠标图标路径
}
else {
th.css({ 'cursor': 'default' });
}
});

当鼠标按下时,显示竖线,并设置它的高度,位置CSS属性,同时记录当前要改变列宽的TH对象,因为一条边框线由两个TH共享,这里总是取前一个TH对象。

$("th").bind("mousedown", function(event) {
var th = $(this);
//与mousemove函数中同样的判断
if (th.prevAll().length < 1 | th.nextAll().length < 1) {
return;
}
var pos = th.offset();
if (event.clientX - pos.left < 4 || (th.width() - (event.clientX - pos.left)) < 4) {
var height = th.parent().parent().height();
var top = pos.top;
$("#line").css({ "height": height, "top": top,"left":event .clientX,"display":"" });
//全局变量,代表当前是否处于调整列宽状态
lineMove = true;
//总是取前一个TH对象
if (event.clientX - pos.left < th.width() / 2) {
currTh = th.prev();
}
else {
currTh = th;
}
}
});

接下来是鼠标移动时,竖线随之移动的效果,因为需要当鼠标离开TH元素也要能有该效果,该效果写在BODY元素的mousemove函数中

$("body").bind("mousemove", function(event) {
if (lineMove == true) {
$("#line").css({ "left": event.clientX }).show();
}
});

最后是鼠标弹起时,最后的调整列宽效果。这里我给BODY 和TH两个元素添加了同样的mouseup代码。我原先以为我只需要给BODY添加mouseup函数,但不明白为什么鼠标在TH中时,事件没有触发,我只好给TH元素也添加了代码。水平有限,下面完全重复的代码不知道怎么抽出来。

$("body").bind("mouseup", function(event) {
if (lineMove == true) {
$("#line").hide();
lineMove = false;
var pos = currTh.offset();
var index = currTh.prevAll().length;
currTh.width(event.clientX - pos.left);
currTh.parent().parent().find("tr").each(function() {
$(this).children().eq(index).width(event.clientX - pos.left);
});
}
});
$("th").bind("mouseup", function(event) {
if (lineMove == true) {
$("#line").hide();
lineMove = false;
var pos = currTh.offset();
var index = currTh.prevAll().length;
currTh.width(event.clientX - pos.left);
currTh.parent().parent().find("tr").each(function() {
$(this).children().eq(index).width(event.clientX - pos.left);
});
}
});

好了,只要在需要这个效果的页面中引入包含以上代码的JS文件,就可以为页面中表格添加该效果。

另外以上代码在火狐中自定义鼠标图标的代码没出效果,所用的jquery为1.2.6

————————————————————————更新——————————————

关于拖动时会选中内容的BUG,将以下一行代码添加到$(document).ready函数里就行了

$("body").bind("selectstart", function() { return !lineMove; });
Javascript 相关文章推荐
jquery获取下拉列表的值为null的解决方法
Mar 18 Javascript
jquery获取div距离窗口和父级dv的距离示例
Oct 10 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
Apr 04 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
May 06 Javascript
jquery.validate 自定义验证方法及validate相关参数
Jan 18 Javascript
jQuery实现TAB选项卡切换特效简单演示
Mar 04 Javascript
探讨AngularJs中ui.route的简单应用
Nov 16 Javascript
基于jQuery Easyui实现登陆框界面
Jul 10 jQuery
利用vue组件自定义v-model实现一个Tab组件方法示例
Dec 06 Javascript
微信头像地址失效踩坑记附带解决方案
Sep 23 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
Apr 01 jQuery
ReactRouter的实现方法
Jan 25 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
Sep 10 #Javascript
javascipt:filter过滤介绍及使用
Sep 10 #Javascript
用javascript将数据导入Excel示例代码
Sep 10 #Javascript
js使用for循环及if语句判断多个一样的name
Sep 09 #Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
Sep 09 #Javascript
鼠标悬浮停留三秒后自动显示大图js代码
Sep 09 #Javascript
使用typeof方法判断undefined类型
Sep 09 #Javascript
You might like
PHP 多维数组排序(usort,uasort)
2010/06/30 PHP
PHP设计模式之装饰者模式
2012/02/29 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
jQuery页面滚动浮动层智能定位实例代码
2011/08/23 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
2013/09/23 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
利用javascript实现web页面中指定区域打印
2013/10/30 Javascript
Jquery操作radio的简单实例
2014/01/06 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
基于ajax和jsonp的原生封装(实例)
2017/10/16 Javascript
Vuejs监听vuex中值的变化的方法示例
2018/12/02 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
2019/09/11 Javascript
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python配置mysql的教程(推荐)
2017/10/13 Python
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
Python3.5内置模块之time与datetime模块用法实例分析
2019/04/27 Python
python实现微信自动回复及批量添加好友功能
2019/07/03 Python
python的slice notation的特殊用法详解
2019/12/27 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
九年级体育教学反思
2014/01/23 职场文书
关于护士节的演讲稿
2014/05/26 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
2014年城管个人工作总结
2014/12/08 职场文书
党员自我评价2015
2015/03/03 职场文书
2015最新婚礼司仪主持词
2015/06/30 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书
六年级作文之预言作文
2019/10/25 职场文书
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android