发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)

时间:2022-05-11 08:04:22

功能介绍:
    可以实现锁定表格的行和列的功能,效果和Excel里的冻结窗格类似,当然没有Excel那么强大了,只是类似。
   

问题:
    当一个table太大而导致在屏幕里显示不下的时候,IE会出现滚动条,但是这时候就不好看了,对用户的操作也不是很方便。于是我们就想给他加一个限制,在制定的范围内滚动。

如何实现呢?网上也有不少实现方法了,效果如何就不发表意见了,这里主要是想说一下我的思路。

思路:

1、其实思路很简单,div有一个“功能”,给他的style 加上  " CLEAR: none; OVERFLOW: auto; WIDTH: 100px; HEIGHT:100px" 后,div就会出现滚动条(当然要在div里的内容超出div设置的时候)。这样div里的table 就可滚动了。但是行和列也以一起跟着动了起来。

2、行和列如何“锁定”呢?这里我用了一个笨招,用三个div来分别放置行和列,以及行列交叉的地方。这样看起来就像是别锁定住了。

3、当然行和列并不是不动就可以了,也要根据div的滚动条的滚动作出变化(移动)才可以,这里就要使用js来帮忙了。



优点:

1、侵入性小。只需要在.aspx页面里加几个div,引用一个.js文件就可以了。其他的文件里的代码都不用修改。
2、适用范围比较广:针对生成的 <table> 标签,而不针对服务器控件,所以DataGrd、GridView、DataList等都可以使用,只要输出的是 table 形式的html代码就可以。

3、可以同时锁定行和列,行数和列数可以自定义。“锁定”效果好,不会出现“跳动”的现象。

缺点:

1、占用客户端的资源比较大,行数多的时候会有一点点慢。
2、不支持ff。

js的能力还是不够强,目前只能这样了,但这不是最终的结果,还是要更新升级的。发出来也是想请各路高手指点一二。

说了这么多了,可能大家还是没有看明白,不好意思,表达能力比较差。发代码看看吧,呵呵。

.aspx文件里面需要加的代码:

发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)< div  onscroll ="myScroll(this)"  id ="dMain"  style ="CLEAR: none; OVERFLOW: auto; WIDTH: 500px; HEIGHT: 150px" >
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)你的控件控件
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
</ div >
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
< div  id ="dTop"  style ="CLEAR: none; LEFT: 10px; OVERFLOW: hidden; WIDTH: 0px; POSITION: absolute; TOP: -10px; HEIGHT: 0px; BACKGROUND-COLOR: #ffffff" > 放置行 </ div >
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
< div  id ="dLeft"  style ="CLEAR: none; LEFT: 10px; OVERFLOW: hidden; WIDTH: 0px; POSITION: absolute; TOP: 10px; HEIGHT: 0px; BACKGROUND-COLOR: #ffffff" > 放置列 </ div >
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
< div  id ="dMid"  style ="CLEAR: none; LEFT: 10px; OVERFLOW: hidden; WIDTH: 0px; POSITION: absolute; TOP: 10px; HEIGHT: 0px; BACKGROUND-COLOR: #ffffff" ></ div >

js 文件里的代码:
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)function  myLoad()
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
{
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
if (document.getElementById("dMain"))
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)        divInit();
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)        
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)}
    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
function  myResize()
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
{
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
if (document.getElementById("dMain"))
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
{
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)        divInit();
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    }

发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)}

发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
function  divInit()
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
{
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
var dMain = document.getElementById("dMain");        //主Div
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    var dTop = document.getElementById("dTop");            //锁定行的Div
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    var dLeft = document.getElementById("dLeft");        //锁定列的Div
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    var dMid = document.getElementById("dMid");            //左上角的Div
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
var windowWidth = document.body.scrollWidth;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
var windowHeight = document.body.clientHeight;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
//alert(windowWidth);
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dMain.style.background
="#ffffff";
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
//alert(windowHeight);
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    dMain.style.width = windowWidth - 12;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
//修正
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    var sch = document.getElementById("div_Search");
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
//alert(sch.scrollHeight);
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    if (sch.style.display == "")
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
{
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)        dMain.style.height 
= windowHeight - 100 - sch.scrollHeight;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    }

发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
else
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
{
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)        dMain.style.height 
= windowHeight - 120;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    }
    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
//dMain.style.display = "none";
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
//寻找Top 和 Left
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    var tt = dMain;            //    寻找左上角的坐标,代码来自梅花雪的日期控件
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
var th = tt;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
var ttop  = tt.offsetTop;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
var thei  = tt.clientHeight;  
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
var tleft = tt.offsetLeft;  
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
var ttyp  = tt.type;        
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
while (tt = tt.offsetParent){ttop+=tt.offsetTop; tleft+=tt.offsetLeft;}
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
var myTop  = (ttyp=="image")? ttop+thei : ttop+thei+6;    //左上角的坐标
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    var myLeft = tleft;                                        //左上角的坐标
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    //===================================寻找完毕===============
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    hh 
= dMain.style.height;            //修正
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    hh = hh.replace("px","");
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    myTop 
= myTop - hh + 12;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
var dg = document.getElementById("DG");        //显示数据的表格
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
var RowsCount = "1";    //锁定行数
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    var LineCount = "1";    //锁定列数
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
//锁定行的高度
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    var RowsHeight = dg.rows[RowsCount].cells[0].offsetTop - dg.rows[0].cells[0].offsetTop + 2
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
//锁定列的宽度
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    var LineWidth =  dg.rows[0].cells[LineCount].offsetLeft - dg.rows[0].cells[0].offsetLeft + 2
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
//锁定列的高度
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    var LineHeight = dMain.style.height;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    LineHeight 
= LineHeight.replace("px","");
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
//锁定行的宽度
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    var RowsWidth = dMain.style.width;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    RowsWidth 
= RowsWidth.replace("px","");
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
//hh = parseint(hh);
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
//赋值
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    divResize(dMain,dTop,dLeft,dMid);
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
if (RowsHeight <25)
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)        RowsHeight 
= 25;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
if (LineWidth <20)
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)        LineWidth 
= 20;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)        
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dTop.style.width 
= RowsWidth - 16;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dTop.style.height 
= RowsHeight;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dLeft.style.width 
= LineWidth;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dLeft.style.height 
= LineHeight - 16;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dMid.style.width 
= LineWidth ;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dMid.style.height 
= RowsHeight;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
//设置左上角的位置
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    dTop.style.top = myTop ;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dTop.style.left 
= myLeft ;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dLeft.style.top 
= myTop;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dLeft.style.left 
= myLeft;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dMid.style.top 
= myTop;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dMid.style.left 
= myLeft;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)}

发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
function  divResize(dMain,dTop,dLeft,dMid)
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
{
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dTop.innerHTML 
= dMain.innerHTML;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dMid.innerHTML 
= dMain.innerHTML;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dLeft.innerHTML 
=  dMain.innerHTML;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dLeft 
= dMain;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)}

发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
function  divResize2(dMain,dLeft)
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
{
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dLeft.innerHTML 
= dMain.innerHTML;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)}

发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
function  myScroll(me)
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
{
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
var dTop = document.getElementById("dTop");
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
var dLeft = document.getElementById("dLeft");
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
var dMid = document.getElementById("dMid");            //左上角的Div
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)

发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dTop.scrollLeft 
= me.scrollLeft;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    dLeft.scrollTop 
= me.scrollTop;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)    
//dMid.scrollLeft = me.scrollLeft;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
    //dMid.scrollTop = me.scrollTop;
发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
}

代码比较乱,最近打算简化一下代码,换一个更高效的方式。