鑒於從IE8開始,IE不再支持css的expression了,所以以前依靠它完成鎖表頭的代碼就全部失效了,面對新的瀏覽器,一切又要重新來過了。
現在筆者所能找到的對於鎖表頭的方案主要有兩種路子:一種是使用JQuery,另一種是使用純js的,因各個公司情況不一樣,各取所需吧!
而這兩條路中每一條又帶有多種實現思路,先僅舉兩個思路如下:
1.另外拷貝一份table的head,然后將它安置在table的最上面,這樣改動量較大。
2.不拷貝head, 想法把table的head固定在最上面,這樣改動量小些。
下面介紹的兩個方案:JQuery方案和非JQuery方案(純js),都是基於思路2的,即不拷貝head, 直接把table的head固定在最上面。
1.JQuery方案
1.1 頁面引入jquery.js庫
<script src="jquery-1.7.1.js" type="text/javascript"></script>
1.2 添加兩個js函數
添加LockTableHead()和translate()函數。
注意:為防止JQuery與現有js框架搶奪$標識符,要執行jQuery.noConflict(),。
function LockTableHead(divId, tableId) {
var jq = jQuery.noConflict();
jq("#" + divId).scroll(function () {
var delta = jq("#" + divId).scrollTop();
if (delta > 0) {
translate(jq("#" + tableId +" th"), 0, delta - 2);
}
else {
translate(jq("#" + tableId + " th"), 0, 0);
}
});
}
function translate(element, x, y) {
var translation = "translate(" + x + "px," + y + "px)"
element.css({
"transform": translation,
"-ms-transform": translation,
"-webkit-transform": translation,
"-o-transform": translation,
"-moz-transform": translation
});
}
1.3 修改頁面,調用js
在適當的地方添加LockTableHead()函數調用即可。
如下:
<button onclick="LockTableHead('grid','T000000');" name="b1" type="button">button</button>
注意:要提供一個div的id和table的id 。
2.非JQuery方案(純js)
2.1 思路
受JQuery方案的啟發,將它翻譯回普通js即可。
2.2 添加js函數
添加LockTableHead()函數。
function LockTableHead(divId, tableId) {
document.getElementById(divId).onscroll = function () {
var delta = document.getElementById(divId).scrollTop;
var t1 = "translate(0px," + delta + "px)";
th_Array = document.getElementById(tableId).getElementsByTagName("th");
for (i = 0; i < th_Array.length; i++) {
th_Array[i].style["-ms-transform"] = t1;
}
};
}
2.3 修改頁面,調用js
同上,在適當的地方添加LockTableHead()函數調用即可。
如下:
<button onclick="LockTableHead('grid','T000000');" name="b1" type="button">button</button>
注意:要提供一個div的id和table的id 。
3.總結
以上兩方案實際上都是使用了css3中的translate函數,這就意味着瀏覽器得支持這個功能是前提條件。
另外,如果頁面上只有一個table,也可以通過getElementsByTagName的方式定位table,並用parentNode的方式定位div,這樣就不必傳遞它們的id了。
推薦參考資料:
http://www.mycafei.com/a/study/2012/0909/2.html
關於IE, 下面的方案不支持IE6, IE7, IE8, 只支持IE9, IE10。
因為從IE9開始才支持css3的部分功能,所以,IE6, IE7, IE8就不能用此方案了, 其實IE6, IE7 還用css的expressions不挺好嗎?多省事,就一句話的事。
4.附錄完整的代碼
<HTML>
<HEAD>
<TITLE >fff</TITLE>
<META http-equiv="X-UA-Compatible" content="IE=9" />
<script type="text/javascript">
function LockTableHead(divId, tableId) {
document.getElementById(divId).onscroll = function () {
var delta = document.getElementById(divId).scrollTop;
var t1 = "translate(0px," + delta + "px)";
th_Array = document.getElementById(tableId).getElementsByTagName("th");
for (i = 0; i < th_Array.length; i++) {
th_Array[i].style["-ms-transform"] = t1;
}
};
}
</script>
</HEAD>
<body onload="LockTableHead('body','your_table')">
<form>
<div id="body" style="border-right: 1px groove; border-top: 1px groove; left: 60px;
overflow: auto; border-left: 1px groove; width: 374px; border-bottom: 1px groove;
position: absolute; top: 159px; height: 308px">
<div style="overflow: visible; width: 370px; position: static; height: 308px">
<table id="your_table">
<thead id="hid" style="background-color: white">
<tr id="tid">
<th style="width: 100px">
col1
</th>
<th style="width: 100px">
col2
</th>
<th style="width: 100px">
col3
</th>
<th style="width: 100px">
col4
</th>
<th style="width: 100px">
col5
</th>
<th style="width: 100px">
col6
</th>
<th style="width: 100px">
col7
</th>
<th style="width: 100px">
col8
</th>
<th style="width: 100px">
col9
</th>
<th style="width: 100px">
col10
</th>
<th style="width: 100px">
col11
</th>
<th style="width: 100px">
col12
</th>
</tr>
</thead>
<tbody style="display: block; overflow: auto">
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
<tr>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
<td>
milk
</td>
<td>
1 quart
</td>
<td>
2 quart
</td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
</body>
</html>