html和css没有提供对表格冻结行列的属性,但是我们操作大型,需要滚动表格的时候,处于方便用户查看的关系,表格往往需要这个功能。
一、只需要冻结某一行(列)的情况
步骤1、把看起来是一个整体的表格拆分成两部分,table1负责固定部分如thead,而table2负责可以拖动的部分如tbody。
示例代码:
1 <div class="table-out nicescroll-table">
2 <div class="table1" >
<!--我这里没有对table1或者table2使用定位,所有table1和table2分别负责表头和表身-->
<!--如果想要table1或者table2使用定位,那么有一个更好的方法,那就是table1是表头,而table2是表头+表身的完整表格,然后再把table1的表头叠加在table2的表头上方-->
3 <!--table1的thead-->
4 <table>
5 <thead>
6 <tr>
7 <th class="width-100">学生名字</th>
8 <th class="width-100">学号</th>
9 <th class="width-100">出勤次数</th>
10 <th class="width-200">周一</th>
11 <th class="width-200">周二</th>
12 </tr>
13 </thead>
14 </table>
15 </div>
16 <div class="table-main">
17 <!--table2的tbody-->
18 <table>
19 <tbody>
20 <tr>
21 <td class="width-100">张小月</td>
22 <td class="width-100">2123432</td>
23 <td class="width-100">7</td>
24 <td class="width-200">不错</td>
25 <td class="width-200">不错</td>
26 </tr>
27 <tr>
28 <td class="width-100">张大月</td>
29 <td class="width-100">2123432</td>
30 <td class="width-100">7</td>
31 <td class="width-200"></td>
32 <td class="width-200"></td>
33 </tr>
34 <tr>
35 <td class="width-100">张月月</td>
36 <td class="width-100">2123432</td>
37 <td class="width-100">7</td>
38 <td class="width-200"></td>
39 <td class="width-200"></td>
40 </tr>
41 </tbody>
42 </table>
43 </div>
步骤2、把两个table固定好了之后,监听table2的滚动,用table2的滚动带动table1的滚动(通过设置css里的left 或者 scroll,如果是绝对定位那么只能用设定css中left的方法)
1 $('.table2').scroll(function() {
2 var scrollLeft = $(this).scrollLeft();
3 $('.table1').scrollLeft(scrollLeft);
4 });
效果图如下:
二、同时冻结行和列的情况
步骤1、把看起来是一个整体的表格拆分成四个部分
示例代码:
1 <div class="table-out">
2 <!--四个table,少一个都不行-->
3 <div class="table-top" >
4 <table>
5 <thead>
6 <tr>
7 <th class="width-100">学生名字</th>
8 <th class="width-100">学号</th>
9 <th class="width-100">出勤次数</th>
10 <th class="width-200">周一</th>
11 <th class="width-200">周二</th>
12 </tr>
13 </thead>
14 </table>
15 </div>
16 <div class="table-main">
17 <table>
18 <tbody>
19 <tr>
20 <td class="width-100">张小月</td>
21 <td class="width-100">2123432</td>
22 <td class="width-100">7</td>
23 <td class="width-200">不错</td>
24 <td class="width-200">不错</td>
25 </tr>
26 <tr>
27 <td class="width-100">张大月</td>
28 <td class="width-100">2123432</td>
29 <td class="width-100">7</td>
30 <td class="width-200"></td>
31 <td class="width-200"></td>
32 </tr>
33 <tr>
34 <td class="width-100">张月月</td>
35 <td class="width-100">2123432</td>
36 <td class="width-100">7</td>
37 <td class="width-200"></td>
38 <td class="width-200"></td>
39 </tr>
40 </tbody>
41 </table>
42 </div>
43 <div class="table-left">
44 <table>
45 <tbody>
46 <tr>
47 <td class="width-100">张小月</td>
48 <td class="width-100">2123432</td>
49 <td class="width-100">7</td>
50 </tr>
51 <tr>
52 <td class="width-100">张大月</td>
53 <td class="width-100">2123432</td>
54 <td class="width-100">7</td>
55 </tr>
56 <tr>
57 <td class="width-100">张月月</td>
58 <td class="width-100">2123432</td>
59 <td class="width-100">7</td>
60 </tr>
61 </tbody>
62 </table>
63 </div>
64 <div class="table-left-top" >
65 <table>
66 <thead>
67 <tr>
68 <th class="width-100">学生名字</th>
69 <th class="width-100">学号</th>
70 <th class="width-100">出勤次数</th>
71 </tr>
72 </thead>
73 </table>
74 </div>
75 </div>
步骤2、把四个table固定好了之后,监听table-main的滚动,用table-main的滚动带动table-top的左右移动和table-left的上下移动。在这个示例里,我对table-left用到了绝对定位,所以给table-left设定scroll无效,但是可以使用改变table-left的css中top的属性值来使得table-left上下移动。
var tableLeftTop1 = parseInt($('.table-left').css('top'));
$('.table-main').scroll(function() {
var scrollLeft = $(this).scrollLeft();
var scrollTop = tableLeftTop1 - $(this).scrollTop()+'px';
$('.table-left').css('top',scrollTop);
$('.table-top').scrollLeft(scrollLeft);
});
示例效果图:
另外,你也可以将四个table这样分类,这两种方法怎么分都行,万变不离其宗,用main-table的左右移动带动table-top和table-left的移动:
我这里为了使table的滚动条更为美观些,我使用了nicescroll滚动条插件。否则你所见到的就是又粗又笨拙的默认滚动条啦~(偷笑脸)
table冻结行列的demo链接:https://github.com/zhangqiongyue/smallDemo