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 相关文章推荐
jquery1.4 教程二 ajax方法的改进
Feb 25 Javascript
js返回上一页并刷新的多种实现方法
Feb 26 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Dec 14 Javascript
Angular.Js之Scope作用域的学习教程
Apr 27 Javascript
javascript实现非常简单的小数取整功能示例
Jun 13 Javascript
Vue上传组件vue Simple Uploader的用法示例
Aug 25 Javascript
Canvas实现微信红包照片效果
Aug 21 Javascript
vue-router动态设置页面title的实例讲解
Aug 30 Javascript
VUE.CLI4.0配置多页面入口的实现
Nov 25 Javascript
Node.js中console.log()输出彩色字体的方法示例
Dec 01 Javascript
webpack3.0升级4.0的方法步骤
Apr 02 Javascript
浅谈JS for循环中使用break和continue的区别
Jul 21 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
PHP4在WinXP下IIS和Apache2服务器上的安装实例
2006/10/09 PHP
php管理nginx虚拟主机shell脚本实例
2014/11/19 PHP
详解php的socket通信
2015/08/11 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
浅谈javascript中的作用域
2012/04/07 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
Javascript window对象详解
2014/11/12 Javascript
javascript定时器完整实例
2015/02/10 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
JS实现文字掉落效果的方法
2015/05/06 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
微信小程序开发的四十个技术窍门总结(推荐)
2017/01/23 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
js轮播图的插件化封装详解
2017/07/17 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
JavaScript伪数组用法实例分析
2017/12/22 Javascript
10分钟上手vue-cli 3.0 入门介绍
2018/04/04 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
[02:53]2018年度DOTA2最佳战队-完美盛典
2018/12/17 DOTA
Python 的 Socket 编程
2015/03/24 Python
Python多线程、异步+多进程爬虫实现代码
2016/02/17 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
Python中super函数用法实例分析
2019/03/18 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
广州地球村科技数据库题目
2016/04/25 面试题
行政求职信
2014/07/04 职场文书
青年文明号汇报材料
2014/12/23 职场文书
爱心助学感谢信
2015/01/21 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang
Python3接口性能测试实例代码
2021/06/20 Python
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python