给表格的TBody加上滚动条

  在表格中,不需要分页但需要滚动TBody的场合蛮多的,以前做过一个通过两个表格来实现:用JQuery实现Fix表头表格 ,今天突然想到,可以单独做一个滚动条,让滚动条的位置变化时,只显示TBody中指定范围的TR来实现滚动,便有了下面的实现,可以在IE/FF下运行,在滚动条上滚动鼠标轮时可以实现TBody滚动。这是一个思路,希望能抛砖引玉。

  先看下效果图:

  代码实现:(马上就不能上网了,注释可以没有呀)

复制代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
    
<title>Untitled</title>

    
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
    
<script type="text/javascript">
    $(
function(){
        
var table = $('table.scrolltable').each(function(){
            
var $table = $(this).css('border-collapse','collapse');
            
var $tbody = $table.find('tbody').eq(0);
            
var sbPosition = {left: $tbody.position().left + $tbody.outerWidth(), top: $tbody.position().top };
            
            
var $scrollbar = $('<div class="scrollbar"/>').css({'position':'absolute''overflow-y':'auto',left:sbPosition.left, top:sbPosition.top, height:'0px',width:'20px'})
                .append($(
'<div/>'))
                .appendTo($table.parent());
                
                
            $table.bind(
'rownum',function(event, newRowNum){
                
//先设置显示的行
                var nFirst = parseInt($tbody.attr('itemIndex'|| '0');
                $tbody.find(
'tr').hide();
                $tbody.find(
'tr').each(function(i){
                    
if( i >= nFirst && i < nFirst + newRowNum)
                    {
                        $(
this).show();
                    }
                    
else
                    {
                        $(
this).hide();
                    }
                });
                
                
var scrollHeight =  $tbody.find('tr').length  * $tbody.height() / newRowNum;
                
var $sb = $scrollbar;
                $sb.css(
'height',$tbody.height());
                $sb.find(
'div').eq(0).css('height',scrollHeight);
            });
            
            $scrollbar.scroll(
function(){
                $sb 
= $(this);
                
                
var nNewIndex = Math.floor($sb.scrollTop() / $sb.attr('scrollHeight'* $tbody.find('tr').length);
                
var nIndex = parseInt($tbody.attr('itemIndex'|| '0');
                
var rownum = parseInt($table.attr('rownum'|| '10');
                
if(nIndex != nNewIndex)
                {
                    $tbody.find(
'tr').each(function(i){
                        
if(i >= nNewIndex && i < nNewIndex + rownum)
                        {
                            $(
this).show();
                        }
                        
else
                        {
                            $(
this).hide();
                        }
                    });
                    $tbody.attr(
'itemIndex', nNewIndex); 
                }
                
                
            });
            
            $table.trigger(
'rownum',parseInt($table.attr('rownum')));
        });
    });
        
        
    
</script>
    
<style type="text/css">
        .scrollbar
        
{
            border
:solid 1px red;
        
}
        .scrolltable
        
{
        
}
    
</style>
</head>

<body>
    
<table class="scrolltable" border="1" rownum="10">
    
<thead>
        
<tr>
            
<th>aaa</th>
            
<th>bbb</th>
            
<th>ccc</th>
            
<th>ddd</th>
            
<th>eee</th>
            
<th>fff</th>
            
        
</tr>
    
</thead>
    
<tbody>
        
<tr>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
        
</tr>
        
<tr>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
        
</tr>
        
<tr>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
        
</tr>
        
<tr>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
        
</tr>
        
<tr>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
        
</tr>
        
<tr>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
        
</tr>
        
<tr>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
        
</tr>
        
<tr>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
        
</tr>
        
<tr>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
        
</tr>
        
<tr>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
        
</tr>
        
<tr>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
        
</tr>
        
<tr>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
        
</tr>
        
<tr>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
        
</tr>
        
<tr>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
        
</tr>
        
<tr>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
        
</tr>
        
<tr>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>END</td>
            
        
</tr>        <tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
        
</tr>
        
<tr>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
        
</tr>
        
<tr>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
        
</tr>
        
<tr>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
        
</tr>
        
<tr>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>END</td>
            
        
</tr>        <tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
        
</tr>
        
<tr>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
        
</tr>
        
<tr>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
        
</tr>
        
<tr>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
        
</tr>
        
<tr>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>END</td>
            
        
</tr>        <tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
        
</tr>
        
<tr>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
        
</tr>
        
<tr>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
        
</tr>
        
<tr>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
        
</tr>
        
<tr>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>END</td>
            
        
</tr>        <tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
        
</tr>
        
<tr>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
<td>111</td>
            
        
</tr>
        
<tr>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
<td>222</td>
            
        
</tr>
        
<tr>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
<td>333</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
        
</tr>
        
<tr>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
<td>555</td>
            
        
</tr>
        
<tr>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>444</td>
            
<td>END</td>
            
        
</tr>
    
</tbody>
    
<tfoot>
        
<td>444</td>
        
<td>444</td>
        
<td>444</td>
        
<td>444</td>
        
<td>444</td>
        
<td>END</td>
    
</tfoot>
        
    
</table>

</body>
</html>
复制代码
posted @   阿牛  阅读(15197)  评论(13编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言
点击右上角即可分享
微信分享提示