JQuery表格拖动调整列宽效果(自己动手写的)


Posted in Javascript onSeptember 01, 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

Javascript 相关文章推荐
brook javascript框架介绍
Oct 10 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
Feb 17 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
Aug 24 Javascript
JavaScript知识点总结(十一)之js中的Object类详解
May 31 Javascript
超实用的javascript时间处理总结
Aug 16 Javascript
js中变量的连续赋值(实例讲解)
Jul 08 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
Jan 24 Javascript
JQuery的加载和选择器用法简单示例
May 13 jQuery
JavaScript中的this原理及6种常见使用场景详解
Feb 14 Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
Sep 10 Javascript
jquery插件实现图片悬浮
Apr 16 jQuery
vue+springboot实现登录验证码
May 27 Vue.js
JQuery中的html()、text()、val()区别示例介绍
Sep 01 #Javascript
关闭页面window.location事件未执行的原因及解决方法
Sep 01 #Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
Sep 01 #Javascript
JavaScript中的单引号和双引号报错的解决方法
Sep 01 #Javascript
一个简单的动态加载js和css的jquery代码
Sep 01 #Javascript
jquery ajax请求方式与提示用户正在处理请稍等
Sep 01 #Javascript
用js提交表单解决一个页面有多个提交按钮的问题
Sep 01 #Javascript
You might like
php数组应用之比较两个时间的相减排序
2008/08/18 PHP
php中使用websocket详解
2016/09/23 PHP
PHP 图片处理
2020/09/16 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
动态刷新 dorado树的js代码
2009/06/12 Javascript
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
JavaScript利用append添加元素报错的解决方法
2014/07/01 Javascript
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
js模态对话框使用方法详解
2017/02/16 Javascript
JavaScript实现星星等级评价功能
2017/03/22 Javascript
JavaScript函数柯里化原理与用法分析
2017/03/31 Javascript
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
移动web开发之touch事件实例详解
2018/01/17 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
使用vue实现多规格选择实例(SKU)
2019/08/23 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
vue中keep-alive,include的缓存问题
2019/11/26 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
[01:17:12]职来职往完美电竞专场
2014/09/18 DOTA
[01:11:32]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
Python itertools.product方法代码实例
2020/03/27 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
Python压缩模块zipfile实现原理及用法解析
2020/08/14 Python
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
武汉英思工程科技有限公司&ndash;ORACLE面试测试题目
2012/04/30 面试题
药学职务聘任书
2014/03/29 职场文书
情况说明书格式范文
2014/05/06 职场文书
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
毕业实习证明范本
2015/06/16 职场文书
《秋天的图画》教学反思
2016/02/19 职场文书
JavaScript继承的三种方法实例
2021/05/12 Javascript
python not运算符的实例用法
2021/06/30 Python
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server