タイトルをロックして、データ部分を縦スクロール
こんにちは、ゼノフィ渡部です。
一般にデータ系のレイアウトは主にテーブルで作成されることが多いと思います。
通常のテーブル表示ではなく、タイトルをロックし、データ部分が設定した高さに達した場合に縦にスクロールする表示をご紹介いたします。
大きくわけて3つの要素で構成します。
- 外枠部分
- タイトル部分
- データ部分
外枠部分はdivで大枠のボーダー線や幅を指定します。
1 2 3 4 5 6 7 | /* 外枠部分 */ div.y_data_area { width: 600px; border-right: 1px solid #CCC; border-bottom: 1px solid #CCC; border-left: 1px solid #CCC; } |
タイトル部分はテーブルで作成し、下の各データと縦の線とのズレがないように調整します。
データ部分はdivとテーブルで作成します。
まず、div(「<div class="y_scroll_box">」)を作成し、「max-height」で最大の高さを決め、「overflow-x: hidden;」で余計な横スクロールを非表示にし、「overflow-y: scroll;」で縦のスクロールバーが表示されるようにします。
1 2 3 4 5 6 7 8 | div.y_scroll_box { width: 600px; max-height: 100px; height: auto !important; /* IE6 max-height対応 */ height: 100px; /* IE6 max-height対応 */ overflow-x: hidden; /* 横スクロール非表示 */ overflow-y: scroll; /* 縦スクロール */ } |
次に「<div class="y_scroll_box">」の下にもうひとつdivを作成(「<div class="y_hidden">」)し、「overflow: hidden; 」でIE系でデータ部分のテーブルをドラッグした際のズレを防止し、「padding: 0 0 10px;」でスクロール仕切った際の下ボーダーの重なりを防止します。このパディングの値は任意の値でかまいません。
1 2 3 4 | div.y_hidden { overflow: hidden; /* IE系でデータ部分のテーブルをドラッグした際のズレを防止 */ padding: 0 0 10px; /* スクロール仕切った際の下ボーダーの重なりを防止 */ } |
「<div class="y_hidden>」の下にデータ用のテーブルを作成(「<table class="y_data">」)します。
「<table class="y_data">」では「table.y_data td」の「overflow: hidden;」でデータが幅を超えたとき非表示にし、「 white-space: nowrap;」で データの折り返しを防止します。
1 2 3 4 | table.y_data td { overflow: hidden; /* データが幅を超えたとき非表示に */ white-space: nowrap; /* データの折り返しを防止 */ } |
こうすることによってタイトル部分のテーブルとのズレを防止します。
ただこうすると、内容がテーブルのtdを超えた場合に非表示になってしまいますので、tdの中に<p>タグを作成し「<p title="データ">」などとして、カーソルをデータ上に持って行った際にデータが表示されるようにしておきます。
タイトル部分のテーブルとデータ部分のテーブルの幅を指定する際に、「<col style="width: 20%;" />」を採用しています。
各テーブルの幅が違う場合はCSSのクラスで幅を指定するより「col」で縦の列に対して幅を指定すると多くの場合スマートになります。
サンプルではHTML5形式で作成していますので「<col width="20%;" />」ではなく、「<col style="width: 20%;" />」を採用(HTML5ではcolのwidth属性は廃止)しています。
XHTMLでは「<col width="20%;" />」とすると良いでしょう。
表示するデータが多く、縦の画面サイズが決められている場合、このようなテーブルを作成できれば心強いのではないでしょうか。
CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | /* 外枠部分 */ div.y_data_area { width: 600px; border-right: 1px solid #CCC; border-bottom: 1px solid #CCC; border-left: 1px solid #CCC; } /* タイトル部分 */ table.y_data_title { width: 600px; table-layout: fixed; border-collapse: separate; border-spacing: 0; /* tableのcellspacing="0"の代わり */ } table.y_data_title th { border-top: 1px solid #CCC; background: #EEF1F4; } table.y_data_title th, table.y_data_title td { padding: 2px; border-right: 1px solid #CCC; border-bottom: 1px solid #CCC; } table.y_data_title th.r_none, table.y_data_title td.r_none { border-right: none; /* 右ボーダーの重なりを防止 */ } /* データ部分 */ div.y_scroll_box { width: 600px; max-height: 100px; height: auto !important; /* IE6 max-height対応 */ height: 100px; /* IE6 max-height対応 */ overflow-x: hidden; /* 横スクロール非表示 */ overflow-y: scroll; /* 縦スクロール */ } div.y_hidden { overflow: hidden; /* IE系でデータ部分のテーブルをドラッグした際のズレを防止 */ padding: 0 0 10px; /* スクロール仕切った際の下ボーダーの重なりを防止 */ } table.y_data { width: 600px; border-collapse: separate; border-spacing: 0; /* tableのcellspacing="0"の代わり */ table-layout: fixed; /* 内容を固定 */ } table.y_data th, table.y_data td { padding: 2px; border-right: 1px solid #CCC; border-bottom: 1px solid #CCC; } table.y_data td { overflow: hidden; /* データが幅を超えたとき非表示に */ white-space: nowrap; /* データの折り返しを防止 */ } table.y_data td p { margin: 0; /* 余分なマージンを消去 */ } /* IE6 */ table.y_data_title, table.y_data { _border-collapse: collapse; /* IE6がborder-spacing: 0;に対応していないので */ } /* IE7 */ *:first-child+html table.y_data_title, *:first-child+html table.y_data { border-collapse: collapse; /* IE7がborder-spacing: 0;に対応していないので */ } |
HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | <!-- 外枠 --> <div class="y_data_area"> <!-- タイトル --> <table class="y_data_title"> <col style="width: 20%;" /> <col style="width: 20%;" /> <col style="width: 20%;" /> <col style="width: 20%;" /> <col style="width: 20%;" /> <tr> <th>タイトル</th> <th>タイトル</th> <th>タイトル</th> <th>タイトル</th> <th class="r_none">タイトル</th> </tr> </table> <!-- /タイトル --> <!-- データ --> <div class="y_scroll_box"> <div class="y_hidden"> <table class="y_data"> <col style="width: 20%;" /> <col style="width: 20%;" /> <col style="width: 20%;" /> <col style="width: 20%;" /> <col style="width: 20%;" /> <tr> <td><p title="データデータデータデータデータデータデータデータデータ">データデータデータデータデータデータデータデータデータ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td class="r_none"><p title="データ">データ</p></td> </tr> <tr> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td class="r_none"><p title="データ">データ</p></td> </tr> <tr> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td class="r_none"><p title="データ">データ</p></td> </tr> <tr> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td class="r_none"><p title="データ">データ</p></td> </tr> <tr> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td class="r_none"><p title="データ">データ</p></td> </tr> <tr> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td class="r_none"><p title="データ">データ</p></td> </tr> <tr> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td class="r_none"><p title="データ">データ</p></td> </tr> <tr> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td class="r_none"><p title="データ">データ</p></td> </tr> <tr> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td><p title="データ">データ</p></td> <td class="r_none"><p title="データ">データ</p></td> </tr> </table> </div> </div> <!-- /データ --> </div> <!-- /外枠 --> |