私は3つのdivを持っています。ヘッダー、中央、フッター。中央のdiv(グリッドビュー)には、ほとんどの場合、外側のdivよりも長いテーブルがあります。そこで、このdivを垂直方向にスクロール可能にしました。問題は、divを下にスクロールした後に表示されるテーブルヘッダーを作成するにはどうすればよいですか?このヘッダーを個別のdivまたはテーブルで作成して固定することもできますが、テーブルの列の幅は常に同じではないため、ヘッダーの列の幅を維持する方法がわかりません。どんな手掛かり?
11 に答える
私はあなたが望むことを正確に行うjQueryプラグインをまとめました。サイズが非常に小さく、実装が非常に簡単です。
必要なのは、thead と tbody を持つテーブルだけです。
クラス名を使用してそのテーブルを DIV でラップすると、テーブルは常にその div に収まるようにサイズ変更されます。たとえば、div がブラウザ ウィンドウに合わせてスケーリングされる場合、テーブルも同様にスケーリングされます。スクロールするとヘッダーが固定されます。フッターは固定されます (フッターを有効にした場合)。フッターのヘッダーを複製して修正するオプションもあります。また、ブラウザ ウィンドウを小さくしすぎてすべての列が収まらない場合は、水平方向にもスクロールします (ヘッダーも)。
$('.myDiv').fixedHeaderTable({footer: true, footerId: 'myFooterId'}); のように、DIV のクラス名をプラグインに渡すだけです。あとはプラグインがやってくれます。FooterID は、フッターのマークアップを含むページ上の要素です。これは、ページネーションをフッターとして使用する場合に使用されます。
ページに複数のテーブルがある場合は、固定ヘッダーが必要な各テーブルでも機能します。
ここでチェックしてください:http://fixedheadertable.mmalek.com/
まだ「ベータ版」であることを覚えておいてください。新しい機能とバグ修正を毎日追加しています。
対応ブラウザ:IE6、IE7、IE8、FireFox、Safari、Chrome
解決策は本当に簡単です。3 つの DIV が必要です: 一般的なコンテナー (私の場合はクラス "outer")、テーブル コンテナー (私の場合はクラス "inner")、および jQuery または javaScript を使用して既存のテーブルのクローンを作成する DIV (クラス「ヘッダー」の場合)。
ソリューションは、CSS と数行の jQuery コードを使用して、"inner" の HTML を "header" に複製し、その幅と高さを設定します。固定および可変の列幅をサポートします。IE8、Firefox 9、Safari、Google Chrome でテスト済み。
サンプルコードは次のとおりです。
$(document).ready(function() {
$('.header').html( $('.inner').html() );
$('.header').css('width', $('.inner table').outerWidth() );
$('.header').css('height', $('.inner table thead').outerHeight() );
});
table {
width:100%;
}
th {
border-top:1px solid #999;
text-align:left;
}
td, th {
border-bottom:1px solid #999;
background-color:#EEE;
}
.outer {
position:relative;
width:500px;
}
.inner {
height:150px;
overflow:auto;
}
.header {
position:absolute;
top:0;
left:0;
overflow:hidden;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="outer">
<div class="inner">
<table cellspacing="0" cellpadding="0">
<thead>
<tr>
<th>a</th>
<th>b</th>
<th>c</th>
<th>d</th>
</tr>
</thead>
<tbody>
<tr><td>1</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>2</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>3</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>4</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>5</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>6</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>7</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>8</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>9</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>10</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>11</td><td>b</td><td>c</td><td>d</td></tr>
<tr><td>12</td><td>b</td><td>c</td><td>d</td></tr>
</tbody>
</table>
</div>
<div class="header">
</div>
</div>
</body>
javascriptを使用した基本的な解決策は次のとおりです。
function position(table) {
table.rows[0].style.position="absolute";
table.rows[0].style.top="0px";
table.style.marginTop = table.rows[0].clientHeight/1.2;
var widths = Array();
for(var i = 0; i < table.rows[0].cells.length; i++) {
widths[i] = max(table.rows[0].cells[i].clientWidth, table.rows[1].cells[i].clientWidth);
}
for(var row = 0; row < table.rows.length; row++) {
for(var col = 0; col < widths.length; col ++) {
table.rows[row].cells[col].style.width = widths[col] + "px";
}
}
}
function max(num1, num2) { return (num1 > num2) ? num1 : num2; }
スクロール可能なdivの外側にヘッダーを配置する必要があります。div内のすべてがスクロールします。
編集
別のヘッダーを使用する場合の幅については、いくつかの解決策があります。
- これが動的コンテンツであると仮定して、文字列の長さに基づいて「固定」幅を生成します。明らかにEMの観点から指定し、エラーの許容範囲を残します。
- javascriptを使用します。
- 固定幅の列を使用します。
私は実際に最初の試みをしていません、そしてそれは物事を少し複雑にしすぎているかもしれません。ただし、効果が必要な場合は試してみてください。
また、これをすでに実行しているテーブルウィジェットを備えたjavascriptライブラリがおそらく存在することにも言及する必要があります。彼らがそれをどのように行うかを見るために彼らを見てください。
データのテーブルに関するヘッダーを含むテーブルを配置する必要があります。table-layout:fixed で列幅を維持できます。JavaScript を使用して列幅を一致させることができます。
実際にやりたいことは<tbody>
、データ テーブルの をスクロール可能にすることです。そのため、<thead>
と<tfoot>
は自然に固定されたままになります。
これはFFなどにとっては些細なことですが:
tbody
{
height: 100px; /* or whatever */
overflow: auto;
overflow-y: auto;
overflow-x: hidden;
}
IE には、一般的に tbody に関する深刻で複雑な問題があります。式で解決できますが、自明ではなく、デザインに固有のものです。
jQuery プラグインStupid Fixed Headerを試すことができます。手法は基本的に同じです。ヘッダーを複製して、テーブル レイヤーの上に配置します。
私はこれをテストしていませんが、おそらくテーブルを 2 回 (ヘッダーで 1 回、スクロール div で 1 回) 生成できます。次に、ヘッダーで、見出し行を除くすべての行を非表示にします。おそらく「display: none」を使用するか、高さをゼロに設定します。
包括的なクロスブラウザー実装を探している場合は、YUI Data Table を参照してください。これは、列幅が一致する別のテーブルを作成することで行われると思います。
列幅を固定するにはコツが必要なようです。私の記憶が正しければ、Firefox には <col/> タグが必要です。
いずれにせよ、YUI DataTable (50k 行) には多くのトリックが採用されていました。それを見て、これで自分でどこまで行きたいかを決めることをお勧めします.