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 相关文章推荐
JavaScript-世界上误解最深的语言分析
Aug 12 Javascript
30个最好的jQuery 灯箱插件分享
Apr 25 Javascript
js脚本分页代码分享(7种样式)
Aug 19 Javascript
js识别uc浏览器的代码
Nov 06 Javascript
全面理解JavaScript中的闭包
May 12 Javascript
jQuery动态生成表格及右键菜单功能示例
Jan 13 Javascript
JavaScript实现表单注册、表单验证、运算符功能
Oct 15 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
Apr 25 Javascript
微信小程序和H5页面间相互跳转代码实例
Sep 19 Javascript
Node在Controller层进行数据校验的过程详解
Aug 28 Javascript
详解ES6中class的实现原理
Oct 03 Javascript
5种方法告诉你如何使JavaScript 代码库更干净
Sep 15 Javascript
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文件打开、关闭、写入的判断与执行代码
2011/05/24 PHP
PHP实现递归无限级分类
2015/10/22 PHP
PHP实现图片批量打包下载功能
2017/03/01 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
PHP实现的简单sha1加密功能示例
2017/08/27 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
jquery 学习之二 属性(html()与html(val))
2010/11/25 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
node.js中的http.get方法使用说明
2014/12/14 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
Jquery判断form表单数据是否变化
2016/03/30 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
实例解析jQuery中如何取消后续执行内容
2016/12/01 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
2017/07/19 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
python学习手册中的python多态示例代码
2014/01/21 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
python3.x上post发送json数据
2018/03/04 Python
Python 实例方法、类方法、静态方法的区别与作用
2019/08/14 Python
python tkinter基本属性详解
2019/09/16 Python
Python读写锁实现实现代码解析
2020/11/28 Python
Python3使用Selenium获取session和token方法详解
2021/02/16 Python
REISS美国官网:伦敦最受欢迎的时尚品牌
2019/08/16 全球购物
2014年自我评价
2014/01/04 职场文书
给同学的道歉信
2014/01/16 职场文书
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
自荐信的基本格式
2014/02/22 职场文书
租赁意向书范本
2014/04/01 职场文书
《冬阳童年骆驼队》教学反思
2014/04/15 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
建议书的格式及范文
2015/09/14 职场文书
如何写好闭幕词
2019/04/02 职场文书
Python IO文件管理的具体使用
2022/03/20 Python