zoukankan      html  css  js  c++  java
  • 表头固定的前提下表格添加纵向滚动条

      有时候在不分页且数据多的时候就需要滚动条,或者说是下拉加载的时候也需要滚动条,但是希望在滚动的时候数据的表头固定便于理解表体。

    1. 第一种,在tbody元素上进行滚动

      这种方式有个缺陷就是所有的单元格的宽度一样,平分整个tr的宽度,不会根绝内容自适应宽度。

    如下:

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="UTF-8">
            <title></title>
            <style>
                table {
                    border-collapse: collapse;
                    width: 100%;
                    text-align: left;
                    border:1px solid #000;
                }
                td,th{
                    border:1px solid #000;
                }
                
                tbody{
                    display: block;
                    overflow-x: hidden;
                    overflow-y: auto;
                    height: 100px;
                }
                thead,tbody tr{
                    display: table;
                    width: 100%;
                    table-layout: fixed;
                    word-break: break-all;
                }
                table thead{
                    width: calc(100% - 17px);
                }
            </style>
        </head>
    
        <body>
            <div style="height: 250px;"></div>
            <div style="height: 250px;"></div>
            <table cellspacing="0" cellpadding="0">
                <thead>
                    <th>表头1</th>
                    <th>表头2</th>
                    <th>表头3</th>
                    <th>表头4</th>
                    <th>表头5</th>
                </thead>
                <tr>
                    <td>1</td>
                    <td>2</td>
                    <td>3</td>
                    <td>4</td>
                    <td>5</td>
                </tr>
                <tr>
                    <td>1</td>
                    <td>2</td>
                    <td>3</td>
                    <td>4</td>
                    <td>5</td>
                </tr>
                <tr>
                    <td>1</td>
                    <td>2</td>
                    <td>3</td>
                    <td>4</td>
                    <td>5</td>
                </tr>
                <tr>
                    <td>1</td>
                    <td>2</td>
                    <td>3</td>
                    <td>4</td>
                    <td>5</td>
                </tr>
                <tr>
                    <td>1</td>
                    <td>2</td>
                    <td>3</td>
                    <td>4</td>
                    <td>5</td>
                </tr>
                <tr>
                    <td>1</td>
                    <td>2</td>
                    <td>3</td>
                    <td>4</td>
                    <td>5</td>
                </tr>
                <tr>
                    <td>1</td>
                    <td>2</td>
                    <td>3</td>
                    <td>4</td>
                    <td>5</td>
                </tr>
                <tr>
                    <td>1</td>
                    <td>2</td>
                    <td>3</td>
                    <td>4</td>
                    <td>5</td>
                </tr>
            </table>
    
        </body>
    
    </html>

    结果:

    有时候需要根据屏幕可用高度来动态设置表格的高度和表头的宽度:(也就是可用宽度不足以显示内容的时候将tbody定高,并且将thead的宽度减去滚动条的宽度使得上下对齐)

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="UTF-8">
            <title></title>
            <style>
                table {
                    border-collapse: collapse;
                    width: 100%;
                    text-align: left;
                    border: 1px solid #000;
                }
                
                td,
                th {
                    border: 1px solid #000;
                }
                
                tbody {
                    display: block;
                    overflow-x: hidden;
                    overflow-y: auto;
                }
                
                thead,
                tbody tr {
                    display: table;
                    width: 100%;
                    table-layout: fixed;
                    word-break: break-all;
                }
            </style>
            <script src="../js/jquery-1.8.3.min.js"></script>
        </head>
    
        <body>
            <div style="height: 250px;"></div>
            <div style="height: 250px;"></div>
    
            <div id="tebleDiv">
                <table cellspacing="0" cellpadding="0">
                    <thead>
                        <th>表头1</th>
                        <th>表头2</th>
                        <th>表头3</th>
                        <th>表头4</th>
                        <th>表头5</th>
                    </thead>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                    </tr>
                </table>
            </div>
    
        </body>
    
    </html>
    <script>
        $(function() {
            var windowHeight = $(window).height(); //窗口可用高度
            var topValue = $("#tebleDiv").offset().top;
            var tebleDivHeight = $("#tebleDiv").height();
            if (parseFloat(topValue) + parseFloat(tebleDivHeight) + 180 < parseFloat(windowHeight)) {
                return;
            }
            
            var realHeight = windowHeight - topValue -50;
            $("table tbody").css("height", realHeight + "px");
            $("table thead").css("width", ($("table thead").width() - 18) + "px");
        });
    </script>

    结果:

    解释:

    display:table   使得子元素平分父元素的宽度 (加在table上无用,必须针对tr设置)
    table-layout:fixed  在固定表格布局中,水平布局仅取决于表格宽度、列宽度、表格边框宽度、单元格间距,而与单元格的内容无关。

    thead,tbody tr {
    display: table;
    width: 100%;
    table-layout: fixed;
    word-break: break-all;
    }
                table thead{
                    width: calc(100% - 17px);
                }

    为了使thead元素和tbody tr的宽度一致

                tbody{
                    display: block;
                    overflow-x: hidden;
                    overflow-y: auto;
                    height: 100px;
                }

      将tbody元素以块级元素显示并且定高,超过高度自动显示滚动条。

    2. 第二种:在table的父元素div元素上进行滚动,外层div滚动的时候表头固定

       这种方式有个解决了上面的缺陷,但是有个问题是给人的效果不太平滑。重要代码是封装的JS方法:

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="UTF-8">
            <title></title>
            <style>
                table {
                    border-collapse: collapse;
                    width: 100%;
                    text-align: left;
                    border: 1px solid #000;
                }
                
                td,
                th {
                    border: 1px solid #000;
                    background-color: #FFFFFF;
                }
                
                #tebleDiv {
                    overflow-x: hidden;
                    overflow-y: auto;
                    height: 120px;
                }
            </style>
            <script src="../js/jquery-1.8.3.min.js"></script>
        </head>
    
        <body>
            <div id="tebleDiv">
                <table cellspacing="0" cellpadding="0">
                    <thead>
                        <th>表头1</th>
                        <th>表头2</th>
                        <th>表头3</th>
                        <th>表头4</th>
                        <th>表头5</th>
                    </thead>
                    <tr>
                        <td>111111111111111111111111的高度发稿的放到大幅度放到官方刚发的的放到放到</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                    </tr>
                    <tr>
                        <td>1</td>
                        <td>2</td>
                        <td>3</td>
                        <td>4</td>
                        <td>5</td>
                    </tr>
                </table>
            </div>
    
        </body>
    
    </html>
    <script>
        var zdFixedTable = {
            fixedTableHeadByTableDivId: function(divId) {
                if (!divId) {
                    return;
                }
                var tableDiv = $("#" + divId);
                var table = $("#" + divId + " table");
                this.unbindDivScroll(tableDiv);
                this.bindDivScroll(table, tableDiv);
            },
            setTheadWidth: function(table, tableDiv) {
                if (!table || !tableDiv) {
                    return;
                }
                var tableBodyCell = table.find("tbody tr:first td");
                var headerCell = table.find("thead tr th");
                if (tableBodyCell && headerCell) {
                    headerCell.each(function(index) {
                        $(this).width(tableBodyCell.eq(index).width());
                    });
                    tableBodyCell.each(function(index) {
                        $(this).width(headerCell.eq(index).width());
                    });
                }
            },
            unbindDivScroll: function(tableDiv) {
                tableDiv.unbind("scroll");
            },
            bindDivScroll: function(table, tableDiv) {
                zdFixedTable.setTheadWidth(table, tableDiv);
                var timer;
                tableDiv.scroll(function() {
                    clearTimeout(timer);
                    timer = setTimeout(function() {
                        var tableHead = table.find("thead");
                        var windowTop = tableDiv.scrollTop();
                        var position = tableHead.css("position");
                        if (windowTop > 5) {
                            if ("fixed" != position) {
                                tableHead.css("position", "fixed");
                                tableHead.css("margin-top", "-1px");
                            }
                        } else {
                            if ("static" != position) {
                                tableHead.css("position", "static");
                                tableHead.css("margin-top", "0px");
                            }
                        }
                    }, 200);
                });
            }
        }
        $(function() {
            zdFixedTable.fixedTableHeadByTableDivId("tebleDiv");
        });
    </script>

    效果:

  • 相关阅读:
    【001】JS解析,反解析XML的一些问题
    [ Java面试题 ]并发篇
    [ Java面试题 ]WEB篇
    [ Java面试题 ]算法篇
    [ Java面试题 ]数据库篇
    [ Java面试题 ]泛型篇
    [ Java面试题 ]多线程篇
    [ Java面试题 ]持久层篇
    Java开发岗面试知识点解析
    [ SSH框架 ] Spring框架学习之二(Bean的管理和AOP思想)
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/10636180.html
Copyright © 2011-2022 走看看