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函数、递归与闭包(执行环境、变量对象与作用域链)使用详解
May 08 Javascript
简单介绍JavaScript数据类型之隐式类型转换
Dec 28 Javascript
总结Javascript中的隐式类型转换
Aug 24 Javascript
js调用屏幕宽度的简单方法
Nov 14 Javascript
Angular2.js实现表单验证详解
Jun 23 Javascript
jQuery封装animate.css的实例
Jan 04 jQuery
vue ssr 实现方式(学习笔记)
Jan 18 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
Feb 10 Javascript
vue 组件开发原理与实现方法详解
Nov 29 Javascript
关于Vue中$refs的探索浅析
Nov 05 Javascript
vue 图片裁剪上传组件的实现
Nov 12 Javascript
如何在JavaScript中正确处理变量
Dec 25 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
在IIS上安装PHP4.0正式版
2006/10/09 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
php for 循环使用的简单实例
2016/06/02 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
PHP bin2hex()函数基础实例讲解
2019/02/11 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
2019/06/14 PHP
JavaScript 继承详解(三)
2009/07/13 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
Jquery实现的简单轮播效果【附实例】
2016/04/19 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
详解react native页面间传递数据的几种方式
2018/11/07 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
vue实现打地鼠小游戏
2020/08/21 Javascript
Python 抓取动态网页内容方案详解
2014/12/25 Python
使用Python装饰器在Django框架下去除冗余代码的教程
2015/04/16 Python
各个系统下的Python解释器相关安装方法
2015/10/12 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
python opencv 直方图反向投影的方法
2018/02/24 Python
Python实现Event回调机制的方法
2019/02/13 Python
python super用法及原理详解
2020/01/20 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
python中return如何写
2020/06/18 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
实例教程 纯CSS3打造非常炫的加载动画效果
2014/11/05 HTML / CSS
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
物业管理求职自荐信
2013/09/25 职场文书
yy生日主持词
2014/03/20 职场文书
项目工作说明书
2014/07/29 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
销售经理岗位职责
2015/01/31 职场文书
协议书格式模板
2016/03/24 职场文书
教你nginx跳转配置的四种方式
2022/07/07 Servers