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 相关文章推荐
js各种验证文本框输入格式(正则表达式)
Oct 22 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
Nov 14 Javascript
js读写cookie实现一个底部广告浮层效果的两种方法
Dec 29 Javascript
JS实现OCX控件的事件响应示例
Sep 17 Javascript
node.js中的fs.rename方法使用说明
Dec 16 Javascript
JavaScript匿名函数之模仿块级作用域
Dec 12 Javascript
Bootstrap Paginator分页插件与ajax相结合实现动态无刷新分页效果
May 27 Javascript
有关jQuery中parent()和siblings()的小问题
Jun 01 Javascript
JavaScript实现打地鼠小游戏
Apr 23 Javascript
js获取一组日期中最近连续的天数
May 25 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
Jul 20 Javascript
如何用原生js写一个弹窗消息提醒插件
May 24 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
第九节 绑定 [9]
2006/10/09 PHP
php 远程关机操作的代码
2008/12/05 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
PHP基于curl后台远程登录正方教务系统的方法
2016/10/14 PHP
php获取指定数量随机字符串的方法
2017/02/06 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
禁止刷新,回退的JS
2006/11/25 Javascript
轻轻松松学习JavaScript
2007/02/25 Javascript
javascript实现的使用方向键控制光标在table单元格中切换
2010/11/17 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
Extjs中通过Tree加载右侧TabPanel具体实现
2013/05/05 Javascript
Function.prototype.bind用法示例
2013/09/16 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
jquery中的$(document).ready()使用小结
2014/02/14 Javascript
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
2017/03/28 Javascript
jquery版轮播图效果和extend扩展
2017/07/18 jQuery
详解angular笔记路由之angular-router
2017/09/12 Javascript
写一个Vue Popup组件
2019/02/25 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
python读取word文档的方法
2015/05/09 Python
Python判断Abundant Number的方法
2015/06/15 Python
Python退火算法在高次方程的应用
2018/07/26 Python
PyQt5组件读取参数的实例
2019/06/25 Python
Python:__eq__和__str__函数的使用示例
2020/09/26 Python
python爬虫---requests库的用法详解
2020/09/28 Python
纯CSS3实现给头像加个光芒四射且旋转的背景动画效果
2014/05/07 HTML / CSS
Superdry极度乾燥官网:日本街头风格,纯英国制造品牌
2016/10/31 全球购物
2014年乡镇安全生产工作总结
2014/12/02 职场文书
会议欢迎词
2015/01/23 职场文书
小石潭记导游词
2015/02/03 职场文书
考勤制度通知
2015/04/25 职场文书
婚礼答谢词范文
2015/09/29 职场文书
css 中多种边框的实现小窍门
2021/04/07 HTML / CSS