« ◇ダークマターの量の歴史 | トップページ | ◇宇宙膨張速度は加速する「はず」;ダークエネルギー不要 »

TABLEヘッダを隠さず縦横スクロール

原子番号
元素 英語 記号 原子量
1
2
3
4
5
6
7
8
9
10
11
12
13
水素 Hydrogen H 1.00794 (7)
ヘリウム Helium He4.002603 (2)
リチウム Lithium Li[6.941 (2)]
ベリリウムHelirm Be9.012182 (3)
ホウ素 Boron B 10.811 (7)
炭素 Carbon C 12.0107 (8)
窒素 NitorogenN 14.0067 (2)
酸素 Oxygen O 15.9994 (3)
フッ素 Fluorine F 18.9984032 (5)
ネオン Neon Ne20.1797
ナトリウムSodium Na22.98976928 (2)
マグネシウムMagnesiumMg 24.3050 (6)
アルミニウムAlminiumAl26.9815386 (8)

 データ部が上下左右にスクロールするテーブル

データ部のみが上下にスクロールするテーブルの作成例を ◇データ部だけスクロールするTABLE;HTMLメモに作成してあります。
今回は上下左右にスクロールするテーブルです。

上のテーブルは以下のコードで出しています。

<style type="text/css">
/* 基本のテーブル定義 */
table.t {border:1px solid   #000000;border-collapse:collapse;table-layout:fixed;font-size:16px}
table.t td{border:1px solid #000000;height:16px;}
table.t th{border:1px solid #000000;font-size:16px}
table.t th{background-color:#FFBB88;color:#000000;}
table.t tr:nth-child(odd)  td{background-color:#C8C8E8;color:#000000;}
table.t tr:nth-child(even) td{background-color:#E8E8FF;color:#000000;}
/*
  データ域        90×3+110 = 380
  +スクロール域  +16       = 396
  +垂直ヘッダ    +90       = 486
  スクロール範囲      (w×h) 280×130
  バー付データ部サイズ(w×h) 296×145  (バー v16:h15)
  ヘッダを含むサイズ  (w×h) 386×167  (ヘッダ1行18px)
 */
[name="T"] {width:360px;}
[name="T"]  th{width:90px}
[name="T"]  td{width:90px}
[name="T"]  th:nth-child(4){width:110px}
[name="T"]  td:nth-child(4){width:110px}
[name="TV"] th{width:90px}

#header_h {
   position: absolute;left:90px;top:0px;
   width:280px;
   overflow-x:hidden;overflow-y:hidden;
   }
#header_v {
   position: absolute;left:0px;top:22px;
   width:90px;height:130px; 
   overflow-x:hidden;overflow-y:hidden;
   }
#data {
   position: absolute;left:90px;top:22px;
   overflow-x:scroll;overflow-y:scroll;
   width:296px;height:145px;
   }
</style>
</head>
<body>

<div id="zentai" style="position:relative;width:386px;height:167px;
                       background-color:#CCCCCC;border:1px solid #000000">
<table class=t  style="width:90px;position:absolute;left:0px;top:0px;">
<tr><th>原子番号</th></tr> <!-- 固定ヘッダ -->
</table>

<div id="header_h">                                      
<table class=t name="T"> <!-- 水平ヘッダ -->
<tr>
<th>元素</th>
<th>英語</th>
<th>記号</th>
<th>原子量</th>
</tr>
</table>
</div>

<div id="header_v">                         
<table class=t name="TV"> <!-- 垂直ヘッダ -->
<tr><th>1</th></tr>
<tr><th>2</th></tr>
<tr><th>3</th></tr>
<tr><th>4</th></tr>
<tr><th>5</th></tr>
<tr><th>6</th></tr>
<tr><th>7</th></tr>
<tr><th>8</th></tr>
<tr><th>9</th></tr>
<tr><th>10</th></tr>
<tr><th>11</th></tr>
<tr><th>12</th></tr>
<tr><th>13</th></tr>
</table>
</div>

<div id="data">
<table class=t name="T">
<tr><td>水素</td>      <td>Hydrogen</td> <td>H</td> <td>1.00794 (7)</td></tr>
<tr><td>ヘリウム</td>  <td>Helium</td>   <td>He</td><td>4.002603 (2)</td></tr>
<tr><td>リチウム</td>  <td>Lithium</td>  <td>Li</td><td>[6.941 (2)]</td></tr>
<tr><td>ベリリウム</td><td>Helirm</td>   <td>Be</td><td>9.012182 (3)</td></tr>
<tr><td>ホウ素</td>    <td>Boron</td>    <td>B</td> <td>10.811 (7)</td></tr>
<tr><td>炭素</td>      <td>Carbon</td>   <td>C</td> <td>12.0107 (8)</td></tr>
<tr><td>窒素</td>      <td>Nitorogen</td><td>N</td> <td>14.0067 (2)</td></tr>
<tr><td>酸素</td>      <td>Oxygen</td>   <td>O</td> <td>15.9994 (3)</td></tr>
<tr><td>フッ素</td>    <td>Fluorine</td> <td>F</td> <td>18.9984032 (5)</td></tr>
<tr><td>ネオン</td>    <td>Neon</td>     <td>Ne</td><td>20.1797</td></tr>
<tr><td>ナトリウム</td><td>Sodium</td>   <td>Na</td><td>22.98976928 (2)</td></tr>
<tr><td>マグネシウム</td><td>Magnesium</td><td>Mg</td> <td>24.3050 (6)</td></tr>
<tr><td>アルミニウム</td><td>Alminium</td><td>Al</td><td>26.9815386 (8)</td></tr>
</table>
</div>

</div>
<script type="text/javascript">
function $E(name){ return document.getElementById(name); }
function scroll(){
   $E("header_h").scrollLeft= $E("data").scrollLeft;// データ部のスクロールをヘッダに反映
   $E("header_v").scrollTop = $E("data").scrollTop;// データ部のスクロールをヘッダに反映
   }
$E("data").onscroll=scroll;
</script>

次のパートに分けて組み合わせています。

  • 水平ヘッダ部(データ部に合わせスクロール)
  • 垂直ヘッダ部(データ部に合わせスクロール)
  • データ部(水平垂直スクロール)
  • 固定ヘッダ

データ部でスクロールイベントが発生するとscroll関数で垂直ヘッダ部、垂直ヘッダ部に 反映させています。

   $E("header_h").scrollLeft= $E("data").scrollLeft;

水平ヘッダのカラム長とデータ部のカラム長は名前(ここでは"T")で同じcss定義 を参照しています。

   [name="T"] {width:360px}
   [name="T"]  th{width:90px}
   [name="T"]  td{width:90px}
   [name="T"]  th:nth-child(4){width:110px}
   [name="T"]  td:nth-child(4){width:110px}

 divとtable

部品をこのように並べるには本来<table>が適切です。

ところが残念なことに<tableのセル内にdivを置くと隙間の 制御がうまくできませんでした。

今回はしかたなく原始的な<div>で位置決めをして配置しています。

HTML5ではこのような配置のために新たにGridLayoutというものを 決めようとしています。

そんな愚かなことはやめ、<table>をブラッシュアップすべきです。

HTML5のtable嫌いはまともではありません。もはや狂っています。怪しい宗教です。

はやく正気を取り戻してください、

|

« ◇ダークマターの量の歴史 | トップページ | ◇宇宙膨張速度は加速する「はず」;ダークエネルギー不要 »

トラックバック


この記事へのトラックバック一覧です: TABLEヘッダを隠さず縦横スクロール:

« ◇ダークマターの量の歴史 | トップページ | ◇宇宙膨張速度は加速する「はず」;ダークエネルギー不要 »