實作凍結窗格(水平捲動)

身為一個苦命的打工仔,除了要面對上面主管的要求

還要面對底下的 理由伯 (X) 資深工程師 (O)質疑我能力不足

所以只好在網路上找了些資料研究一下,如何實作出凍結窗格的功能

此篇文章係參考  D Stonebraker 在Bootsnipp上po出的文章 (連結在此)

首先,搞一個Dummy的Html頁面,頁面內容如下:

<!DOCTYPE html>
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
      <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" 
         crossorigin="anonymous"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
      <link rel="stylesheet" href="Page.css">
      <script src="TestField.js" type="text/javascript"></script>
   </head>
   <body>
      <div class="container">
         <div class="row">
            <div class="col-md-12 col-sm-12 col-xs-12">
               <div class="scrolling outer">
                  <div class="inner">
                     <table id="GYPersonTable" class="table table-striped table-hover table-condensed">
                        <tr>
                           <th>理由伯1</th>
                           <th>理由伯2</th>
                           <th>理由伯3</th>
                           <td>理由1</td>
                           <td>理由2</td>
                           <td>理由3</td>
                           <td>理由4</td>
                           <td>理由5</td>
                           <td>理由6</td>
                        </tr>
                        <tr>
                           <th>我是理由伯,我有一堆理由</th>
                           <th>我是理由伯,我有一堆理由</th>
                           <th>我是理由伯,我有一堆理由</th>
                           <td>我能力最強,都是別人在迫害我</td>
                           <td>我能力最強,都是別人在迫害我</td>
                           <td>我能力最強,都是別人在迫害我</td>
                           <td>我能力最強,都是別人在迫害我</td>
                           <td>我能力最強,都是別人在迫害我</td>
                           <td>我能力最強,都是別人在迫害我</td>
                        </tr>
                        <tr>
                           <th>我是理由伯,我有一堆理由</th>
                           <th>我是理由伯,我有一堆理由</th>
                           <th>我是理由伯,我有一堆理由</th>
                           <td>Button耍官威,刁難我請假</td>
                           <td>Button耍官威,刁難我請假</td>
                           <td>Button耍官威,刁難我請假</td>
                           <td>Button耍官威,刁難我請假</td>
                           <td>Button耍官威,刁難我請假</td>
                           <td>Button耍官威,刁難我請假</td>
                        </tr>
                        <tr>
                           <th>我是理由伯,我有一堆理由</th>
                           <th>我是理由伯,我有一堆理由</th>
                           <th>我是理由伯,我有一堆理由</th>
                           <td>Button不會寫,所以把案子丟給我</td>
                           <td>Button不會寫,所以把案子丟給我</td>
                           <td>Button不會寫,所以把案子丟給我</td>
                           <td>Button不會寫,所以把案子丟給我</td>
                           <td>Button不會寫,所以把案子丟給我</td>
                           <td>Button不會寫,所以把案子丟給我</td>
                        </tr>
                        <tr>
                           <th>我是理由伯,我有一堆理由</th>
                           <th>我是理由伯,我有一堆理由</th>
                           <th>我是理由伯,我有一堆理由</th>
                           <td>Button拍我的肩,像是要把我殺了</td>
                           <td>Button拍我的肩,像是要把我殺了</td>
                           <td>Button拍我的肩,像是要把我殺了</td>
                           <td>Button拍我的肩,像是要把我殺了</td>
                           <td>Button拍我的肩,像是要把我殺了</td>
                           <td>Button拍我的肩,像是要把我殺了</td>
                        </tr>
                        <tr>
                           <th>我是理由伯,我有一堆理由</th>
                           <th>我是理由伯,我有一堆理由</th>
                           <th>我是理由伯,我有一堆理由</th>
                           <td>我還要幫忙CRM,所以沒時間做專案</td>
                           <td>我還要幫忙CRM,所以沒時間做專案</td>
                           <td>我還要幫忙CRM,所以沒時間做專案</td>
                           <td>我還要幫忙CRM,所以沒時間做專案</td>
                           <td>我還要幫忙CRM,所以沒時間做專案</td>
                           <td>我還要幫忙CRM,所以沒時間做專案</td>
                        </tr>
                     </table>
                  </div>
               </div>
            </div>
         </div>
      </div>
      </div>
   </body>
</html>

搞定了Dummy HTML後,就來寫CSS調整對應的Layout吧

.scrolling table {
    table-layout: inherit;
 *margin-left: -100px;/*ie7*/
}
.scrolling td,th {
    vertical-align: top;
	padding: 10px;
	min-width: 120px;
}
.outer {
	position: relative
}
.inner {
	overflow-x: auto;
	overflow-y: visible;
	margin-left: 360px;
}

搞定了CSS,接下來用javaScript自動在table中的<th>加上css 屬性

$(document).ready(function(){
	$('#GYPersonTable thead tr').each(function(){
		$(this).find('th').each(function(index){
			var positionPX=120;
			if(index == 0) {
				$(this).css({
				position: 'absolute',
				left: 0,
				width: '120px'
				});
			}
			else {
				$(this).css({
					position: 'absolute',
					left: positionPX*index+'px',
					width: '120px'
				});
			}
		});
	});

	$('#GYPersonTable tbody tr').each(function(){
			$(this).find('th').each(function(index){
			var positionPX=120;
			if(index == 0) {
				$(this).css({
				position: 'absolute',
				left: 0,
				width: '120px'
				});
			}
			else {
				$(this).css({
					position: 'absolute',
					left: positionPX*index+'px',
					width: '120px'
				});
			}
		});
	});

});

都搞定後來看執行結果吧

真是太神奇了~竟然能固定窗格做水平的滾動

以上,就是凍結窗格的實作方式