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阻止冒泡和HTML默认操作
Nov 17 Javascript
JS 页面计时器示例代码
Oct 28 Javascript
JavaScript将数据转换成整数的方法
Jan 04 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
Jun 05 Javascript
影响jQuery使用的14个方面
Sep 01 Javascript
JavaScript中Function详解
Feb 27 Javascript
js实现Select头像选择实时预览代码
Aug 17 Javascript
jQuery ajax动态生成table功能示例
Jun 14 jQuery
详解JS模块导入导出
Dec 20 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
Dec 25 Javascript
Vue 列表上下过渡效果的实例代码
Jun 25 Javascript
JavaScript中ES6规范中let和const的用法和区别
Aug 06 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实现网站插件机制的方法
2009/11/10 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
Laravel向公共模板赋值方法总结
2019/06/25 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
由document.body和document.documentElement想到的
2009/04/13 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
javascript关于继承解析
2016/05/10 Javascript
canvas绘制七巧板
2017/02/03 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
微信小程序实现左侧滑动导航栏
2020/04/08 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
微信小程序网络请求实现过程解析
2019/11/06 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
解决vue scoped scss 无效的问题
2020/09/04 Javascript
Js跳出两级循环方法代码实例
2020/09/22 Javascript
[00:43]TI7不朽珍藏III——幽鬼不朽展示
2017/07/15 DOTA
Python随机生成手机号、数字的方法详解
2017/07/21 Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
2018/01/15 Python
python基础学习之如何对元组各个元素进行命名详解
2018/07/12 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
python 搭建简单的http server,可直接post文件的实例
2019/01/03 Python
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
英国电子专家:maplin
2019/09/04 全球购物
售后服务经理岗位职责
2014/02/25 职场文书
文案策划求职信
2014/03/18 职场文书
活动总结怎么写啊
2014/05/07 职场文书
对外汉语专业大学生职业生涯规划范文
2014/09/13 职场文书
员工年终自我评价
2014/09/14 职场文书
小学生运动会广播
2015/08/19 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
python爬虫--selenium模块
2021/03/31 Python
go语言基础 seek光标位置os包的使用
2021/05/09 Golang
一篇文章带你搞懂Python类的相关知识
2021/05/20 Python