
No.3ベストアンサー
- 回答日時:
ソースを修正してみました。
変更点ですが、
1.セルが勝手に縮まらないようにヘッダーのテーブルサイズを固定しました。
2.ヘッダーのスクロール方法を変更しました。
scrollTopで移動できるのは、overflow:scroll;の記述がある場合のみです。
overflow:scroll;をつけるのは製作の意図と違うと勝手に解釈して、ヘッダーブロックの表示位置をlayerからの相対位置でずらす方法に変更しました。
その方法ですが、layerにもうひとつDIVをはさみ、DIVの相対位置をずらすことで、スクロールについていくようにしました。
以下ソースです
<html>
<head>
<script language="JavaScript">
function initialize(){
var data = document.getElementById("data");
var header = document.getElementById("header");
var cell = data.rows[0].cells;
var wkWidth;
for(var i=0; i<cell.length; i ++){
wkWidth = cell[i].offsetWidth;
header.rows[0].cells[i].width = wkWidth ;
cell[i].width = wkWidth ;
}
//↓↓↓ 1.ヘッダーのサイズを固定しました
header.style.width = data.offsetWidth;
document.getElementById("layer").style.width = "585px";
document.getElementById("region").style.width = "600px";
}
//↓↓↓ 2.ヘッダーの表示方法をDIVの相対位置を変えることで行うようにしました
function SlideHeader() {
//regionがスクロールした分だけDIVの表示位置をマイナスしています
document.getElementById("ViewSpace").style.left = (document.getElementById("region").scrollLeft * (-1)) + "px";
}
</script>
</head>
<body onload="initialize();">
<div id="layer" style="border:1px; overflow-x:hidden; overflow-y:hidden;">
<!-- 新たにDIVをはさみました。
layerに対して相対位置表示できるようにしています。
このDIVの相対位置を、をregionが右にスクロールした分だけ左に動かします。-->
<div id="ViewSpace" style="top:0px; left:0px; position:relative;">
<table id="header" style="margin:0px;" rules="all" border="1">
<tr><td>1</td><td>2</td><td>3</td></tr>
</table>
</div>
</div>
<!-- onScrollを変更しています -->
<div id="region" style="height:80px; overflow-x:scroll; overflow-y:scroll" onScroll="SlideHeader()">
<table id="data" style="margin:0px;" rules="all" border="1">
<tr><td>ABCDEFABCDEFABCDABCDEFABCDEF</td><td>ABCDEFABCDEFABCEFABCDEFABCDEF</td><td>ABCDEFABCDEFABCDEFABCDEF</td></tr>
</table>
</div>
</body>
</html>
この回答への補足
ありがとうございます。
なるほど、この方法なら実現できそうです。感謝します。
最終的にdata部分に折り返しが入った場合に、問題がありましたので先に幅設定を
することで回避しています。
function initialize(){
var data = document.getElementById("data");
var header = document.getElementById("header");
var cell = data.rows[0].cells;
var wkWidth;
document.getElementById("layer").style.width = "485px";
document.getElementById("region").style.width = "500px";
for(var i=0; i<cell.length; i ++){
wkWidth = cell[i].offsetWidth;
header.rows[0].cells[i].width = wkWidth;
cell[i].width = wkWidth ;
}
//↓↓↓ 1.ヘッダーのサイズを固定しました
header.style.width = data.offsetWidth;
}
すばらしい!!
ありがとうございます。とても助かりました。
実現できない場合は、n行おきにヘッダーを挿入する必要があったため。
セル結合しているものを分断するという複雑な処理を実装せねばなりま
せんでした。(必ず1画面にひとつはヘッダーがあることの保証も難しい)
もう少し検証し問題なければ導入に踏み切ろうと思います。勉強になりま
した。すばやい回等、重ね重ね感謝します。
No.2
- 回答日時:
ソース1の場合、テーブルにDIVのサイズを合わせているようです。
ソース2の場合は、DIVのサイズを固定しているようですね。
overflowについてですが、autoと設定すると、ブラウザに依存した動作を行います。
layerの場合、overflow:auto;としていますので、ヘッダーのテーブルに空白がある分を勝手に削ってしまい、折角設定したセルの幅を勝手に縮められています。
しかしregionの場合、overflow-x:scroll; overflow-y:scroll;がありますので、表示できなかった部分はスクロールで表示し、勝手にセルを縮めたりはしません。
よってヘッダーとデータのセルの幅に違いが出てきてしまいます。
ソース1がうまくいっている要因としては、テーブルにDIVのサイズをあわせているので、勝手に縮める必要がないからです。
で、ここから質問なのですが、ヘッダーとデータのセルの幅を合わせる方法として、
1.ヘッダーもoverflow:scroll;として、データのセルに大きさをあわせる
2.データのセルを折り返しで出力して、ヘッダーのセルに大きさをあわせる
の2通り考えられると思います。
どちらがいいのでしょうか?
この回答への補足
回等ありがとうございます。助かります。
欲しいのは、1?になります。間違いないように、欲しいものを補足説明しますと
要件としては
・1024*768の画面で表示したい。
・横幅は、12ヶ月分のデータ+四半期計+上下期+年度計を表示したい。
→48列あります。折り返しては見難くなるので、幅を固定して表示したい。
表示する(レイヤーの)横幅を固定して、横長の表を見たいのです。
No.1
- 回答日時:
ソース添付ください
この回答への補足
ソース1)
<html>
<head>
<script language="JavaScript">
function initialize(){
var data = document.getElementById("data");
var header = document.getElementById("header");
var cell = data.rows[0].cells;
var wkWidth;
for(var i=0; i<cell.length; i ++){
wkWidth = cell[i].offsetWidth;
header.rows[0].cells[i].width = wkWidth ;
cell[i].width = wkWidth ;
}
with( document.getElementById("region") ){
document.getElementById("layer").style.width = header.offsetWidth + "px";
style.width = header.offsetWidth + "px";
wkWidth = header.offsetWidth + (offsetWidth - data.offsetWidth);
style.width = wkWidth + "px";
}
}
</script>
</head>
<body onload="initialize();">
<div id="layer" style="border:1px; overflow-x:hidden;overflow-y:hidden; overflow:auto;">
<table id="header" style="margin:0px;" rules="all" border="1">
<tr><td>1</td><td>2</td><td>3</td></tr>
</table>
</div>
<div id="region" style="height:80px; overflow-x:scroll; overflow-y:scroll; overflow:auto;" onScroll="layer.scrollLeft = region.scrollLeft;">
<table id="data" style="margin:0px;" rules="all" border="1">
<tr><td>ABCDEFABCDEFABCDABCDEFABCDEF</td><td>ABCDEFABCDEFABCEFABCDEFABCDEF</td><td>ABCDEFABCDEFABCDEFABCDEF</td></tr>
</table>
</div>
</body>
</html>
ソース2)関数内を一部書き換え
//with( document.getElementById("region") ){
//・
//}
document.getElementById("layer").style.width = "585px";
document.getElementById("region").style.width = "600px";
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブルの位置を細かく指定し...
-
テーブルの横に画像を
-
テーブルタグの中にdivを含めて...
-
テーブル内に画像を表示したい。
-
プルダウンの表示位置
-
Safariでテーブルのセルの高さ...
-
ホームページ 表の上の余白を...
-
html でのテキスト結合について
-
colspanを使うと正しく表示でき...
-
テーブル内のセル間にスペース...
-
tableにul,または,olを入れられ...
-
テーブルのセルに画像をピッタ...
-
大量にあるrowspanを分割したい。
-
TRタグの余白をcssで設定するには
-
テーブルとテーブルの間隔について
-
入れ子にしたテーブルをheight1...
-
エクセルで、タグを自動生成
-
tableでcolspanを使うと次行以...
-
テーブルの位置
-
商品詳細を横並びに表示する方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブルタグの中にdivを含めて...
-
テーブルの横に画像を
-
テーブルの位置を細かく指定し...
-
テーブル内に画像を表示したい。
-
ウィンドウのサイズを変えても...
-
2つのテーブルを左右に表示した...
-
DWで、デザインビューに表示さ...
-
HTMLでテーブルを横に並べる方法
-
【CSS】縦横スクロールテーブル...
-
テーブル内でdlタグ使った際の...
-
テーブルの横に文字を置くタグ
-
画像と、セルのつなぎ目に白い...
-
テーブルで可変にしたときの可...
-
tableのheight指定が効かない
-
テーブルの背景を透過する方法
-
画像の横にテーブルを。。。
-
テーブルでスクロールを同期したい
-
テーブルを使ったレイアウトで
-
ホームページ作成中のテーブル...
-
Dreamweaverでテーブルの列幅を...
おすすめ情報