发现公司里的所有分页功能都是通过display:talbe来实现的,但是用户最近说要让表格列宽可以拖动;所有我就寻找了好多的办法;网上找了很多的资料,但是都不是我要的效果因为他们都是列宽不改变要不就是我看不懂!

我模仿网上的核心代码来自己写了一个;因为我们知道display:table标签最后再页面展示的还是table表格所以我就在页面的最后面来更改table的样式:

思路:
1,捕获鼠标移动到表格竖线上时候改变鼠标样式:
2.   在改变样式的区域里,按下鼠标就会生成辅助线来拖动;同时设置单元格最小宽度为8px
3.  改变表头单元格宽度,改变表格宽度
我做了一个用Myeclipse开发的index.jsp页面:
工程源码下载




function TableAuto(divId){
var cellIndex=-1; //记录所作用的列索引
var preWidth=0; //记录列的原宽
var preX=0; //记录鼠标的原屏幕x坐标
var preLeft=0; //记录辅助线的初始位置
var currentTitleCell=null; //当前改变列宽的列的标题单元格
var doTitleCellClick=null; //用于暂存标题行click响应行数
var table = null;//表格对象
var titleCells = null;//获取标题行 //辅助线对象
var scale = document.createElement("div");
scale.style.cssText="border-left:dotted 1px #000;z-index:101;position:absolute;left:-1;width:0;";
document.body.appendChild(scale); //函数:计算元素的绝对位置
function getAbsPos(e){
var rect = e.getBoundingClientRect()
var body = document.body;
return { left:rect.left+body.scrollLeft,top:(rect.top+body.scrollTop) };
} //函数:改变列宽 (响应辅助线的 onmousemove 事件)
function changeColWidth(){
var evt = arguments.length==0 ? event : arguments[0];
var newX = evt.screenX;
var newWidth = preWidth+newX-preX;
if(newWidth<8) newWidth=8;
else scale.style.left=preLeft+newX-preX;
}
//函数:改变列宽 (响应辅助线 onmouseup 事件)
function changeColWidthStop(){
scale.releaseCapture();
scale.onmousemove = null;
scale.onmouseup = null;
scale.style.left=-1;
var evt = arguments.length==0 ? event : arguments[0];
var newX = evt.screenX;//鼠标现在坐标
var mLong = newX-preX;//鼠标移动距离
var tdNewWidth = mLong+preWidth;//调整后单元格宽度
if(tdNewWidth<8) tdNewWidth=8;
var tableNewWidth=eval($('#'+divId).width()-preWidth+tdNewWidth);//表格宽度=原始宽度表格宽度-单元格原始宽度+单元格现在宽度
var trs = table.getElementsByTagName("tr");
$('#'+divId).width(tableNewWidth);//调整表格宽度
//for ( var j = 0; j < trs.length; j++) {//调整列宽
trs[0].cells[cellIndex].width =tdNewWidth;
//} }
//函数:改变列宽 (响应标题行单元格的 onmousedown 事件)
function doMouseDown(){
var evt = arguments.length==0 ? event : arguments[0];
preX = evt.screenX;
var pos = getAbsPos(this);
preLeft = pos.left+this.offsetWidth;
scale.style.left=preLeft-2;
scale.style.top = pos.top-2;
scale.style.height=table.offsetHeight-4; scale.setCapture();
scale.onmousemove = changeColWidth;
scale.onmouseup = changeColWidthStop;
cellIndex = this.cellIndex;
preWidth = this.offsetWidth; }
//函数:响应标题单元格 mousemove 事件
function doTitleCellMousemove(){
var evt = arguments.length==0 ? event : arguments[0];
if(this.offsetWidth-evt.offsetX<10){//单元格的宽-鼠标在单元格的水平坐标
this.style.cursor="col-resize";
this.onmousedown=doMouseDown;
}else{
this.style.cursor="";
this.onmousedown=null;
}
}
//添加控制元素的代码
function applyCtrl(tableId){
table = document.getElementById(tableId);//获取表格
table.getElementsByTagName("tr")[0].className="scrollColThead";
//获取标题行
titleCells = table.getElementsByTagName("tr")[0].cells;
//给每个标题行单元格绑顶 onmousemoce 事件处理函数
for(var i=1;i<titleCells.length;i++){
titleCells[i].onmousemove=doTitleCellMousemove;
}
}
//此处为表格添加控制元素。
applyCtrl(divId); }


有不清楚的很愿意与大家交流:ydcun@163.com

display:table标签来自动改变列宽 改变的同时table的整体宽度跟随变化的更多相关文章

  1. Qt5 QTableWidget设置列表自动适应列宽

    //设置自动适应列宽 ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

  2. JS可改变列宽table

    <!DOCTYPE HTML> <html> <head> <meta charset="gbk"> <title>ta ...

  3. DataGridView使用技巧五:自动设定列宽和行高

    一.设定行高和列宽自动调整 设定包括Header和所有单元格的列宽自动调整 //设置包括Header和所有单元格的列宽自动调整 this.dgv_PropDemo.AutoSizeColumnsMod ...

  4. Bootstrap Blazor 组件介绍 Table (一)自动生成列功能介绍

    Bootstrap Blazor 是一套企业级 UI 组件库,适配移动端支持各种主流浏览器,已经在多个交付项目中使用.通过本套组件可以大大缩短开发周期,节约开发成本.目前已经开发.封装了 70 多个组 ...

  5. Bootstrap Table列宽拖动的方法

    在之前做过的一个web项目中,前端表格是基于jQuery和Bootstrap Table实现的,要求能利用拖动改变列宽,现将实现的过程记录如下: 1. Bootstrap Table可拖动,需要用到它 ...

  6. 动态改变EasyUI grid 列宽和隐藏列

    隐藏显示 $('#yourGrid').datagrid('hideColumn','yourColumn'); $('#yourGrid').datagrid('hideColumn','yourC ...

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

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

  8. jquery实现表格可变列宽插件开发

    工作中用到了表格的可变列宽,网上看了下,自己也实现了一个,整理贴记录. 测试环境chrome,ie8,firefox jquery版本1.8.2 原理:监听table第一行的mousemove事件,当 ...

  9. table标签用法

    <table>标签 HTML中表格由 <table> 标签来定义. 每个表格均有若干行(由 <tr> 标签定义),每行被分割为若干单元格(由 <td> ...

随机推荐

  1. java泛型问题 关于警告:XX is a raw type

    (本文例子适用于JDK 5.0, 学习请先安装并配置!!!)         我们从一个简单的例子开始:假设我们现在需要一个专用来存储字符串的List,该如何实现?呵呵,这还不简单,且看如下代码:   ...

  2. mysql数据类型整理

    mysql 中数据类型主要有三种 文本.数字 ,日期/时间 文本类型:char 定长,varchar变长,都是最多65535,char多了会截取,varchar少了自动补长.text最多65535,b ...

  3. jquery 选择器之children与find

    children()和find() 两个用于向下遍历 DOM 树的 jQuery 方法 children() 方法返回被选元素的所有直接子元素. find() 方法返回被选元素的后代元素,一路向下直到 ...

  4. php中禁止非法调用和硬路径引入文件的方法

    php中禁止非法调用和硬路径引入文件的方法 在php中有一些公共的文件为了方便,我们会做一个公共文件,让不用的文件共同调用.为了禁止公共文件被非常单独调用,可以在文件上做一个常量,禁止非常调用:在公共 ...

  5. Nginx+PostgreSQL+Django+UWSGI搭建

    最近因为项目上的需要开始大量使用nginx,因此也想趁机将以前常用的django+apache的架构换成django+nginx.常见的 django webapp 部署方式采用FCGI 或 WSGI ...

  6. 深入学习PE文件(转)

    PE文件是Win32的原生文件格式.每一个Win32可执行文件都遵循PE文件格式.对PE文件格式的了解可以加深你对Win32系统的深入理解. 一. 基本结构. 上图便是PE文件的基本结构.(注意:DO ...

  7. Oracle系列:记录Record

    Oracle系列:记录Record   分类: [Oracle] (15) 版权声明:本文为博主原创文章,未经博主允许不得转载. Oracle系列:记录(Record) 一,什么是记录(Record) ...

  8. JDBC笔记

    简介 JDBC是Java规定的访问数据库的API,目前主流的数据库都支持JDBC.使用JDBC访问不同的数据库时需要安装不同的驱动. JDBC定义了数据库的链接,SQL语句的执行以及查询结果集的遍历等 ...

  9. USB OTG ID 检测原理

    OTG 检测的原理是: USB OTG标准在完全兼容USB2.0标准的基础上,增添了电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG).USB OTG技术可实现没有主机时 ...

  10. Delphi中的Rtti函数

    TTypeKind,类型类别,tkclass,tkinteger,tkstring等.类,属性都是一种类型. ttypedata,是一个record包括ttypekind.是一个类的描述.TTypeK ...