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

  首先需要如图所示的鼠标图标文件,在自己的硬盘中搜索*.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. TeraData金融数据模型

    Teradata天睿公司(纽交所代码:TDC),是美国前十大上市软件公司之一.经过逾30 年的发展,Teradata天睿公司已经成为全球最大的专注于大数据分析.数据仓库和整合营销管理解决方案的供应商. ...

  2. SQL 注入

    我们的团队项目中有课程名称输入框,其中的内容会拼接到类sql查询语句中. 所以可能会产生类sql注入的问题,我们团队采用了利用正则表达式判断输入内容的形式来规避这类注入. 下面简单介绍一下sql注入 ...

  3. C#自学系列 - 开篇

    2014年即将过去,这一年我参加了不少面试,被问到了很多问题.回来总结下发现自己确实在基础方面有着很多的不足,还有很多东西是我不知道的.遂在下半年购入书籍若干,并系统的加以学习.我目前在看的书是Jon ...

  4. 往linux上传、下载

    http://skypegnu1.blog.51cto.com/8991766/1538371

  5. Emmet语法大全手册

    这是基于官方手册整理制作的,因为那个手册网页打开很慢,所以就整理在这里了.以备不时之需. Syntax   Child: > nav>ul>li <nav> <ul ...

  6. 更新日志 - BugHD 全面开放 API 文档

    Hey, 上周 BugHD 全面更新 API 文档,上线一些新的功能,让你可以轻松掌控 Crash ,更方便分享.定位和解决.同时,新版 fir.im 也有所优化,希望你们会喜欢. 具体如下: 开放 ...

  7. $.ajax()方法解析

    $.ajax()方法,在web网站开发中常用到,作为一种用于创建快速动态网页的技术(异步JavaScript和XML).通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新.这意味着可以 ...

  8. 无线电源传输 Wireless Power Consortium (WPC) Communication

    Universally Compatible Wireless Power Using the Qi Protocol Wireless charging of portable electronic ...

  9. 【1】CommonCode快速代码集

    阅读目录 CommonCode是什么? CommonCode包括哪些内容? 版本信息   回到顶部 CommonCode是什么? 简单的说,CommonCode是作者在经历各种"试错&quo ...

  10. Python学习笔记(2):数据库访问

    本来打算继续用Access的,但费了非常大的劲,还是没有搞定.回过头,发现使用sqlite,简单到令人发指.干脆,把C#的CommonCode往这边迁移,先把AccessDB搬过来再说. 类结构和C# ...