表格的固定 头和列的实现

        核心思想:css加js实现:分为四个表格:,四个区域,左边一个大的div,右边一个大的div,各自包着上下两个div,,然后里面包着table,

右边特殊点,上边还包了一层div,才是表格:

代码如下

<!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>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
    <meta http-equiv="expires" content="0">
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <title>固定标题列、标题头table</title>
    <style>
        table {
            border-collapse: collapse;
            border-spacing: 0px;
            width: 100%;
            border: #000 solid 0px;
        }

        table td {
            border: 1px solid #000;
            height: 25px;
            text-align: center;
            border-left: 0px;
        }

        table th {
            background: #edd3d4;
            color: #a10333;
            border: #000 solid 1px;
            white-space: nowrap;
            height: 21px;
            border-top: 0px;
            border-left: 0px;
        }

        .t_left {
            width: 20%;
            height: auto;
            float: left;
            border-top: 1px solid #000;
            border-left: 1px solid #000;
        }

        /*t_r_content和cl_freeze高度相差20px, 高度为外观显示高度,可根据情况调整*/
        .t_r_content {
            width: 100%;
            height: 220px;
            background: #fff;
            overflow: auto;
        }

        .cl_freeze {
            height: 220px;
            overflow: hidden;
            width: 100%;
        }

        /* width 调整左边标题列宽度(左侧外观显示宽度); 指定为width:auto 在Opera下显示有问题; height比 t_r_content 高度小20px*/
        /* width 宽度为 右侧外观显示宽度 实际显示宽度大小为“t_r”宽度加上“cl_freeze”宽度 */
        /* 如果显示不正常,调整 t_r的width 使其和t_left的width之和小于100%;等于100%时会有问题*/
        .t_r {
            width: 69.5%;
            height: auto;
            float: left;
            border-top: 1px solid #000;
            border-right: #000 solid 1px;
        }

        .t_r table {
            width: 1700px;
        }

        .t_r_title {
            width: 1720px;
        }

        /*宽度比 t_r table 大20px (至少大20,小了滚动条滑到右侧显示有问题)*/
        .t_r_t {
            width: 100%;
            overflow: hidden;
        }

        .bordertop {
            border-top: 0px;
        }
    </style>
    <script>
        function aa() {
            var a = document.getElementById("t_r_content").scrollTop;
            var b = document.getElementById("t_r_content").scrollLeft;
            document.getElementById("cl_freeze").scrollTop = a;
            document.getElementById("t_r_t").scrollLeft = b;
        }
    </script>
</head>
<body>
<div style="width:100%">
    <div class="t_left">
        <div style="width:100%;">
            <table>
                <tr>
                    <th style="width:50%">账号</th>
                    <th style="width:50%">姓名</th>
                </tr>
            </table>
        </div>
        <div class="cl_freeze" id="cl_freeze">
            <table>
                <tr>
                    <td style="width:50%" class="bordertop">1</td>
                    <td style="width:50%" class="bordertop">1</td>
                </tr>
                <tr>
                    <td>2</td>
                    <td>2</td>
                </tr>
                <tr>
                    <td>3</td>
                    <td>3</td>
                </tr>
                <tr>
                    <td>4</td>
                    <td>4</td>
                </tr>
                <tr>
                    <td>5</td>
                    <td>5</td>
                </tr>
                <tr>
                    <td>6</td>
                    <td>6</td>
                </tr>
                <tr>
                    <td>7</td>
                    <td>7</td>
                </tr>
                <tr>
                    <td>8</td>
                    <td>8</td>
                </tr>
                <tr>
                    <td>9</td>
                    <td>9</td>
                </tr>
                <tr>
                    <td>10</td>
                    <td>10</td>
                </tr>
                <tr>
                    <td>11</td>
                    <td>11</td>
                </tr>
                <tr>
                    <td>12</td>
                    <td>12</td>
                </tr>
                <tr>
                    <td>13</td>
                    <td>13</td>
                </tr>
                <tr>
                    <td>14</td>
                    <td>14</td>
                </tr>
                <tr>
                    <td>15</td>
                    <td>15</td>
                </tr>
                <tr>
                    <td>16</td>
                    <td>16</td>
                </tr>
                <tr>
                    <td>17</td>
                    <td>17</td>
                </tr>
                <tr>
                    <td>18</td>
                    <td>18</td>
                </tr>
                <tr>
                    <td>19</td>
                    <td>19</td>
                </tr>
                <tr>
                    <td>20</td>
                    <td>20</td>
                </tr>
            </table>
        </div>
    </div>
    <div class="t_r">
        <div class="t_r_t" id="t_r_t">
            <div class="t_r_title">
                <table>
                    <tr>
                        <th width="10%">字段A</th>
                        <th width="20%">字段B</th>
                        <th width="10%">字段C</th>
                        <th width="20%">字段D</th>
                        <th width="20%">字段E</th>
                        <th width="20%">字段F</th>
                    </tr>
                </table>
            </div>
        </div>
        <div class="t_r_content" id="t_r_content" onscroll="aa()">
            <table>
                <tr>
                    <td width="10%" class="bordertop">1</td>
                    <td width="20%" class="bordertop">1</td>
                    <td width="10%" class="bordertop">1</td>
                    <td width="20%" class="bordertop">1</td>
                    <td width="20%" class="bordertop">1</td>
                    <td width="20%" class="bordertop">1</td>
                </tr>
                <tr>
                    <td>2</td>
                    <td>2</td>
                    <td>2</td>
                    <td>2</td>
                    <td>2</td>
                    <td>2</td>
                </tr>
                <tr>
                    <td>3</td>
                    <td>3</td>
                    <td>3</td>
                    <td>3</td>
                    <td>3</td>
                    <td>3</td>
                </tr>
                <tr>
                    <td>4</td>
                    <td>4</td>
                    <td>4</td>
                    <td>4</td>
                    <td>4</td>
                    <td>4</td>
                </tr>
                <tr>
                    <td>5</td>
                    <td>5</td>
                    <td>5</td>
                    <td>5</td>
                    <td>5</td>
                    <td>5</td>
                </tr>
                <tr>
                    <td>6</td>
                    <td>6</td>
                    <td>6</td>
                    <td>6</td>
                    <td>6</td>
                    <td>6</td>
                </tr>
                <tr>
                    <td>7</td>
                    <td>7</td>
                    <td>7</td>
                    <td>7</td>
                    <td>7</td>
                    <td>7</td>
                </tr>
                <tr>
                    <td>8</td>
                    <td>8</td>
                    <td>8</td>
                    <td>8</td>
                    <td>8</td>
                    <td>8</td>
                </tr>
                <tr>
                    <td>9</td>
                    <td>9</td>
                    <td>9</td>
                    <td>9</td>
                    <td>9</td>
                    <td>9</td>
                </tr>
                <tr>
                    <td>10</td>
                    <td>10</td>
                    <td>10</td>
                    <td>10</td>
                    <td>10</td>
                    <td>10</td>
                </tr>
                <tr>
                    <td>11</td>
                    <td>11</td>
                    <td>11</td>
                    <td>11</td>
                    <td>11</td>
                    <td>11</td>
                </tr>
                <tr>
                    <td>12</td>
                    <td>12</td>
                    <td>12</td>
                    <td>12</td>
                    <td>12</td>
                    <td>12</td>
                </tr>
                <tr>
                    <td>13</td>
                    <td>13</td>
                    <td>13</td>
                    <td>13</td>
                    <td>13</td>
                    <td>13</td>
                </tr>
                <tr>
                    <td>14</td>
                    <td>14</td>
                    <td>14</td>
                    <td>14</td>
                    <td>14</td>
                    <td>14</td>
                </tr>
                <tr>
                    <td>15</td>
                    <td>15</td>
                    <td>15</td>
                    <td>15</td>
                    <td>15</td>
                    <td>15</td>
                </tr>
                <tr>
                    <td>16</td>
                    <td>16</td>
                    <td>16</td>
                    <td>16</td>
                    <td>16</td>
                    <td>16</td>
                </tr>
                <tr>
                    <td>17</td>
                    <td>17</td>
                    <td>17</td>
                    <td>17</td>
                    <td>17</td>
                    <td>17</td>
                </tr>
                <tr>
                    <td>18</td>
                    <td>18</td>
                    <td>18</td>
                    <td>18</td>
                    <td>18</td>
                    <td>18</td>
                </tr>
                <tr>
                    <td>19</td>
                    <td>19</td>
                    <td>19</td>
                    <td>19</td>
                    <td>19</td>
                    <td>19</td>
                </tr>
                <tr>
                    <td>20</td>
                    <td>20</td>
                    <td>20</td>
                    <td>20</td>
                    <td>20</td>
                    <td>20</td>
                </tr>
            </table>
        </div>
    </div>
</div>
</body>
</html>

分析:

 table {
            border-collapse: collapse;
            border-spacing: 0px;
            width: 100%;
            border: #000 solid 0px;
        }

border-collapse 属性设置表格的边框是否被合并为一个单一的边框,还是象在标准的 HTML 中那样分开显示。

separate默认值。边框会被分开。不会忽略 border-spacing 和 empty-cells 属性。
collapse如果可能,边框会合并为一个单一的边框。会忽略 border-spacing 和 empty-cells 属性。
inherit规定应该从父元素继承 border-collapse 属性的值。

 

border-spacing 属性设置相邻单元格的边框间的距离(仅用于“边框分离”模式)。

该属性指定分隔边框模型中单元格边界之间的距离。在指定的两个长度值中,第一个是水平间隔,第二个是垂直间隔。除非 border-collapse 被设置为 separate,否则将忽略这个属性。尽管这个属性只应用于表,不过它可以由表中的所有元素继承。

 

 table td {
            border: 1px solid #000;
            height: 25px;
            text-align: center;
            border-left: 0px;
        }
 table th {
            background: #edd3d4;
            color: #a10333;
            border: #000 solid 1px;
            white-space: nowrap;
            height: 41px;
            border-top: 2px;
            border-left: 2px;
        }

white-space规定段落中的文本不进行换行:

 

normal

默认。空白会被浏览器忽略。
pre空白会被浏览器保留。其行为方式类似 HTML 中的 <pre> 标签。
nowrap文本不会换行,文本会在在同一行上继续,直到遇到 <br> 标签为止。
pre-wrap保留空白符序列,但是正常地进行换行。
pre-line合并空白符序列,但是保留换行符。
inherit规定应该从父元素继承 white-space 属性的值。

 

 .t_left {
            width: 20%;
            height: auto;
            float: left;
            border-top: 1px solid #000;
            border-left: 1px solid #000;
        }
 .t_r_content {
            width: 100%;
            height: 220px;
            background: #fff;
            overflow: auto;
        }

        .cl_freeze {
            height: 220px;
            overflow: hidden;
            width: 100%;
        }
 <script>
        function aa() {
            var a = document.getElementById("t_r_content").scrollTop;
            var b = document.getElementById("t_r_content").scrollLeft;
            document.getElementById("cl_freeze").scrollTop = a;
            document.getElementById("t_r_t").scrollLeft = b;
        }
    </script>

滑动触发:

scrollTop 

解释:元素滚动条内的顶部隐藏部分的高度。

锁定表头及固定左边列,原生JS原创代码 需要注意的问题: 1.表格的宽度以及表格每一列的宽度需要固定(特殊情况除外:当表格列数少并且表格总宽度明显小于表格父容器的宽度时,也就是表格列不存在自动换行的问题) 2.表格父容器尺寸大小改变时,需要调用 setBoxSize 方法,目的是判断父容器是否出现滚动条 1.1 修正了对IE6、IE7的兼容问题 1.2 修正了固定行、列的样式问题 1.3 IE6/IE7浏览器 不启用该功能 1.4 增加了拆分线, 修正了重复生成锁定行列的问题以及生成错位的问题, 修正了行、列事件无法复制的问题, 增加了IE6/IE7/IE8 启用设置参数(ieLowVersionEnabled: true|false) ,默认不启用, 注:IE6/7/8锁定表头 由于兼容性问题,有些情况下会有一些错位的问题 1.5 增加了 显示/隐藏功能,修正了非IE浏览器下列宽错位问题 1.6 修正了当有合并单元格时,锁定单元格错位的问题,修正了表格行数较多时的性能问题 1.7 表格单元格可以不指定宽度(锁定时,取实际的单元格宽度),当单元格的左右两边的borderWidth不一样时,会有一些错位 若单元格宽度是固定的,可以在第3个参数(config)中指定 isFixedSize:true 修正表头列未锁定的Bug 1.8 修正表格含有thead时的样式丢失问题,以及行数设置问题,修正thead/tbody行归属问题 1.9 移除tbTopLeft的边框线 修正表格cellpadding/cellspacing的设置问题 修复Firefox下的padding导致的错位问题 修复thead复制没有底部分割线的问题 修复thead复制时无背景色的问题 增加复选框同步功能(如果是JS代码设置复选框选中,需要调用 .setCheckBoxSync()方法) .setCheckBoxSync 方法参数说明:4种参数 1) 复选框控件(html object)数组 2) 复选框控件(html object) 3) 复选框控件ID (string) 4) 空参数(尽量不用空参数)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值