zoukankan      html  css  js  c++  java
  • TABLE 多表头固定问题(基本jquery插件)


    在这个插件的使用中,部分网友反应有两个问题:

    1>单元格内容很长时,会出现布局问题;

    2>固定的表头,有时与下面的tbody中的元素不能对齐

    解决方法:

    1>第一个问题实际就是单元格自动换行的问题,可以用下面的方法解决(但仅IE下通过),加入CSS

    View Code
            table tbody td
            {
                word-break: break-all;
                word-wrap: break-word;
            }

    并在调用时传入tableLayout="fixed",采用固定的table布局方案。

    2>第二个问题,试过很多种方法,最稳定的方法是在页面加载完后,将原来的表头TD宽度赋给新的固定表头,代码详见插件源代码

    1 业务要求:

    固定TABLE的表头,当垂直滚动时,表头位置不变,始终可见;

    2 存在的问题:

    网上很多的例子都是针对于单行的表头,如果是多表头,并且td有rowspan在IE下会出现下面的情况(如果您遇到的是多表头td在固定时出现跨行显示的问题,这篇文章适合您)


    3 解决方法:
    写了一个jquery插件来解决这个问题,主要思想是:
    1>将原有的TABLE中的THEAD元素复制一份放在一个新的DIV(fixedheadwrap)中
    2>设置这个fixedheadwrap为绝对位于原来的TABLE的THEAD位置


    4 Jquery插件代码:

    View Code
    /*
    * Auther:Mike.Jiang
    * Email: dataadapter@hotmail.com
    * Date: 2012-09-05
    */
    /*
    主要思想:
    1>将原有的TABLE中的THEAD元素复制一份放在一个新的DIV(fixedheadwrap)中
    2>设置这个fixedheadwrap为绝对位于原来的TABLE的THEAD位置
    */
    (function ($) {
        $.fn.extend({
            FixedHead: function (options) {
                var op = $.extend({ tableLayout: "auto" }, options);
                return this.each(function () {
                    var $this = $(this); //指向当前的table
                    var $thisParentDiv = $(this).parent(); //指向当前table的父级DIV,这个DIV要自己手动加上去
                    $thisParentDiv.wrap("<div class='fixedtablewrap'></div>").parent().css({ "position": "relative" }); //在当前table的父级DIV上,再加一个DIV
                    var x = $thisParentDiv.position();
    
                    var fixedDiv = $("<div class='fixedheadwrap' style='clear:both;overflow:hidden;z-index:2;position:absolute;' ></div>")
                        .insertBefore($thisParentDiv)//在当前table的父级DIV的前面加一个DIV,此DIV用来包装tabelr的表头
                        .css({ "width": $thisParentDiv[0].clientWidth, "left": x.left, "top": x.top });
    
                    var $thisClone = $this.clone(true);
                    $thisClone.find("tbody").remove(); //复制一份table,并将tbody中的内容删除,这样就仅余thead,所以要求表格的表头要放在thead中
                    $thisClone.appendTo(fixedDiv); //将表头添加到fixedDiv中
    
                    $this.css({ "marginTop": 0, "table-layout": op.tableLayout });
                    //当前TABLE的父级DIV有水平滚动条,并水平滚动时,同时滚动包装thead的DIV
                    $thisParentDiv.scroll(function () {
                        fixedDiv[0].scrollLeft = $(this)[0].scrollLeft;
                    });
    
                    //因为固定后的表头与原来的表格分离开了,难免会有一些宽度问题
                    //下面的代码是将原来表格中每一个TD的宽度赋给新的固定表头
                    var $fixHeadTrs = $thisClone.find("thead tr");
                    var $orginalHeadTrs = $this.find("thead");
                    $fixHeadTrs.each(function (indexTr) {
                        var $curFixTds = $(this).find("td");
                        var $curOrgTr = $orginalHeadTrs.find("tr:eq(" + indexTr + ")");
                        $curFixTds.each(function (indexTd) {
                            $(this).css("width", $curOrgTr.find("td:eq(" + indexTd + ")").width());
                        });
                    });
                });
            }
        });
    })(jQuery);

     

    5实现要点

    1>table表头元素要放在<thead>中

    2>table外面需要包一层DIV

    3>运行后发现表头与数据行不对齐,需要调整一下表格中元素的宽度。可以尝试传入tableLayout属性(因为样式问题多种多样,不能保证有用)。

    6 示例(在FF和IE8下测试通过)

    项目常规性税金非常规性税金工程税
    城建税教育费附加%堤围防护费%个人所得税%
    0.2 0.2 0.2 0.2 0.2 0.2
    0.2 0.2 0.2 0.2 0.2 0.2
    0.2 0.2 0.2 0.2 0.2 0.2
    0.2 0.2 0.2 0.2 0.2 0.2
    0.2 0.2 0.2 0.2 0.2 0.2
    0.2 0.2 0.2 0.2 0.2 0.2
    0.2 0.2 0.2 0.2 0.2 0.2
    0.2 0.2 0.2 0.2 0.2 0.2
    0.2 0.2 0.2 0.2 0.2 0.2
    0.2 0.2 0.2 0.2 0.2 0.2
    0.2 0.2 0.2 0.2 0.2 0.2
    0.2 0.2 0.2 0.2 0.2 0.2
    0.2 0.2 0.2 0.2 0.2 0.2
    0.2 0.2 0.2 0.2 0.2 0.2
    0.2 0.2 0.2 0.2 0.2 0.2

    示例代码:

    View Code
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
        <style type="text/css">
            table th
            {
                background-color: Gray;
            }
            table tbody td
            {
                word-break: break-all;
                word-wrap: break-word;
            }
        </style>
        <script type="text/javascript">
            /*
            * Auther:Mike.Jiang
            * Email: dataadapter@hotmail.com
            * Date: 2012-09-05
            */
            /*
            主要思想:
            1>将原有的TABLE中的THEAD元素复制一份放在一个新的DIV(fixedheadwrap)中
            2>设置这个fixedheadwrap为绝对位于原来的TABLE的THEAD位置
            */
            (function ($) {
                $.fn.extend({
                    FixedHead: function (options) {
                        var op = $.extend({ tableLayout: "auto" }, options);
                        return this.each(function () {
                            var $this = $(this); //指向当前的table
                            var $thisParentDiv = $(this).parent(); //指向当前table的父级DIV,这个DIV要自己手动加上去
                            $thisParentDiv.wrap("<div class='fixedtablewrap'></div>").parent().css({ "position": "relative" }); //在当前table的父级DIV上,再加一个DIV
                            var x = $thisParentDiv.position();
    
                            var fixedDiv = $("<div class='fixedheadwrap' style='clear:both;overflow:hidden;z-index:2;position:absolute;' ></div>")
                        .insertBefore($thisParentDiv)//在当前table的父级DIV的前面加一个DIV,此DIV用来包装tabelr的表头
                        .css({ "width": $thisParentDiv[0].clientWidth, "left": x.left, "top": x.top });
    
                            var $thisClone = $this.clone(true);
                            $thisClone.find("tbody").remove(); //复制一份table,并将tbody中的内容删除,这样就仅余thead,所以要求表格的表头要放在thead中
                            $thisClone.appendTo(fixedDiv); //将表头添加到fixedDiv中
    
                            $this.css({ "marginTop": 0, "table-layout": op.tableLayout });
                            //当前TABLE的父级DIV有水平滚动条,并水平滚动时,同时滚动包装thead的DIV
                            $thisParentDiv.scroll(function () {
                                fixedDiv[0].scrollLeft = $(this)[0].scrollLeft;
                            });
    
                            //因为固定后的表头与原来的表格分离开了,难免会有一些宽度问题
                            //下面的代码是将原来表格中每一个TD的宽度赋给新的固定表头
                            var $fixHeadTrs = $thisClone.find("thead tr");
                            var $orginalHeadTrs = $this.find("thead");
                            $fixHeadTrs.each(function (indexTr) {
                                var $curFixTds = $(this).find("td");
                                var $curOrgTr = $orginalHeadTrs.find("tr:eq(" + indexTr + ")");
                                $curFixTds.each(function (indexTd) {
                                    $(this).css("width", $curOrgTr.find("td:eq(" + indexTd + ")").width());
                                });
                            });
                        });
                    }
                });
            })(jQuery);
            $(document).ready(function () {
                $("#tbTest").FixedHead({ tableLayout: "fixed" });
            });
        </script>
    </head>
    <body>
        <div style="height: 200px;  400px; overflow: auto;">
            <table id="tbTest" border="1" cellspacing="1" cellpadding="1" style=" 500px;">
                <thead>
                    <tr>
                        <th rowspan="2" style=" 30%">
                            项目
                        </th>
                        <th colspan="2">
                            常规性税金
                        </th>
                        <th colspan="2">
                            非常规性税金
                        </th>
                        <th rowspan="2" style=" 10%">
                            工程税
                        </th>
                    </tr>
                    <tr>
                        <th style=" 15%">
                            城建税
                        </th>
                        <th style=" 15%">
                            教育费附加%
                        </th>
                        <th style=" 15%">
                            堤围防护费%
                        </th>
                        <th style=" 15%">
                            个人所得税%
                        </th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>
                            0.2
                        </td>
                        <td>
                            11111111111111111.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                    </tr>
                    <tr>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                    </tr>
                    <tr>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                    </tr>
                    <tr>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                    </tr>
                    <tr>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                    </tr>
                    <tr>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                    </tr>
                    <tr>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                    </tr>
                    <tr>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                    </tr>
                    <tr>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                    </tr>
                    <tr>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                    </tr>
                    <tr>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                    </tr>
                    <tr>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                    </tr>
                    <tr>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                    </tr>
                    <tr>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                    </tr>
                    <tr>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                        <td>
                            0.2
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </body>
    </html>
  • 相关阅读:
    SharePoint 2013 APP 开发示例 (六)服务端跨域访问 Web Service (REST API)
    麦咖啡导致电脑不能上网
    SharePoint 2013 Central Admin 不能打开
    SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API)
    SharePoint 2013 APP 开发示例 系列
    synthesize(合成) keyword in IOS
    Git Cmd
    简单的正则匹配
    Dropbox
    SQL Server Replication
  • 原文地址:https://www.cnblogs.com/dataadapter/p/2672190.html
Copyright © 2011-2022 走看看