随笔-1  评论-44  文章-3  trackbacks-0
      发一个原创的表格列向拖动的代码。
      其实这个代码写了1年多了,最初写的是一个动态拖动的,就是鼠标移动的同时列宽跟着改变,可是那种在有些机器性能差的机器上跑起来很吃力(javascript效率不高我也没办法啊)。后来就索性改成了现在这种。代码不复杂,就是对鼠标的的定位,把鼠标的位移量得到后,对表格的列宽进行改变。由于时间仓促,肯定有很多不足,大家有兴趣的可以帮忙改改
      代码如下,复制后保存成*.htm即可:
      
<HTML><HEAD><TITLE>信息列表</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
</head>
<style>
.aline{
 position:absolute;
 width:1px;
 height:100px;
 background-color:#000000;
}
.headdiv{
 width:100%;
 cursor:default;
 height:100%;
 white-space:nowrap;
 text-align:center;
 text-valign="middle";
}
tr{
 background: window;
}
td{
 color: windowtext; font: menu; padding: 1px; padding-left: 5px; padding-right: 5px;
 border-top: 1px solid buttonhighlight;
 border-left: 1px solid buttonhighlight;
 border-right: 1px solid buttonshadow;
 border-bottom: 1px solid buttonshadow;
}
table{
 BORDER-COLLAPSE: collapse;
 border-top: 1px solid buttonshadow;
 border-left: 1px solid buttonshadow;
}
thead td{
 background: buttonface;
 font: menu;
 border: 1px outset white;
 cursor: default;
 padding:0 3 0 0;
 border-top: 1px solid buttonhighlight;
 border-left: 1px solid buttonhighlight;
 border-right: 1px solid buttonshadow;
 border-bottom: 1px solid buttonshadow;
 height:16px;
}
</style>
<script language="javascript">
/**
* 动态改变列宽度的代码
* 作者:黑旋风(QQ:23929003 EMAIL:lewclear97@163.com)
* 版权没有,随便拷贝、修改,不过希望大家能把改后的代码发给我一份,互相学习,谢谢
*/
var ListTitleTdStartX=null;//记录鼠标按下时的X坐标
var ListTitleTdStartWidth=0;//记录所在td在鼠标按下时的宽度
var ListTableStartWidth=0;//记录整个table的宽度
var MouseIsDown=false;//表示是否处于鼠标按下状态
var ListTableResizeTd=null;//记录所操作的td对象
var ListResizeLine=null;
/**
*鼠标按下时触发的事件
*其作用主要是记录所需部件的初始值
*/
function MouseDownResizeTd(obj){
  if(event.srcElement.id!="resizehead"){
   return;
  }
  allleft=event.srcElement.offsetLeft+obj.parentElement.parentElement.parentElement.offsetLeft;
  if(setOperatorTd(obj,allleft)){//设置操作的td
   ListResizeDiv=ListTableResizeTd.parentElement.parentElement.parentElement;//外层div
   ListTitleTdStartX=event.x;  //记录初始值
   ListTitleTdStartWidth=parseInt(obj.clientWidth);
   ListTableStartWidth=parseInt(ListTableResizeTd.parentElement.parentElement.parentElement.clientWidth)
   MouseIsDown=true;
   ListResizeLine=document.createElement("div");
   ListResizeLine.className='aline';
   document.body.appendChild(ListResizeLine);
   ListResizeLine.style.height=ListResizeDiv.offsetHeight
   ListResizeLine.style.left=document.body.scrollLeft+event.x-2;
   ListResizeLine.style.top=ListResizeDiv.offsetTop;
   ListTableResizeTd.setCapture();
  }
}
/**
* 判断哪个才是所要操作的td
* 成功获得返回true,否则返回false
*/
function setOperatorTd(obj,allleft){
 if(event.x-allleft<3){//如果按到的是下一个td
    tableobj=obj.parentElement.parentElement.parentElement;
    for(var i=0;i<tableobj.rows.length;i++){    
     if(tableobj.rows[0].cells[i]==obj){
      if(i==0)return false;
      ListTableResizeTd=tableobj.rows[0].cells[i-1];
      return true;
     }
    }
  }else{
   ListTableResizeTd=obj;
   return true;
  }
}
/**
*双击设置最合适宽度
*/
function setMinWidthForTd(){
 ListTableResizeTd.style.width='20px'
}
/**
*鼠标松开将一切参数还原
*/
function document.onmouseup(){
  if(MouseIsDown){
  width=event.x-ListTitleTdStartX;
  if(Math.abs(width)>2&&width+ListTitleTdStartWidth>0){
   ListTableResizeTd.style.width=ListTitleTdStartWidth+width;
   //ListTableResizeTd.parentElement.parentElement.style.width=ListTableStartWidth+width;
  }
  //参数全部还原
  ListTitleTdStartX=null;
  ListTitleTdStartWidth=0;
  ListTableStartWidth=0;
   MouseIsDown=false;
   document.body.removeChild(ListResizeLine);
 }
 if(ListTableResizeTd!=null){
   ListTableResizeTd.releaseCapture();
 }
}
/*
*鼠标移动时改变td及所在table的宽度
*/
function document.onmousemove(){
 if(MouseIsDown){
  ListResizeLine.style.left=document.body.scrollLeft+event.x-2;
 }
}
</script>
<BODY>
 <table border=1 cellpadding="0" cellspacing="0" onselectstart="return false;" >
  <thead>
   <tr id="testtr">
     <Td id="resizehead" style="width:20px;cursor:col-resize;overflow:none;" ondblclick="setMinWidthForTd()" onmousedown="MouseDownResizeTd(this)"><div class="headdiv">姓名</div></td>
     <Td id="resizehead" style="cursor:col-resize;" ondblclick="setMinWidthForTd()" onmousedown="MouseDownResizeTd(this)"><div class="headdiv">性别</div></td>
     <Td id="resizehead" style="cursor:col-resize;" ondblclick="setMinWidthForTd()" onmousedown="MouseDownResizeTd(this)"><div class="headdiv">电话</div></td>
     <Td id="resizehead" style="cursor:col-resize;" ondblclick="setMinWidthForTd()" onmousedown="MouseDownResizeTd(this)"><div class="headdiv">住址</div></td>
     <Td id="resizehead" style="cursor:col-resize;" ondblclick="setMinWidthForTd()" onmousedown="MouseDownResizeTd(this)"><div class="headdiv">政治面貌</div></td>
     <Td id="resizehead" style="cursor:col-resize;" ondblclick="setMinWidthForTd()" onmousedown="MouseDownResizeTd(this)"><div class="headdiv">学历</div></td>
     <Td id="resizehead" style="cursor:col-resize;" ondblclick="setMinWidthForTd()" onmousedown="MouseDownResizeTd(this)"><div class="headdiv">备注</div></td>
   </tr>
 </thead>
   <script language="javascript">
    for(i=0;i<10;i++){
   var html=' <tr id="testtr">';
      html+='<Td>人员'+i+'</td>';
      html+='<Td>男</td>';
      html+='<Td>45345</td>';
      html+='<td>asdfasfasfasfasdf</td>';
      html+='<td>sffdfgdgd</td>';
    html+='<td>sfdgdfgdfg</td>';
      html+='<td>asdfasfasfasfasdfdfgdfg</td>';
     html+='</tr> ';
     document.write(html);
    }
   </script>
 </table>
  </BODY>
</HTML>
posted on 2006-08-10 10:58 黑旋风 阅读(2744) 评论(5)  编辑  收藏

评论:
# re: 表格列宽鼠标拖动 2006-09-18 09:24 | 陈朋奕.
黑旋风就是你?好东西,收下了。  回复  更多评论
  
# re: 表格列宽鼠标拖动 2006-09-18 09:35 | 黑旋风
@陈朋奕.
哦?你认识我吗?叫黑旋风的人不少哦!不知我傍了哪个大侠的威名....(偷笑ing....)  回复  更多评论
  
# re: 表格列宽鼠标拖动 2006-10-31 15:06 | bsc2xp
非常好,能否扩展一下表头固定效果?  回复  更多评论
  
# re: 表格列宽鼠标拖动 2006-10-31 17:33 | bsc2xp
拖动列改变宽度有bug。经常不是鼠标所触发的位置。  回复  更多评论
  
# re: 表格列宽鼠标拖动 2007-09-04 10:10 | yyy1121
好东西收藏了  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: