指定した行と、一列目を固定し、コンテンツをスクロールできるテーブル作成。

大量のデータがあるとき(バスの運賃表や時間割など)に使用しやすい大型テーブル用

テーブル作成でなるべくthかtdに偏らせるとよい。幅はすべて同じように固定するので、変則な行、列幅を用意しないこと。

colspanなどで結合は行わないこと。

cssのみでは表現できないので、javascriptも併用する。

【css】

/* テーブル全体枠 */
.outer {
	position: relative;
	padding-top: 30px;
	overflow: hidden;
	width: 600px;
}
/* スクロール表示用枠 */
.scroller {
	overflow: auto;
	background: #f5f5f5;
	max-height: 300px;
	width: 600px;
}
/*テーブル幅・高さを固定 ※設定しなくてもよい?*/
.box {
  /*widthを該当ページ内に記述*/
}
/*header-固定用*/
table thead {
	position: absolute;
	top: 0;
	left: 0;
	z-index: 2;
	height: 30px;
}
table thead td {
	line-height: 100%;
	font-size: 11px;
	height: 30px;
	width: 70px;
}
/*body*/
table tbody {
	/*widthを該当ページ内に記述*/
}
table tbody td {
	width: 70px;
	height: 30px;
}
table th {
	border: 1px solid #999;
	font-size: 11px;
	font-weight: normal;
	line-height: 100%;
	text-align: center;
	height: 30px;
	width: 70px;
}
/* 一列目のカラム */
table th:first-child {
	display: block;
	position: relative;
	z-index: 3;
}
table td {
	border: 1px solid #999;
	font-size: 12px;
	text-align: center;
	width: 70px;
	line-height: 100%;
	empty-cells: show;
}

 

【javascript(jQuery)】

<cript type="text/javascript">
	$(function(){
/* phpを利用して、td、thを吐き出すとき、同時にカラム数分のwidthを計算し、table直前div、thead、tbodyにwidthを設定する場合 */
		$(".box").css("width", "px");
		//$("table").css("width", "px"); // 必要ない?
		$("table thead").css("width", "px");
		$("table tbody").css("width", "px");

		var scroller = document.getElementById("scroller");
		var thead, theadF, tbodyF;
		thead = $("table thead");
		theadF = $("table thead tr th:first-child");
		tbodyF = $("table tr th:first-child");

		$('.scroller').scroll(function () {
			var left= $(this).scrollLeft(); //scrollerのスクロール位置
			$("table thead").css("left", left * -1);  //thead scroll
			//$("table tfoot").css("left", left * -1);  //tfoot scroll

			thead.css("left", left * -1);
			theadF.css("left", left);
			tbodyF.css("left", left);
		});
	})
</script>

 

【html】

<div class="outer">
	<div class="scroller">
		<div class="box">
			<table>
				<thead>
					<tr>
						<th>×</th><th>1</th>....<th>60</th>
					</tr>
				</thead>
				<tbody>
					<tr>
						<th>○○</th><td>●●</td>....<td>●●</td>
					</tr>
					.
					.
					.
					<tr>
						<th>○○</th><td>●●</td>....<td>●●</td>
					</tr>
				</tbody>
			</table>
		</div>
	</div>
</div>