一个可拖拽列宽表格实例演示


Posted in Javascript onNovember 26, 2012
<DOCTYPE html> 
<html> 
<head> 
<title></title> 
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"> 
<style> 
body{ 
font:12px/1.5 Tahoma; 
} 
#gannt_left{ 
width:500px; 
} 
#left-scroll-panel{ 
width:520px; 
height:100px; 
overflow-y: auto; 
} 
table{ 
table-layout:fixed; 
border-collapse: collapse; 
border-spacing: 0px; 
text-align:center; 
width:500px; 
} 
table,th,td{ 
border:1px solid #afe0ea; 
} 
th,td{ 
height:20px; 
line-height:20px; 
overflow: hidden; 
text-overflow:ellipsis; 
white-space:nowrap; 
word-wrap:normal; 
word-break:keep-all; 
} 
th{ 
background:#adf5ff; 
} 
td{ 
background:#f6fcff; 
} 
#gannt_grid,#gannt_grid td{ 
border-top:0px none; 
} 
</style> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
</head> 
<body> 
<div id="gannt_left"> 
<div id="left-scroll-panel" class="scroll-panel"> 
<table id="gannt_grid"> 
<thead> 
<tr> 
<th width="30">序号</th> 
<th width="35">操作</th> 
<th>标题</th> 
<th width="80">执行人</th> 
<th width="80">开始时间</th> 
<th width="80">结束时间</th> 
<th width="30">天数</th> 
</tr> 
</thead> 
<tbody> 
<tr> 
<td>1</td> 
<td>编辑</td> 
<td>任务标题:阿斯卡是大家啊</td> 
<td>Firefox</td> 
<td>2012-07-15</td> 
<td>2012-08-15</td> 
<td>32</td> 
</tr> 
<tr> 
<td>2</td> 
<td>编辑</td> 
<td>任务标题:阿斯卡是大家啊</td> 
<td>Firefox</td> 
<td>2012-07-15</td> 
<td>2012-08-15</td> 
<td>32</td> 
</tr> 
<tr> 
<td>3</td> 
<td>编辑</td> 
<td>任务标题:阿斯卡是大家啊</td> 
<td>Firefox</td> 
<td>2012-07-15</td> 
<td>2012-08-15</td> 
<td>32</td> 
</tr> 
<tr> 
<td>4</td> 
<td>编辑</td> 
<td>任务标题:阿斯卡是大家啊</td> 
<td>Firefox</td> 
<td>2012-07-15</td> 
<td>2012-08-15</td> 
<td>32</td> 
</tr> 
<tr> 
<td>5</td> 
<td>编辑</td> 
<td>任务标题:阿斯卡是大家啊</td> 
<td>Firefox</td> 
<td>2012-07-15</td> 
<td>2012-08-15</td> 
<td>32</td> 
</tr> 
</tbody> 
</table> 
</div> 
</div> 
<script> 
(function(){ //fixed table header ,还可以封装一下做成类 
var leftScrollPanel = $("#left-scroll-panel"); 
var ganntBody = $("#gannt_grid>tbody"); 
var fixedThead = leftScrollPanel.prev(".fixed-header-tb"); 
if(!fixedThead.length){ 
fixedThead = $('<table class="fixed-header-tb"></table>'); 
fixedThead.append(ganntBody.prev()); 
leftScrollPanel.before(fixedThead); 
}else{ 
//do not create table head again when gannt body repaint, 
//because it is not created in function render 
ganntBody.prev().remove(); 
} 
var tds = ganntBody.find("tr:first>td"); 
var ths = fixedThead.find("th"); 
var thWidth; 
$.each(tds,function(index,td){ 
//jq width() or css('width') may has 1px disparity, use attr width 
thWidth = ths.eq(index).attr("width"); 
(thWidth!=undefined) && $(td).attr("width",thWidth); 
}); 
})(); 
(function(){//table header resize 
var sideOffset = { 
left:null, 
right:null, 
td:null, 
tdLocked:null, 
tdLeft:null, 
tdRight:null 
}; 
var pos = { 
resizedTime:0, 
beginPos:0 
}; 
var tableHead = $(".fixed-header-tb").find("tr:first"); 
var headCellTagName = "th"; 
var bodyHead = $("#gannt_grid>tbody").find("tr:first"); 
var minInterVal = 0; 
var minWidth = 30; 
var borderBeside = 5; 
var notResizeCells = [0,1,6]; 
var freeCells = [2]; 
var forceSize = false; 
var resizeAllow = false; 
var resizing = false; 
var forbiddenResize = function(){ 
var frag = false; 
var o = sideOffset; 
var index = o.td.index(); 
if($.inArray(index,notResizeCells)>-1){ 
frag = true; 
}else if((index==0||$.inArray(index-1,notResizeCells)>-1)&&o.left<=borderBeside){ 
frag = true; 
}else if((index==o.td.siblings().length||$.inArray(index+1,notResizeCells)>-1)&&o.right<=borderBeside){ 
frag = true; 
}else if(o.left>borderBeside&&o.right>borderBeside){ 
frag = true; 
} 
return frag; 
}; 
var stopResize = function(){ 
if(!resizing){return ;} 
resizing = false; 
resizeAllow = false; 
sideOffset = { 
left:null, 
right:null, 
td:null, 
tdLocked:null, 
tdLeft:null, 
tdRight:null 
}; 
}; 
var isFreeCell = function(td){ 
return forceSize==false && $.inArray(td.index(),freeCells)!=-1; 
}; 
tableHead.bind({ 
mousemove:function(e){ 
var th = $(e.target).closest(headCellTagName); 
if(!th.length){ 
return; 
} 
if(!resizing){ 
sideOffset.td = th; 
sideOffset.left = e.pageX - th.offset().left; 
sideOffset.right = th.width()-(e.pageX-th.offset().left); 
if(forbiddenResize()){ 
resizeAllow = false; 
sideOffset.td.css("cursor","default"); 
}else{ 
resizeAllow = true; 
sideOffset.td.css("cursor","e-resize"); 
pos.resizedTime = new Date()*1; 
pos.beginPos = e.pageX; 
} 
return; 
} 
if(sideOffset.tdLocked){ 
th = sideOffset.tdLocked; 
} 
if(new Date()-pos.resizedTime<minInterVal){ 
return; 
}else{ 
pos.resizedTime = new Date()*1; 
} 
var offset = (e.pageX-pos.beginPos); 
if(!offset){ 
return; 
}else{ 
pos.beginPos = e.pageX; 
} 
var leftWidth = sideOffset.tdLeft.width(); 
var rightWidth = sideOffset.tdRight.width(); 
if(offset<0&&leftWidth==minWidth){ 
return; 
}else if(offset>0&&rightWidth==minWidth){ 
return; 
} 
var fixedLWidth,fixedRWidth; 
if(leftWidth-Math.abs(offset)<minWidth&&offset<0){ 
fixedLWidth = minWidth; 
fixedRWidth = rightWidth - (minWidth-leftWidth); 
}else if(rightWidth-offset<minWidth&&offset>0){ 
fixedRWidth = minWidth; 
fixedLWidth = leftWidth - (minWidth-rightWidth); 
}else{ 
fixedLWidth = leftWidth+offset; 
fixedRWidth = rightWidth-offset; 
} 
var adjustCells = [ 
{cell:sideOffset.tdLeft,width:fixedLWidth}, 
{cell:sideOffset.tdRight,width:fixedRWidth} 
]; 
if(offset<0){ 
adjustCells = adjustCells.reverse(); 
} 
var inOneTable = bodyHead.parents("table:first").get(0)==tableHead.parents("table:first").get(0); 
$.each(adjustCells,function(i,cellConf){ 
if(isFreeCell(cellConf.cell)){return;} 
cellConf.cell.attr("width",cellConf.width); 
if(!inOneTable){ 
bodyHead.children().eq(cellConf.cell.index()).attr("width",cellConf.width); 
} 
}); 
}, 
mousedown:function(){ 
if(!resizeAllow){ 
return; 
} 
sideOffset.tdLocked = sideOffset.td; 
if(sideOffset.left<=5){ 
sideOffset.tdRight = sideOffset.td; 
sideOffset.tdLeft = sideOffset.td.prev(); 
}else{ 
sideOffset.tdRight = sideOffset.td.next(); 
sideOffset.tdLeft = sideOffset.td; 
} 
resizing = true; 
return false; 
} 
}); 
$(document).bind("mouseup",stopResize); 
})(); 
</script> 
</body> 
</html>
Javascript 相关文章推荐
JS Timing
Apr 21 Javascript
关于二级域名下使用一级域名下的COOKIE的问题
Nov 07 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
Feb 17 Javascript
详解Angular开发中的登陆与身份验证
Jul 27 Javascript
JavaScript基于对象去除数组重复项的方法
Oct 09 Javascript
关于json字符串与实体之间的严格验证代码
Nov 10 Javascript
JS获取当前地理位置的方法
Oct 25 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
Oct 10 Javascript
vue自定义指令实现方法详解
Feb 11 Javascript
基于Vue的商品主图放大镜方案详解
Sep 19 Javascript
使用vscode快速建立vue模板过程详解
Oct 10 Javascript
Vue事件处理原理及过程详解
Mar 11 Javascript
JS编程小常识很有用
Nov 26 #Javascript
javascript:history.go()和History.back()的区别及应用
Nov 25 #Javascript
js实现拖拽 闭包函数详细介绍
Nov 25 #Javascript
jquery miniui 教程 表格控件 合并单元格应用
Nov 25 #Javascript
JavaScript mapreduce工作原理简析
Nov 25 #Javascript
jquery div 居中技巧应用介绍
Nov 24 #Javascript
js实现在文本框光标处添加字符的方法介绍
Nov 24 #Javascript
You might like
用PHP程序实现支持页面后退的两种方法
2008/06/30 PHP
php print EOF实现方法
2009/05/21 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
PHP实现对数组分页处理实例详解
2017/02/07 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
javascript 兼容FF的onmouseenter和onmouseleave的代码
2008/07/19 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
2011/12/11 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
jQuery CSS()方法改变现有的CSS样式
2014/08/20 Javascript
JavaScript设计模式之代理模式介绍
2014/12/28 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
2017/03/01 Javascript
JS执行控制之节流模式实例分析
2018/12/21 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
[53:50]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
python uuid模块使用实例
2015/04/08 Python
详解Python的Django框架中的templates设置
2015/05/11 Python
Python中返回字典键的值的values()方法使用
2015/05/22 Python
整理Python 常用string函数(收藏)
2016/05/30 Python
基于Python pip用国内镜像下载的方法
2018/06/12 Python
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
对python requests的content和text方法的区别详解
2018/10/11 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
解决TensorFlow模型恢复报错的问题
2020/02/06 Python
Python使用Chrome插件实现爬虫过程图解
2020/06/09 Python
微软加拿大官方网站:Microsoft Canada
2019/04/28 全球购物
Jar包的作用是什么
2014/03/30 面试题
中专生自我鉴定书范文
2013/12/28 职场文书
工作时间调整通知
2015/04/24 职场文书
一篇文章看懂MySQL主从复制与读写分离
2021/11/07 MySQL