效果以下:css
感受是否是很和諧,並且代碼也少,不足的是IE9如下不支持transform屬性,但如今也沒多少要考濾IE9如下的兼容了吧,作前端老兼顧低版本的瀏覽器不免會讓本身束手束腳。。。。html
下面來看下代碼吧前端
HTML結構jquery
<div class="box"> <table> <thead> <tr> <th>1</th> <th>2</th> <th>3</th> <th>4</th> <th>5</th> <th>6</th> <th>7</th> <th>8</th> <th>9</th> <th>10</th> <th>11</th> <th>12</th> <th>13</th> <th>14</th> <th>15</th> </tr> </thead> <tbody> <script> var tr = ''; for(var i=0; i<15; i++) { tr += '<tr>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ </tr>'; } document.write(tr); </script> </tbody> </table> </div>
CSS樣式web
<style> *{margin: 0;padding: 0;list-style: none;} .box{width: 300px;height: 300px;margin: 50px auto 0;overflow: auto;} .box table{width: 100%;border-collapse: collapse;border-right: 1px solid #ccc;text-align: center;} .box table thead th{background-color: #ccc;} .box table th, .box table td{padding: 8px 10px;border-left: 1px solid #ccc;border-bottom: 1px solid #ccc;white-space: nowrap;} </style>
提示:若是是加框表格,建議使用box-shadow: inset 1px 1px 0 0 #ccc;chrome
JS腳本瀏覽器
<script> // 原生寫法 window.onload = function() { var $ = document.querySelector.bind(document); var boxEle = $('.box'); boxEle.addEventListener('scroll', function(e) { this.querySelector('thead').style.transform = 'translate(0, '+this.scrollTop+'px)'; }); } </script>
可惡的是IE不支持thead的transform設置,但仍是被小可找到了解決的方法,那就是給th設置transform屬性this
// 須要引用jquery var scrollTop; $('.box').scroll(function() { scrollTop = this.scrollTop; $(this).find('thead tr th').css({ '-webkit-transform': 'translate(0, '+scrollTop+'px)', '-ms-transform': 'translate(0, '+scrollTop+'px)', 'transform': 'translate(0, '+scrollTop+'px)' }); });
另外說明一點,這裏的translate(x, y); 能夠直接使用translateY(y);spa
目前來講這個效果在chrome上是最好的,但在遨遊,火狐,IE效果就差強人意,有點閃眼,建議作個延遲處理,代碼以下code
var scrollTop, timeoutFlag; $('.box').scroll(function() { $(this).find('thead tr th').removeAttr('style'); if(timeoutFlag) clearTimeout(timeoutFlag); timeoutFlag = setTimeout(function() { scrollTop = this.scrollTop; $(this).find('thead tr th').css({ '-webkit-transform': 'translateY('+scrollTop+'px)', '-ms-transform': 'translateY('+scrollTop+'px)', 'transform': 'translateY('+scrollTop+'px)' }); }.bind(this), 300); });
完整代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>表頭固定</title> <style> *{margin: 0;padding: 0;list-style: none;} .box{width: 300px;height: 300px;margin: 50px auto 0;overflow: auto;} .box table{width: 100%;border-collapse: collapse;border-right: 1px solid #ccc;text-align: center;} .box table thead th{background-color: #ccc;} .box table th, .box table td{padding: 8px 10px;border-left: 1px solid #ccc;border-bottom: 1px solid #ccc;white-space: nowrap;} </style> <script src="jquery.min.js"></script> </head> <body> <div class="box"> <table> <thead> <tr> <th>1</th> <th>2</th> <th>3</th> <th>4</th> <th>5</th> <th>6</th> <th>7</th> <th>8</th> <th>9</th> <th>10</th> <th>11</th> <th>12</th> <th>13</th> <th>14</th> <th>15</th> </tr> </thead> <tbody> <script> var tr = ''; for(var i=0; i<15; i++) { tr += '<tr>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ <td>'+i+'</td>\ </tr>'; } document.write(tr); </script> </tbody> </table> <script> /*window.onload = function() { var $ = document.querySelector.bind(document); var boxEle = $('.box'); boxEle.addEventListener('scroll', function(e) { this.querySelector('thead').style.transform = 'translate(0, '+this.scrollTop+'px)'; }); }*/ var scrollTop; $('.box').scroll(function() { scrollTop = this.scrollTop; $(this).find('thead tr th').css({ '-webkit-transform': 'translate(0, '+scrollTop+'px)', '-ms-transform': 'translate(0, '+scrollTop+'px)', 'transform': 'translate(0, '+scrollTop+'px)' }); }); /*var scrollTop, timeoutFlag; $('.box').scroll(function() { $(this).find('thead tr th').removeAttr('style'); if(timeoutFlag) clearTimeout(timeoutFlag); timeoutFlag = setTimeout(function() { scrollTop = this.scrollTop; $(this).find('thead tr th').css({ '-webkit-transform': 'translateY('+scrollTop+'px)', '-ms-transform': 'translateY('+scrollTop+'px)', 'transform': 'translateY('+scrollTop+'px)' }); }.bind(this), 300); });*/ </script> </div> </body> </html>
代碼是否是真的不多呢,還在等什麼?快點感覺一下吧。。
若是喜歡就推薦吧,不要問爲何?直接推薦。。
附加本電腦的IE9效果