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 相关文章推荐
jquery全选checkBox功能实现代码(取消全选功能)
Dec 10 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
Nov 25 Javascript
jQuery的each循环用法简单示例
Jun 12 Javascript
javascript数组常用方法汇总
Sep 10 Javascript
EasyUI在Panel上动态添加LinkButton按钮
Aug 11 Javascript
vue路由嵌套的SPA实现步骤
Nov 06 Javascript
详解webpack中的hash、chunkhash、contenthash区别
Jan 05 Javascript
JQuery实现table中tr上移下移的示例(超简单)
Jan 08 jQuery
js中int和string数据类型互相转化实例
Jan 16 Javascript
vue-loader中引入模板预处理器的实现
Sep 04 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
Sep 05 Javascript
vue开发中遇到的问题总结
Apr 07 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
解析htaccess伪静态的规则
2013/06/18 PHP
简单的php缓存类分享     php缓存机制
2014/01/22 PHP
PHP mkdir创建文件夹实现方法解析
2020/11/13 PHP
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
javascript表单验证使用示例(javascript验证邮箱)
2014/01/07 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
Windows8下搭建Node.js开发环境教程
2014/09/03 Javascript
jQuery版本升级踩坑大全
2016/01/12 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
Google 地图API资料整理及详细介绍
2016/08/06 Javascript
相册展示PhotoSwipe.js插件实现
2016/08/25 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
详解Angular 4.x Injector
2017/05/04 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
jQuery HTML css()方法与css类实例详解
2020/05/20 jQuery
javascript解析json格式的数据方法详解
2020/08/07 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
Python中获取网页状态码的两个方法
2014/11/03 Python
Python中实现从目录中过滤出指定文件类型的文件
2015/02/02 Python
简单上手Python中装饰器的使用
2015/07/12 Python
python实现微信远程控制电脑
2018/02/22 Python
Python编程中flask的简介与简单使用
2018/12/28 Python
解决Djang2.0.1中的reverse导入失败的问题
2019/08/16 Python
Python序列类型的打包和解包实例
2019/12/21 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
高校学生干部的自我评价分享
2013/11/04 职场文书
《我要的是葫芦》教学反思
2014/02/23 职场文书
合作经营协议书范本
2014/09/16 职场文书
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android
logback 实现给变量指定默认值
2021/08/30 Java/Android
Redis的字符串是如何实现的
2021/10/24 Redis
vue使用echarts实现折线图
2022/03/21 Vue.js
python中mongodb包操作数据库
2022/04/19 Python