效果以下: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效果