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之Ajax运用 学习运用篇
Sep 26 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
Jun 16 Javascript
jquery实现多行文字图片滚动效果示例代码
Oct 10 Javascript
javascript的push使用指南
Dec 05 Javascript
jQuery 和 CSS 的文本特效插件集锦
Dec 12 Javascript
node.js中的fs.readSync方法使用说明
Dec 17 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
Jan 29 Javascript
jQuery滚动条插件nanoscroller使用指南
Apr 21 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
Jun 23 Javascript
微信小程序 石头剪刀布实例代码
Jan 04 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
Sep 04 Javascript
vue中使用vee-validator完成表单校验方案
Nov 01 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
如何开始收听短波广播
2021/03/01 无线电
广播爱好者需要了解的天线知识
2021/03/01 无线电
PHP使用者状态管理功能的应用
2006/10/09 PHP
PHP利用str_replace防注入的方法
2013/11/10 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
javascript 面向对象编程基础 多态
2009/08/21 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
JavaScript判断变量是否为undefined的两种写法区别
2013/12/04 Javascript
javascript正则表达式使用replace()替换手机号的方法
2015/01/19 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
JavaScript中捕获/阻止捕获、冒泡/阻止冒泡方法
2016/12/07 Javascript
javascript实现简易计算器
2017/02/01 Javascript
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
JS实现简单的点赞与踩功能示例
2018/12/05 Javascript
JavaScript实现随机点名程序
2020/03/25 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
[45:32]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
wxPython事件驱动实例详解
2014/09/28 Python
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
Python常用知识点汇总
2016/05/08 Python
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
Python实现PS滤镜特效之扇形变换效果示例
2018/01/26 Python
python学生管理系统
2019/01/30 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
NYX Professional Makeup官方网站:专业彩妆和美容产品
2019/10/29 全球购物
作风年建设汇报材料
2014/08/14 职场文书
钱学森观后感
2015/06/04 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python