带有固定标题的HTML表格?

是否有一个跨浏览器的CSS / JavaScript技术来显示一个长的HTML表格,以便列标题保持固定在屏幕上,并且不随表格主体滚动。 想想Microsoft Excel中的“冻结窗格”效果。

我希望能够滚动浏览表格的内容,但始终能够看到顶部的列标题。


我一直在寻找一个解决方案,并发现大多数答案不工作或不适合我的情况,所以我写了一个简单的解决方案与jQuery。

这是解决方案大纲。

  • 克隆需要具有固定标题的表格,并将克隆副本放在原始顶部
  • 从桌子上取下桌子
  • 从底部表格中删除表格标题
  • 调整列宽。 (我们记得原始的列宽度)
  • 下面是代码。 这里是演示固定头文件演示

    <head>
        <script   
       src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js">
        </script>
        <script>
    
        function scrolify(tblAsJQueryObject, height){
            var oTbl = tblAsJQueryObject;
    
            // for very large tables you can remove the four lines below
            // and wrap the table with <div> in the mark-up and assign
            // height and overflow property  
            var oTblDiv = $("<div/>");
            oTblDiv.css('height', height);
            oTblDiv.css('overflow','scroll');               
            oTbl.wrap(oTblDiv);
    
            // save original width
            oTbl.attr("data-item-original-width", oTbl.width());
            oTbl.find('thead tr td').each(function(){
                $(this).attr("data-item-original-width",$(this).width());
            }); 
            oTbl.find('tbody tr:eq(0) td').each(function(){
                $(this).attr("data-item-original-width",$(this).width());
            });                 
    
    
            // clone the original table
            var newTbl = oTbl.clone();
    
            // remove table header from original table
            oTbl.find('thead tr').remove();                 
            // remove table body from new table
            newTbl.find('tbody tr').remove();   
    
            oTbl.parent().parent().prepend(newTbl);
            newTbl.wrap("<div/>");
    
            // replace ORIGINAL COLUMN width                
            newTbl.width(newTbl.attr('data-item-original-width'));
            newTbl.find('thead tr td').each(function(){
                $(this).width($(this).attr("data-item-original-width"));
            });     
            oTbl.width(oTbl.attr('data-item-original-width'));      
            oTbl.find('tbody tr:eq(0) td').each(function(){
                $(this).width($(this).attr("data-item-original-width"));
            });                 
        }
    
        $(document).ready(function(){
            scrolify($('#tblNeedsScrolling'), 160); // 160 is height
        });
    
    
        </script>
    
    
    </head>
    
    <body>
        <div style="width:300px;border:6px green solid;">
            <table border="1" width="100%" id="tblNeedsScrolling">
                <thead>
                    <tr><th>Header 1</th><th>Header 2</th></tr>
                </thead>
                <tbody>
                    <tr><td>row 1, cell 1</td><td>row 1, cell 2</td></tr>
                    <tr><td>row 2, cell 1</td><td>row 2, cell 2</td></tr>
                    <tr><td>row 3, cell 1</td><td>row 3, cell 2</td></tr>
                    <tr><td>row 4, cell 1</td><td>row 4, cell 2</td></tr>           
                    <tr><td>row 5, cell 1</td><td>row 5, cell 2</td></tr>
                    <tr><td>row 6, cell 1</td><td>row 6, cell 2</td></tr>
                    <tr><td>row 7, cell 1</td><td>row 7, cell 2</td></tr>
                    <tr><td>row 8, cell 1</td><td>row 8, cell 2</td></tr>           
                </tbody>
            </table>
        </div>
    
    </body>
    

    这个解决方案在Chrome&IE中工作。 因为这是基于jquery,所以它也应该在其他jQuery支持的浏览器中工作。


    这可以用四行代码干净地解决。

    如果您只关心现代浏览器,那么通过使用CSS转换可以使固定标题变得更容易。 听起来很奇怪,但效果很好:

  • HTML和CSS保持原样。
  • 没有外部的JS依赖。
  • 4行代码。
  • 适用于所有配置(表格布局:固定等)。
  • document.getElementById("wrap").addEventListener("scroll", function(){
       var translate = "translate(0,"+this.scrollTop+"px)";
       this.querySelector("thead").style.transform = translate;
    });
    

    除了IE8之外,对CSS转换的支持已经广泛可用。 以下是供参考的完整示例:

    document.getElementById("wrap").addEventListener("scroll",function(){
       var translate = "translate(0,"+this.scrollTop+"px)";
       this.querySelector("thead").style.transform = translate;
    });
    /* your existing container */
    #wrap {
        overflow: auto;
        height: 400px;
    }
    
    /* css for demo */
    td {
        background-color: green;
        width: 200px;
        height: 100px;
    }
    <div id="wrap">
        <table>
            <thead>
                <tr>
                    <th>Foo</th>
                    <th>Bar</th>
                </tr>
            </thead>
            <tbody>
                <tr><td></td><td></td></tr>
                <tr><td></td><td></td></tr>
                <tr><td></td><td></td></tr>
                <tr><td></td><td></td></tr>
                <tr><td></td><td></td></tr>
                <tr><td></td><td></td></tr>
                <tr><td></td><td></td></tr>
                <tr><td></td><td></td></tr>
                <tr><td></td><td></td></tr>
                <tr><td></td><td></td></tr>
                <tr><td></td><td></td></tr>
                <tr><td></td><td></td></tr>
            </tbody>
        </table>
    </div>

    我刚刚完成了一个jQuery插件,它将使用有效的HTML使用有效的单表(必须有一个thead和tbody),并将输出一个具有固定标题的表格,可选的固定页脚,可以是克隆的标题或任何你选择的内容(分页等)。 如果你想利用更大的显示器,当浏览器调整大小时,它也会调整表格的大小。 如果表格栏不能全部放在视图中,另一个附加功能是可以侧向滚动。

    http://fixedheadertable.com/

    在github上:http://markmalek.github.com/Fixed-Header-Table/

    这是非常容易设置,你可以创建自己的自定义样式。 它也在所有浏览器中使用圆角。 请记住我刚刚发布了它,所以它在技术上仍然是测试版,并且我正在消除的小问题很少。

    它适用于Internet Explorer 7,Internet Explorer 8,Safari,Firefox和Chrome。

    链接地址: http://www.djcxy.com/p/51755.html

    上一篇: HTML table with fixed headers?

    下一篇: Why does Haskell contain so many equivalent functions