jquery实现表格可变列宽插件开发
工作中用到了表格的可变列宽,网上看了下,自己也实现了一个,整理贴记录。
测试环境chrome,ie8,firefox
jquery版本1.8.2
原理:监听table第一行的mousemove事件,当鼠标位置在某列的边框附近时,mousedown即可拖动该列,mouseup时结束。其中当拖动时,2种方式:拖动时列宽随时变化,另一种是拖动结束时最后才计算列宽,采用后者相对好点,可以减少对dom的操作,提高性能和友好性。
参考ext grid的实现方式,当拖动时有2条参考线,分别表示列的左边框和右边框,通过拖动右边框来实现大小的改变。
表格样例
- <table id="tbl"border="1" cellspacing="0" cellpadding="0">
- <tr>
- <th style="width:100px">col1</th>
- <th style="width:100px">col2</th>
- <th style="width:200px">col3</th>
- <th style="width:200px">col4</th>
- <th style="width:300px">col5</th>
- </tr>
- <tr>
- <td>1</td><td>1</td><td>1</td><td>1</td><td>1</td>
- </tr>
- <tr>
- <td>2</td><td>2</td><td>2</td><td>2</td><td>2</td>
- </tr>
- <tr>
- <td>3</td><td>3</td><td>3</td><td>3</td><td>3</td>
- </tr>
- <tr>
- <td>4</td><td>4</td><td>4</td><td>4</td><td>4</td>
- </tr>
- </table>
代码是经过很多次修改的,应该把一步步测试修改的记录下的,完整功能的代码看起来逻辑没有一步步来清晰了,代码如下
- <pre class="js" name="code">//全局变量</pre>
- <pre class="js" name="code">var resizing = false; //是否为拖动状态
- var resizable = false; //当时是否可拖动
- var minWidth = 20; //没列的最小宽度
- var resizeHeader; //当前拖动的列
- var leftLine; //左参考线
- var rightLine; //有参考线
- $(function(){
- //监听标题行的mouosemove事件
- $("table th").mousemove(function(e){
- var target = $(e.target);
- if(resizing){
- //当已经在拖动变化列宽时
- onDraging(e);
- }else if(fnIsLeftEdge(e)){
- //靠近左边框时,将当前的处理header
- //设置为左边的一个,这样就相当于是拖动列
- //的右边框,可以只计算该header的右边框参
- //考线的移动,方便处理
- resizeHeader = target.prev();
- //不响应第一列的左边框拖动事件
- if(resizeHeader.length == 0)
- return;
- //当鼠标停在左边框时,设置当前为可拖动状态
- resizable = true;
- //设置鼠标样式为拖动时的样式
- target.css("cursor", "col-resize");
- }else if(fnIsRightEdge(e)){
- //当鼠标停留在右边框时
- resizeHeader = target;
- resizable = true;
- target.css("cursor", "col-resize");
- }else{
- //超出可拖动的区域,设为不可拖动状态
- resizable = false;
- target.css("cursor", "default");
- }
- });
- //当在拖动列上点击鼠标
- $("table th").mousedown(function(e){
- onDragingStart(e);
- });
- //当在document上移动鼠标,因为拖动可能超出表格的范围
- $(document).mousemove(function(e){
- onDraging(e);
- });
- //当拖动而释放时候未在标题行的释放也需要结束拖动
- $(document).mouseup(function(e){
- onDragingEnd(e);
- });
- });
- /**
- * 计算当前鼠标位置是不是在可拖动的范围内
- * @param event e目标事件
- * @side boolean true表示在左边边框附近,false表示右边
- * @return boolean true在表格边框附近,false未在
- */
- function _fnIsColEdge(e, side){
- var target = $(e.target);
- var x = e.pageX;
- var offset = target.offset();
- var left = offset.left;
- var right = left + target.outerWidth();
- return side ? x<=left+2 : x >=right-2;
- }
- /**
- * 计算当前鼠标位置是不是在左边框附近
- * @param event e目标事件
- * @return boolean true是, false否
- */
- function fnIsLeftEdge(e){
- return _fnIsColEdge(e, true);
- }
- /**
- * 计算当前鼠标位置是不是在右边框附近
- * @param event e目标事件
- * @return boolean true是, false否
- */
- function fnIsRightEdge(e){
- return _fnIsColEdge(e, false);
- }
- /**
- * 初始化拖动状态
- * @param event e目标事件
- * @return void
- */
- function onDragingStart(e){
- //当前是否为拖动状态
- if(resizable){
- var target = $(e.target);
- //设置当前文本不可选中,否则拖动时会选中文本
- if(!$.browser.mozilla){
- $(document).bind("selectstart", function(){ return false; });
- }else{
- $("body").css("-moz-user-select", "none");
- }
- //创建参考线
- if(!leftLine){
- leftLine = $("<div></div>");
- leftLine.addClass("resize_line");
- leftLine.appendTo("body");
- rightLine = leftLine.clone();
- rightLine.appendTo("body");
- }
- //显示参考线
- leftLine.css({"top":resizeHeader.offset().top, "left": resizeHeader.offset().left, "height": $("table").innerHeight()});
- rightLine.css({"top":resizeHeader.offset().top, "left": e.pageX, "css":"col-resize", "height": $("table").innerHeight()});
- leftLine.show();
- rightLine.show();
- //设置为已经在拖动
- resizing = true;
- }
- }
- /**
- * 列宽拖动中
- * @param event e目标事件
- * @return void
- */
- function onDraging(e){
- //如果已经在拖动
- if(resizing){
- //拖动后的列宽不能小于最小列宽
- if(e.pageX - resizeHeader.offset().left > minWidth){
- rightLine.css("left", e.pageX);
- }
- }
- }
- /**
- * 鼠标释放拖动结束,改变列宽,结束拖动状态
- * @param event e目标事件
- * @return void
- */
- function onDragingEnd(e){
- //如果已经在拖动
- if(resizing){
- resizing = false;
- //隐藏参考线
- rightLine.hide();
- leftLine.hide();
- //设置文本可以选中
- if(!$.browser.mozilla){
- $(document).unbind("selectstart");
- }else{
- $("body").css("-moz-user-select", "");
- }
- //计算设置新的列宽
- doResize();
- }
- }
- /**
- * 设置新的列宽
- * @param event e目标事件
- * @return void
- */
- function doResize(){
- //计算列宽的变化值
- var newWidth = parseInt(rightLine.css("left"), 10) - resizeHeader.offset().left - resizeHeader.width();
- //设置新列宽
- resizeHeader.width(resizeHeader.width() + newWidth);
- }</pre>
参考线的样式
- .resize_line{
- width:0px;
- border-style: solid;
- border-color: #0066FF;
- border-width: 0 1px 0 1px;
- position:absolute;
- }
整理修改后可作为jquery的插件使用,附件是示例和插件代码。
目前对分组的header即使用了rowspan和colspan的没有做处理,有时间再做更新,有兴趣的人也可以扩展和完善。
jquery实现表格可变列宽插件开发的更多相关文章
- MS WORD 表格自动调整列宽,自动变漂亮,根据内容自动调整 .
在MS WORD中,当有大量的表格出现时,调整每个表格的的高和宽和大小将是一件非常累的事情,拖来拖去,非常耗时间,而且当WORD文档达到300页以上时,调整反应非常的慢,每次拖拉线后,需要等待一段时间 ...
- jQuery可调整表和列宽插件-colResizable
最基本的例子 引入JS <script src="js/jquery-1.8.0.min.js" type="text/javascript">&l ...
- devpress grid表格自适应列宽的问题
/// <summary> /// 自适应列宽,显示横向滚轴,只有当所有列都已经在界面上加载完成之后才能生效 /// </summary> public void setAut ...
- CSS表格固定列宽
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 使用jqueryUI实现自由调整表格列宽
今天项目中需要插入表格,用Excel表格调整列宽时,想怎么拖就怎么拖,于是乎就让插入的表格也这么让人舒服.网上查找许久,没找到好用的方案.最后发现jQuery UI中的resizable()方法可以实 ...
- QTableView表格视图的列宽设置
Qt中的表格控件可以通过从QTableView或QTableWidget派生子类实现.其中,QTableWidget只是对QTableView的一种简单封装.因为使用QTableView常常需要用户指 ...
- eas之添加表格列宽自动调整设置
设置表格整体宽度自动调整为所在panel的宽度 KDTable table=new KDTable(); table. setAutoResize (boolean); 注意:该功能在冻结功能启用后, ...
- jQuery表格列宽可变,兼容firfox
本demo使用jQuery包,实现表格列宽可拖拽功能,并实现页面reset时的重新布局.使用jQuery,方便函数的调用,给要处理的表格添加id 后,直接调用$("#id").mo ...
- JQuery 表格拖动调整列宽效果
类似于桌面程序中的表格拖动表头的效果,当鼠标停留在表头边框线上时,鼠标会变成表示左右拖动的形状,接着拖动鼠标,会在表格中出现一条随鼠标移动的竖线,最后放开鼠标,表格列宽会被调整.最近比较空闲,便自己动 ...
随机推荐
- 使用Pager-taglib进行分页
在.net中,我们有分页控件.在java中,我们有分页标签库.他们都已经为我们封装好了,我们只需要给这几个参数:数据.当前页码.每页记录数,就能完成分页,所以他们是大同小异的. 今天来说说Pager- ...
- 仿path菜单button的实现
path刚出来时.其菜单button也算是让大多数人感到了惊艳,如今看来事实上是非常easy的就是动画的结合. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...
- ViewPager的用法和实现过程
看图先: 页面中填充内容是随机关键词飞入和飞出动画效果,随后会更新,如今请先无视吧 首先是 导入jar包 下载地址:android-support-v4.jar 布局文件中加入v ...
- TCP/IP 编程
http://www.cnblogs.com/ggjucheng/archive/2012/08/18/2645324.html
- 【转】cocos2d-x游戏开发(八)各类构造器
欢迎转载:http://blog.csdn.net/fylz1125/article/details/8521997 这篇写cocos2d-x的构造器. cocos2d-x引入自动释放机制后,创建的对 ...
- 重新温习,不但可以让自己对js更加的深刻认识,又能加深记忆,至此每天一次复习记录在此。
Undefined类型,它只有一个值就是它本身,打个比方你在声明变量的时候又未对变量赋值也就是相关初始化操作,那么此刻该变量的值便是Undefined. var a//声明一个变量. console. ...
- javascript类继承系列四(组合继承)
原理: 结合了原型链和对象伪装各自优点的方式,基本思路是:使用原型链继承原型上的属性和方法,使用对象伪装继承实例属性,通过定义原型方法,允许函数复用,并运行每个实例拥有自己的属性 function B ...
- mvc5 + ef6 + autofac搭建项目(repository+uow)(二)
续上篇: DBContext 在上篇 图一类库根目录创建的 DbContextBase /// <summary> /// 数据库上下文基类 /// </summary> // ...
- 配置hive元数据库mysql时候出现 Unable to find the JDBC database jar on host : master
解决办法: cd /usr/share/java/,(没有java文件夹,自行创建)rz mysql-connector-java-***.jar,mv mysql-connector-java-* ...
- vector 与 set区别
注:本文内容摘自网络,准确性有待验证,现阶段仅供学习参考.尊重作品作者成果,原文链接 :http://blog.csdn.net/wxdcxp/article/details/5279618 首先,v ...