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的初始化与对象构建之浅析
Apr 12 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
May 07 Javascript
JavaScript结合AJAX_stream实现流式显示
Jan 08 Javascript
JavaScript位移运算符(无符号) &gt;&gt;&gt; 三个大于号 的使用方法详解
Mar 31 Javascript
JavaScript禁止复制与粘贴的实现代码
May 16 Javascript
javascript解决小数的加减乘除精度丢失的方案
May 31 Javascript
微信小程序  modal详解及实例代码
Nov 09 Javascript
JSON与XML的区别对比及案例应用
Nov 11 Javascript
基于jQuery实现瀑布流页面
Apr 11 jQuery
Angular2 父子组件通信方式的示例
Jan 29 Javascript
详解JavaScript中的Object.is()与&quot;===&quot;运算符总结
Jun 17 Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
Nov 12 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
其他功能
2006/10/09 PHP
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
简略的前端架构心得&amp;&amp;基于editor为例子的编码小技巧
2010/11/25 Javascript
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
jquery remove方法应用详解
2012/11/22 Javascript
jQuery控制TR显示隐藏的三种常用方法
2014/08/21 Javascript
jQuery级联操作绑定事件实例
2014/09/02 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
jQuery实现页面点击后退弹出提示框的方法
2016/08/24 Javascript
Vue 父子组件、组件间通信
2017/03/08 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
Angular HMR(热模块替换)功能实现方法
2018/04/04 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
有趣的python小程序分享
2017/12/05 Python
使用Python爬取最好大学网大学排名
2018/02/24 Python
python实现自动网页截图并裁剪图片
2018/07/30 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
详解Python中的内建函数,可迭代对象,迭代器
2019/04/29 Python
python实现与redis交互操作详解
2020/04/21 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
中学老师的自我评价
2013/11/07 职场文书
教师自我鉴定
2013/12/13 职场文书
团队精神演讲稿
2013/12/31 职场文书
工商管理专业大学生职业生涯规划范文
2014/03/09 职场文书
六年级学生评语
2014/04/22 职场文书
医院搬迁方案
2014/06/14 职场文书
2014年征兵标语
2014/06/20 职场文书
企业安全生产检查制度
2015/08/06 职场文书
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
2021/06/07 Python
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB