类似于桌面程序中的表格拖动表头的效果,当鼠标停留在表头边框线上时,鼠标会变成表示左右拖动的形状,接着拖动鼠标,会在表格中出现一条随鼠标移动的竖线,最后放开鼠标,表格列宽会被调整。最近比较空闲,便自己动手尝试实现,在此分享下小小的成果。

  首先需要如图所示的鼠标图标文件,在自己的硬盘中搜索*.cur,肯定能找到。

  为了能在所有需要该效果的页面使用,并且不需要更改页面任何HTML,我把所有的代码整合在  $(document).ready(function() {});  中,并写入一个独立的JS文件。

  

  用一个1像素宽的DIV来模拟一条竖线,在页面载入后添加到body元素中

  

1
2
3
$(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事件中处理鼠标变型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$("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对象。

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$("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函数中

 

1
2
3
4
5
$("body").bind("mousemove",
function(event)
{
    if (lineMove
==
true)
{
        $("#line").css({
"left":
event.clientX }).show();
     }
});

  最后是鼠标弹起时,最后的调整列宽效果。这里我给BODY 和TH两个元素添加了同样的mouseup代码。我原先以为我只需要给BODY添加mouseup函数,但不明白为什么鼠标在TH中时,事件没有触发,我只好给TH元素也添加了代码。水平有限,下面完全重复的代码不知道怎么抽出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$("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

效果文件下载:http://files.cnblogs.com/xxfss2/changeTh.js

————————————————————————2012-8-16更新——————————————

关于拖动时会选中内容的BUG,将以下一行代码添加到$(document).ready函数里就行了

$("body").bind("selectstart", function() { return !lineMove; });

标签: JavaScriptAsp.Net


http://www.cnblogs.com/xxfss2/archive/2011/01/21/1941567.html

JQuery 表格拖动调整列宽效果的更多相关文章

  1. MS WORD 表格自己主动调整列宽,自己主动变美丽,依据内容自己主动调整

    在MS WORD中,当有大量的表格出现时,调整每一个表格的的高和宽和大小将是一件很累的事情,拖来拖去,很耗时间,并且当WORD文档达到300页以上时,调整反应很的慢,每次拖拉线后,须要等待一段时间其才 ...

  2. [办公应用]我的WORD文档表格操作不灵活 无法调整列宽

    最近同事的一个word文档中的表格操作非常不灵活,用鼠标直接调整列宽时总觉得很不灵活.她的操作系统为XP,office 为微软office 2003. 我首先检查了木马,检查了输入法等,结果都没有问题 ...

  3. QTableView表格视图的列宽设置

    Qt中的表格控件可以通过从QTableView或QTableWidget派生子类实现.其中,QTableWidget只是对QTableView的一种简单封装.因为使用QTableView常常需要用户指 ...

  4. Java使用POI为Excel打水印,调整列宽并设置Excel只读(用户不可编辑)

    本文介绍在Java语言环境下,使用POI为Excel打水印的解决方案,具体的代码编写以及相关的注意事项. 需求描述: 要求通过系统下载的Excel都带上公司的水印,列宽调整为合适的宽度,并且设置为不可 ...

  5. 完美实现保存和加载easyui datagrid自定义调整列宽位置隐藏属性功能

    需求&场景 例表查询是业务系统中使用最多也是最基础功能,但也是调整最平凡,不同的用户对数据的要求也不一样,所以在系统正式使用后,做为开发恨不得坐在业务边上,根据他们的要求进行调整,需要调整最多 ...

  6. 【Qt开发】QTableWidget设置根据内容调整列宽和行高

    QTableWidget要调整表格行宽主要涉及以下一个函数 1.resizeColumnsToContents();                      根据内容调整列宽            ...

  7. jQuery调整表列(左右拉动调整列宽)插件__colResizable,动态列如何使用

    官网地址:http://www.bacubacu.com/colresizable/ 这里值得注意的是,如果是动态加入的列,则需要先清理调用插件生成的class,id和div之后再重新调用才会有作用. ...

  8. jQuery可调整表和列宽插件-colResizable

    最基本的例子 引入JS <script src="js/jquery-1.8.0.min.js" type="text/javascript">&l ...

  9. CSS 控制table 滑动及调整列宽等问题总结

    一. 通过css控制table y方向上滚动 html中没有滚动条,可以根据overflow属性的scroll来对table显示不完全的内容进行滚动. 只是y方向上滚动,很简单,只要设置div的hei ...

随机推荐

  1. Linux:命令执行顺序控制与管道

    命令执行顺序控制与管道 顺序执行 简单的顺序命令可以使用符号";"完成,如:sudo apt-get update;sudo apt-get install some-tool;s ...

  2. 分布式icinga2安装与使用

    目标 配置分布式的icinga2监控系统.分布式监控适用于服务器遍布在多个区域,且需要一个master做统一管理. 搭建环境 服务器 系统: ubuntu 15.04/ubuntu 14.04 ici ...

  3. SONATYPE NEXUS搭建MAVEN私服

    1.为什么使用Nexus如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地,而一个团队中的所有人都重复的从maven仓库下载构件无疑加大了仓库的负载和浪费 ...

  4. css圆环百分比

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 如何给input[file]定义cursor

    来源:http://stackoverflow.com/questions/1537223/change-cursor-type-on-input-type-file Simple question. ...

  6. baguetteBox.js响应式画廊插件(纯JS)

    baguetteBox.js baguetteBox.js 是一个简单和易于使用lightbox纯JavaScript脚本,拥有图像放大缩小并带有相应的CSS3过度,并能在触摸屏等设备上完美展示. D ...

  7. xdebug影响php运行速度

    我在本地wamp的环境下面加了xdebug用来调试,但是我发现wordpress运行速度好慢,所有程序运行变得也很慢.开始以为是数据库有问题,找了半天,发现把xdebug的扩展去掉,就正常了. 目前配 ...

  8. javaweb学习总结(七)——HttpServletResponse对象(一)

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...

  9. spring源码 — 一、IoC容器初始化

    IoC容器初始化 注意:本次的spring源码是基于3.1.1.release版本 容器:具有获取Bean功能--这是最基本功能,也是BeanFactory接口定义的主要行为,在添加了对于资源的支持之 ...

  10. python一个简单的登录

    文件目录下有两个文件 user_name.txt lock_file.txt 实际中可以读数据库里的信息 代码如下 #encoding = utf-8 import sys user_file = ' ...