工作中用到了表格的可变列宽,网上看了下,自己也实现了一个,整理贴记录。

测试环境chromeie8firefox

jquery版本1.8.2

原理:监听table第一行的mousemove事件,当鼠标位置在某列的边框附近时,mousedown即可拖动该列,mouseup时结束。其中当拖动时,2种方式:拖动时列宽随时变化,另一种是拖动结束时最后才计算列宽,采用后者相对好点,可以减少对dom的操作,提高性能和友好性。

参考ext grid的实现方式,当拖动时有2条参考线,分别表示列的左边框和右边框,通过拖动右边框来实现大小的改变。

表格样例

  1. <table id="tbl"border="1" cellspacing="0" cellpadding="0">
  2. <tr>
  3. <th style="width:100px">col1</th>
  4. <th style="width:100px">col2</th>
  5. <th style="width:200px">col3</th>
  6. <th style="width:200px">col4</th>
  7. <th style="width:300px">col5</th>
  8. </tr>
  9. <tr>
  10. <td>1</td><td>1</td><td>1</td><td>1</td><td>1</td>
  11. </tr>
  12. <tr>
  13. <td>2</td><td>2</td><td>2</td><td>2</td><td>2</td>
  14. </tr>
  15. <tr>
  16. <td>3</td><td>3</td><td>3</td><td>3</td><td>3</td>
  17. </tr>
  18. <tr>
  19. <td>4</td><td>4</td><td>4</td><td>4</td><td>4</td>
  20. </tr>
  21. </table>

代码是经过很多次修改的,应该把一步步测试修改的记录下的,完整功能的代码看起来逻辑没有一步步来清晰了,代码如下

  1. <pre class="js" name="code">//全局变量</pre>
  2. <pre class="js" name="code">var resizing = false; //是否为拖动状态
  3. var resizable = false; //当时是否可拖动
  4. var minWidth = 20;  //没列的最小宽度
  5. var resizeHeader;   //当前拖动的列
  6. var leftLine;       //左参考线
  7. var rightLine;      //有参考线
  8. $(function(){
  9. //监听标题行的mouosemove事件
  10. $("table th").mousemove(function(e){
  11. var target = $(e.target);
  12. if(resizing){
  13. //当已经在拖动变化列宽时
  14. onDraging(e);
  15. }else if(fnIsLeftEdge(e)){
  16. //靠近左边框时,将当前的处理header
  17. //设置为左边的一个,这样就相当于是拖动列
  18. //的右边框,可以只计算该header的右边框参
  19. //考线的移动,方便处理
  20. resizeHeader = target.prev();
  21. //不响应第一列的左边框拖动事件
  22. if(resizeHeader.length == 0)
  23. return;
  24. //当鼠标停在左边框时,设置当前为可拖动状态
  25. resizable = true;
  26. //设置鼠标样式为拖动时的样式
  27. target.css("cursor", "col-resize");
  28. }else if(fnIsRightEdge(e)){
  29. //当鼠标停留在右边框时
  30. resizeHeader = target;
  31. resizable = true;
  32. target.css("cursor", "col-resize");
  33. }else{
  34. //超出可拖动的区域,设为不可拖动状态
  35. resizable = false;
  36. target.css("cursor", "default");
  37. }
  38. });
  39. //当在拖动列上点击鼠标
  40. $("table th").mousedown(function(e){
  41. onDragingStart(e);
  42. });
  43. //当在document上移动鼠标,因为拖动可能超出表格的范围
  44. $(document).mousemove(function(e){
  45. onDraging(e);
  46. });
  47. //当拖动而释放时候未在标题行的释放也需要结束拖动
  48. $(document).mouseup(function(e){
  49. onDragingEnd(e);
  50. });
  51. });
  52. /**
  53. * 计算当前鼠标位置是不是在可拖动的范围内
  54. * @param event e目标事件
  55. * @side boolean true表示在左边边框附近,false表示右边
  56. * @return boolean true在表格边框附近,false未在
  57. */
  58. function _fnIsColEdge(e, side){
  59. var target = $(e.target);
  60. var x = e.pageX;
  61. var offset = target.offset();
  62. var left = offset.left;
  63. var right = left + target.outerWidth();
  64. return side ? x<=left+2 : x >=right-2;
  65. }
  66. /**
  67. * 计算当前鼠标位置是不是在左边框附近
  68. * @param event e目标事件
  69. * @return boolean true是, false否
  70. */
  71. function fnIsLeftEdge(e){
  72. return _fnIsColEdge(e, true);
  73. }
  74. /**
  75. * 计算当前鼠标位置是不是在右边框附近
  76. * @param event e目标事件
  77. * @return boolean true是, false否
  78. */
  79. function fnIsRightEdge(e){
  80. return _fnIsColEdge(e, false);
  81. }
  82. /**
  83. * 初始化拖动状态
  84. * @param event e目标事件
  85. * @return void
  86. */
  87. function onDragingStart(e){
  88. //当前是否为拖动状态
  89. if(resizable){
  90. var target = $(e.target);
  91. //设置当前文本不可选中,否则拖动时会选中文本
  92. if(!$.browser.mozilla){
  93. $(document).bind("selectstart", function(){ return false; });
  94. }else{
  95. $("body").css("-moz-user-select", "none");
  96. }
  97. //创建参考线
  98. if(!leftLine){
  99. leftLine = $("<div></div>");
  100. leftLine.addClass("resize_line");
  101. leftLine.appendTo("body");
  102. rightLine = leftLine.clone();
  103. rightLine.appendTo("body");
  104. }
  105. //显示参考线
  106. leftLine.css({"top":resizeHeader.offset().top, "left": resizeHeader.offset().left, "height": $("table").innerHeight()});
  107. rightLine.css({"top":resizeHeader.offset().top, "left": e.pageX, "css":"col-resize", "height": $("table").innerHeight()});
  108. leftLine.show();
  109. rightLine.show();
  110. //设置为已经在拖动
  111. resizing = true;
  112. }
  113. }
  114. /**
  115. * 列宽拖动中
  116. * @param event e目标事件
  117. * @return void
  118. */
  119. function onDraging(e){
  120. //如果已经在拖动
  121. if(resizing){
  122. //拖动后的列宽不能小于最小列宽
  123. if(e.pageX - resizeHeader.offset().left > minWidth){
  124. rightLine.css("left", e.pageX);
  125. }
  126. }
  127. }
  128. /**
  129. * 鼠标释放拖动结束,改变列宽,结束拖动状态
  130. * @param event e目标事件
  131. * @return void
  132. */
  133. function onDragingEnd(e){
  134. //如果已经在拖动
  135. if(resizing){
  136. resizing = false;
  137. //隐藏参考线
  138. rightLine.hide();
  139. leftLine.hide();
  140. //设置文本可以选中
  141. if(!$.browser.mozilla){
  142. $(document).unbind("selectstart");
  143. }else{
  144. $("body").css("-moz-user-select", "");
  145. }
  146. //计算设置新的列宽
  147. doResize();
  148. }
  149. }
  150. /**
  151. * 设置新的列宽
  152. * @param event e目标事件
  153. * @return void
  154. */
  155. function doResize(){
  156. //计算列宽的变化值
  157. var newWidth = parseInt(rightLine.css("left"), 10) - resizeHeader.offset().left - resizeHeader.width();
  158. //设置新列宽
  159. resizeHeader.width(resizeHeader.width() + newWidth);
  160. }</pre>

参考线的样式

  1. .resize_line{
  2. width:0px;
  3. border-style: solid;
  4. border-color: #0066FF;
  5. border-width: 0 1px 0 1px;
  6. position:absolute;
  7. }

整理修改后可作为jquery的插件使用,附件是示例和插件代码。

目前对分组的header即使用了rowspan和colspan的没有做处理,有时间再做更新,有兴趣的人也可以扩展和完善。

jquery实现表格可变列宽插件开发的更多相关文章

  1. MS WORD 表格自动调整列宽,自动变漂亮,根据内容自动调整 .

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

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

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

  3. devpress grid表格自适应列宽的问题

    /// <summary> /// 自适应列宽,显示横向滚轴,只有当所有列都已经在界面上加载完成之后才能生效 /// </summary> public void setAut ...

  4. CSS表格固定列宽

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 使用jqueryUI实现自由调整表格列宽

    今天项目中需要插入表格,用Excel表格调整列宽时,想怎么拖就怎么拖,于是乎就让插入的表格也这么让人舒服.网上查找许久,没找到好用的方案.最后发现jQuery UI中的resizable()方法可以实 ...

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

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

  7. eas之添加表格列宽自动调整设置

    设置表格整体宽度自动调整为所在panel的宽度 KDTable table=new KDTable(); table. setAutoResize (boolean); 注意:该功能在冻结功能启用后, ...

  8. jQuery表格列宽可变,兼容firfox

    本demo使用jQuery包,实现表格列宽可拖拽功能,并实现页面reset时的重新布局.使用jQuery,方便函数的调用,给要处理的表格添加id 后,直接调用$("#id").mo ...

  9. JQuery 表格拖动调整列宽效果

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

随机推荐

  1. 【c++】虚函数描写叙述符override

    在C++11中为了帮助程序猿写继承结构复杂的类型,引入了虚函数描写叙述符override,假设派生类在虚函数声明时使用了override描写叙述符,那么该函数必须重载其基类中的同名函数,否则代码将无法 ...

  2. view中的setTag和getTag方法的理解

    下面是一段自定义适配器中的getView方法,其中使用了view的一个setTag和getTag方法 View中的setTag(Onbect)表示给View添加一个格外的数据(相当于缓存),以后可以用 ...

  3. LabVIEW系列——自定义错误

    1.自定义错误代码文本文件在labview中三处:      a).E:\Program Files\National Instruments\LabVIEW 8.6\project\errors   ...

  4. 基于keepalived对redis做高可用配置---转载

    关于keepalived的详细介绍,请移步本人相关博客:http://wangfeng7399.blog.51cto.com/3518031/1405785 功能 ip地址 安装软件 主redis 1 ...

  5. Java基础知识强化之集合框架笔记56:Map集合之HashMap集合(HashMap<String,Student>)的案例

    1. HashMap集合(HashMap<String,Student>)的案例 HashMap是最常用的Map集合,它的键值对在存储时要根据键的哈希码来确定值放在哪里. HashMap的 ...

  6. GUI编程笔记(java)05:GUI事件监听机制原理和举例说明

    1.事件监听机制:       A:事件源          事件发生的地方       B:事件             就是要发生的事情       C:事件处理       就是针对发生的事情做 ...

  7. get方式请求会出现中文乱码。post方式不会。

    get方式请求会出现中文乱码.post方式不会.   如果是要解决get方式中文乱码问题,就需要做一个拦截器,或者在web.xml做一个get请求的配置 来自为知笔记(Wiz)

  8. 使用jquery.validate.js实现boostrap3的校验和验证

    使用jquery.validate.js实现boostrap3的校验和验证 boostrap3验证框架 jquery.validate.js校验表单 >>>>>>& ...

  9. 免费的手机号码归属地查询API接口文档

    聚合数据手机号码归属四查询API接口,根据手机号码或手机号码的前7位,查询手机号码归属地信息,包括省份 .城市.区号.邮编.运营商和卡类型. 通过链接https://www.juhe.cn/docs/ ...

  10. git 常见问题收集(持续更新中)

    1.问题:在配置完成github上的ssh后如何使用ssh? 答: 1)http方式 url =https://github.com/username/test_repo.git 2)ssh方式:把u ...