
Webページをスクロールしたら<table>の<thead>が上部に固定されるようにしたのですが、
固定された後に下の<td>の横幅がリセットされてしまいました(添付画像参照)。
また、<tr>の幅も変わったようです。
できるだけシンプルな解決策を教えてください。
試したtest.htmlのソースは次の通りです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>てすと</title>
<link rel="stylesheet" href="test.css">
<script src="jquery-2.2.3.min.js" type="text/javascript"></script>
</head>
<body>
<h1>テスト</h1>
<table>
<thead>
<tr>
<th>thead</th><th></th><th></th><th></th>
<th></th><th></th><th></th><th></th>
<th></th><th></th><th></th><th></th>
<th></th>
</tr>
</thead>
<tr>
<td></td><td></td><td></td><td></td>
<td></td><td></td><td></td><td></td>
<td></td><td></td><td></td><td></td>
<td></td>
</tr>
<tr>
<td></td><td></td><td></td><td></td>
<td></td><td></td><td></td><td></td>
<td></td><td></td><td></td><td></td>
<td></td>
</tr>
<tr>
途中省略
</tr>
</table>
<style>
<!--
thead {
width: 1240pt;
position: inherit;
top: 0;
}
-->
</style>
<script type="text/javascript">
<!--
var nav_offset = $('thead').offset().top;
$(window).on('scroll load',function(){
var now_offset = $(window).scrollTop();
if ( now_offset >= nav_offset ) {
$('thead').css('position','fixed');
} else {
$('thead').css('position','inherit');
}
});
-->
</script>
</body>
</html>
test.cssは次の通りです。
@charset "UTF-8";
h1{height:100pt;}
table{table-layout:fixed;width:1240pt;}
th,td{border:solid 5px black;text-align:center;height:100pt;}
th{background-color:red;}
tr:nth-child(2n+1){background-color:blue;}
tr:nth-child(2n+0){background-color:white;}
th:nth-child(1),td:nth-child(1){width:300pt;}
th:nth-child(2),td:nth-child(2){width:70pt;}
th:nth-child(3),td:nth-child(3){width:250pt;}
th:nth-child(n+4),td:nth-child(n+4){width:62pt;}
よろしくお願いします。

A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
`とりあえず、私の示したスタイルシートの該当部分
要素セレクタ[title="対数表"]を変更する。
あなたのtableのtitleをつける。
この二つがセット
ついで、<thead>内の<td>は<th>に変更
任意で、<thead></thead>を<tfoot></tfoot>にしたものを<tbody>の前に置く
それだけで済むはず

回答ありがとうございました。
私のtest.htmlとtest.cssを微修正することで実現できました。
test.htmlに<tbody>を追加し、test.cssに約2行追加して実現できました。
気付くのが遅くなりましたが、おかげさまで、
thead{position:fixed;}のJavascriptを使わず、
CSSだけで実現できることを知り、
そちらの方が確実で便利であることも知りました。
ありがとうございました。
No.5
- 回答日時:
隙間は、
連続する空白類の入力があった場合は1つにまとめてしまう必要がある。( http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html4 … )
によるものです。
だから、font-size:0;
としている。その後td,th内でサイズを改めて指定している。
基本があやふやですね。・・・
とりあえずはサンプルをそのまま使ってごらんなさい。そして、一つ一つのプロパティについて仕様書( http://momdo.s35.xrea.com/web-html-test/spec/CSS … )で確認していく。
またセレクタや軽傷というカスケーディングの仕組みが理解されていないようですが、
table[title="対数表"] * tr{} の詳細度は、0,0,1,2 ですけど・・・
カスケーディングはCSS(カスケーディングスタイルシート)の肝で、プロパティよりはるかに重要で、仕様書でもプロパティより前に書いてある。
5 セレクタ
6 プロパティ値とカスケーディング、継承の割り当て
( http://momdo.s35.xrea.com/web-html-test/spec/CSS … )
とにかく、一度仕様書を通して読んでから、始めたほうが効率的ですよ。
No.4
- 回答日時:
>最初から作り直す必要があるのかなと思っています。
最初から作り直す方法
★すでにHTMLの表(table)がある場合
firefoxのアドオン、Dafizilla Table2Clipboard( https://addons.mozilla.org/ja/firefox/addon/dafi … )を使って表をコピーすると、クリップボードにcsvデータが保存されます。
★エクセルデータの場合
名前を付けて保存でcsvとして保存します。
EmEditor( https://jp.emeditor.com/ --1か月試用できる )などの高機能テキストエディタで、置換をする。
tbodyの範囲を選択して、「選択部分を置換」にチェックをして
[正規表現]を有効にして、置換を繰り返す。
(半角スペース)二個 → 半角スペース1個
をなくなるまで繰り返す。
\n → </td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td>
, → </td><td>
thead部分は、上記<td></td>をthに置換する。
前後を修正して
<table title="任意のわかりやすいもの">
<thead>
・・
</thead>
<tfoot>
・・
</tfoot>
<tbody>
・・
</tbody>
でくくる
文法チェックがすんだら、先のスタイルシートの
table[title="対数表"] をそれに合わせる。
それだけ・・
セルの幅などは自身に合わせて調整・・・よく読めばむつかしくはないはず・・
私はサンプルの対数表常用対数 - Wikipedia( https://ja.wikipedia.org/wiki/%E5%B8%B8%E7%94%A8 … )をfirefoxのtable2clipboardでコピーして、5分もかかっていない。
No.3
- 回答日時:
>display:inline-block; を使う方法ですか…。
それ以前にfixedを使うのはだめですよ。fixedは表示領域に対しての位置決めで、しかも他の要素から完全に独立する。
【引用】____________ここから
fixed
ボックスの位置は'絶対'モデルに従って計算されるが、それに加えて、ボックスはある参照に対して固定される。'絶対'モデルの場合と同じように、ボックスのマージンは他のマージンと相殺しない。handheld、projection、screen、tty、tvメディアタイプの場合、ボックスはビューポートに対して固定され、スクロール時に移動しない。printメディアタイプの場合、ボックスは各ページごとにレンダリングされ、たとえページがビューポートを通して見られる場合でもページボックスに対して固定される(たとえば、印刷プレビューの場合)。他のメディアタイプの場合、見栄えは未定義である。著者はメディアごとに'fixed'を指定したい場合もあるだろう。たとえば、著者が画面上のビューポートの上辺に対してボックスを固定したいが、印刷ページでは固定したくない場合である。2つの仕様は@media規則を用いて分離されてもよい:
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ここまで[Visual formatting model( http://momdo.s35.xrea.com/web-html-test/spec/CSS … )]より
HTMLのtableの仕様部分も読んでおきましょう。
基礎--仕様書---を読んでから、理解して始めないと・・・・。「あちこちの藁の山から針を探す」--説明サイトをつまみ食いしても時間と労力が無駄!!!
数学や理科の勉強と同じ、公式を覚えたり練習問題をいくらやっても成績上がらない。基礎から積み上げていくと、こんな簡単なものないのにね。
サンプルを試されると・・たぶん期待通り。
それでいて、ソースは極めてシンプルで文法チェックも簡単に通ってしまう。
回答ありがとうございます。
Javascriptを使わずに<thead>を固定する方法について、
Webで検索するなどして勉強しているのですが、
私のソースのどこをどのように変えたら良いのか試行錯誤中で、
なかなか理解できず、
最初から作り直す必要があるのかなと思っています。
No.2
- 回答日時:
tableは、ご存知の通り二次元データをユーザーエージェントに関わらず伝達する手段ですから、データとしては、HTML/tableでよいのですが、デザインには制約が多くて利用できません。
またIEはtableの処理がweb標準でないために、それを合わせるのに苦労する。
ということで、そもそもtableのままでデザインするには無理があることはお気づきだと(^^)
それさえ気づけば意外と簡単・・サンプルです。
★タブは_に置換してあるので戻してください。
★Another HTML Lint - Gateway( http://www.htmllint.net/html-lint/htmllint.html# )
で検証済みのHTML5+CSS3です。
<!doctype html>
<html>
<head>
_<meta charset="utf-8">
_<title>サンプル</title>
_<meta name="description" content="">
_<meta name="author" content="ORUKA">
<style media="screen">
<!--
table[title="対数表"]{
_margin-top:2em;
_position:relative;
_width:800px;
}
table[title="対数表"],
table[title="対数表"] thead,
table[title="対数表"] tfoot,
table[title="対数表"] tbody,
table[title="対数表"] tr
{
_display:block;
_font-size:0;
}
table[title="対数表"] tfoot{
_position:absolute;
_bottom:0;
_z-index:10;
_background-color:white;
}
table[title="対数表"] th,
table[title="対数表"] td{
_display:inline-block;
_border:solid 1px gray;
_padding:0.5em;
_font-size:14px;
_width:50px;
}
table tbody{
_height:200px;
_overflow:auto;
}
table[title="対数表"] tr *:nth-child(2){
_width:80px;
}
table[title="対数表"] tr:nth-child(3n) td{
_background-color:aqua;
}
table[title="対数表"] tr th{
_background-color:orange;
}
-->
</style>
</head>
<body>
_<header>
__<h1 id="title">Your title</h1>
__<nav>
___<ul>
____<li><a href="#">Some</a></li>
____<li><a href="#">navigation</a></li>
____<li><a href="#">links</a></li>
___</ul>
__</nav>
_</header>
_<section>
__<table title="対数表">
___<thead>
____<tr>
_____<th>数</th><th>0</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th><th>8</th><th>9</th>
____</tr>
___</thead>
___<tfoot>
____<tr>
_____<th>数</th><th>0</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th><th>8</th><th>9</th>
____</tr>
___</tfoot>
___<tbody>
____<tr>
_____<td>1.0</td><td>.0000</td><td>.0043</td><td>.0086</td><td>.0128</td><td>.0170</td><td>.0212</td><td>.0253</td><td>.0294</td><td>.0334</td><td>.0374</td>
____</tr>
____<tr>
_____<td>1.1</td><td>.0414</td><td>.0453</td><td>.0492</td><td>.0531</td><td>.0569</td><td>.0607</td><td>.0645</td><td>.0682</td><td>.0719</td><td>.0755</td>
____</tr>
____<tr>
_____<td>1.2</td><td>.0792</td><td>.0828</td><td>.0864</td><td>.0899</td><td>.0934</td><td>.0969</td><td>.1004</td><td>.1038</td><td>.1072</td><td>.1106</td>
____</tr>
____<tr>
_____<td>1.3</td><td>.1139</td><td>.1173</td><td>.1206</td><td>.1239</td><td>.1271</td><td>.1303</td><td>.1335</td><td>.1367</td><td>.1399</td><td>.1430</td>
____</tr>
____<tr>
_____<td>1.4</td><td>.1461</td><td>.1492</td><td>.1523</td><td>.1553</td><td>.1584</td><td>.1614</td><td>.1644</td><td>.1673</td><td>.1703</td><td>.1732</td>
____</tr>
____<tr>
_____<td>1.5</td><td>.1761</td><td>.1790</td><td>.1818</td><td>.1847</td><td>.1875</td><td>.1903</td><td>.1931</td><td>.1959</td><td>.1987</td><td>.2014</td>
____</tr>
____<tr>
_____<td>1.6</td><td>.2041</td><td>.2068</td><td>.2095</td><td>.2122</td><td>.2148</td><td>.2175</td><td>.2201</td><td>.2227</td><td>.2253</td><td>.2279</td>
____</tr>
____<tr>
_____<td>・</td><td>・</td><td>・</td><td>・</td><td>・</td><td>・</td><td>・</td><td>・</td><td>・</td><td>・</td><td>・</td>
____</tr>
____<tr>
_____<td>9.7</td><td>.9868</td><td>.9872</td><td>.9877</td><td>.9881</td><td>.9886</td><td>.9890</td><td>.9894</td><td>.9899</td><td>.9903</td><td>.9908</td>
____</tr>
____<tr>
_____<td>9.8</td><td>.9912</td><td>.9917</td><td>.9921</td><td>.9926</td><td>.9930</td><td>.9934</td><td>.9939</td><td>.9943</td><td>.9948</td><td>.9952</td>
____</tr>
____<tr>
_____<td>9.9</td><td>.9956</td><td>.9961</td><td>.9965</td><td>.9969</td><td>.9974</td><td>.9978</td><td>.9983</td><td>.9987</td><td>.9991</td><td>.9996</td>
____</tr>
___</tbody>
__</table>
_</section>
_<footer>
__<h2>A nice footer</h2>
_</footer>
</body>
</html>
★表組みの項目部分を固定することができるjQueryプラグイン「jQuery.FixedTable」 | BlackFlag( http://black-flag.net/jquery/20110303-2729.html )
を使う方法もあるのですが、javascriptはそれを停止しているユーザーが多い現状から極力使わないほうが良いでしょう。
引き続き回答ありがとうございます。
display:inline-block; を使う方法ですか…。
使ったことがないので使いこなすのに時間がかかりそうですが、
ちょっと考えてみます。
ありがとうございました。
No.1
- 回答日時:
thead/tfootは、表のヘッダ/フッタを明示するためで、それに伴い長大な表の印刷時に印刷時に各ページに項目行を印刷するためのものです。
スタイルシートでサイズをptで指定されているようですから、印刷用スタイルシートでしょうが、だとすると、fixedなど何もしなくても、各ページの上下にthead/tfootは各ページに固定されます。
<table>
<caption>常用対数表</caption>
<thead>
<tr>
<th>数</th><th>0</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th><th>8</th><th>9</th>
</tr>
</thead>
<tfoot>
<tr>
<th>数</th><th>0</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th><th>8</th><th>9</th>
</tr>
</tfoot>
<tbody>
<tr>
<td>1.0</td><td>.0000</td><td>.0043</td><td>.0086</td><td>.0128</td><td>.0170</td><td>.0212</td><td>.0253</td><td>.0294</td><td>.0334</td><td>.0374</td>
</tr>
<tr>
<td>1.1</td><td>.0414</td><td>.0453</td><td>.0492</td><td>.0531</td><td>.0569</td><td>.0607</td><td>.0645</td><td>.0682</td><td>.0719</td><td>.0755</td>
</tr>
回答ありがとうございます。
印刷のためではなく、縦に異常に長い表をスクロールした時に、
各列が何を表しているか分からなくなるので分かるようにするためです。
また、別の<table><th>を作って、スクロールしたら表示するようにもできますが、
<th>の項目をクリックして並び替えをするJavascriptを利用してまして、
「ablesorterで HTMLの表をソート(並び替え)可能にする」
http://allabout.co.jp/gm/gc/434260/
その機能を維持するために、同じ<table>内の<th>を見えるようにしておく必要があります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
- HTML・CSS テーブルタグのセルの幅の一部だけを指定 1 2023/03/12 12:02
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript jQueryで同じクラス名のものを別物として扱いたい 1 2022/06/17 14:14
- HTML・CSS 【CSS】:hasで可能? imgを含むtr要素を選択したい 1 2022/11/17 14:36
- HTML・CSS 自身のHPにYouTube動画を貼り付けるのが出来なくなり困ってます 1 2022/11/11 10:44
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- 工学 【制御工学】単位ステップ応答の遅れ時間の求め方(令和2年度の機械設計技術者試験(制御工学)の問題) 3 2022/11/02 10:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブルの任意の列を非表示に...
-
テーブルの行を折りたたみたい...
-
TRタグの余白をcssで設定するには
-
文字列が入っているtdを削除せ...
-
テーブルのセルに画像をピッタ...
-
tableにul,または,olを入れられ...
-
<TABLE>の<TD>タグの幅指定につ...
-
ASP GridViewで1レコード2行を...
-
表組の均等割り付け
-
マウスカーソルを乗せた時にテ...
-
テーブルタグのセルの幅の一部...
-
テーブル結合 縦横両方するには?
-
テーブルのヘッダとボディの幅...
-
EXCELからhtmlへの変換で罫線が...
-
テーブルをスクロールさせると...
-
CSSだけで<table>の<td>や<tr>...
-
チェックボックスが複数チェッ...
-
テーブルの表示がずれます
-
値が0なら非表示にしたい
-
divの中にtableを入れています...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブルの行を折りたたみたい...
-
TRタグの余白をcssで設定するには
-
テーブルの任意の列を非表示に...
-
tableにul,または,olを入れられ...
-
テーブルのセルに画像をピッタ...
-
cssで、表示されるテキストによ...
-
中に<table></table>が使えるア...
-
ホームページ 表の上の余白を...
-
tableの要素(tr、td)に一...
-
tableでcolspanを使うと次行以...
-
テーブルの表示がずれます
-
文字列が入っているtdを削除せ...
-
逆L字の表(table)組み
-
テーブルのヘッダとボディの幅...
-
CSSだけで<table>の<td>や<tr>...
-
EXCELからhtmlへの変換で罫線が...
-
tdなどの閉じタグは省略しても...
-
テーブルタグのセルの幅の一部...
-
HTMLのテーブルで桁をそろ...
-
不要な余白を削除する方法を教...
おすすめ情報
<colgroup>を使うことで<td>の幅については改善できました。
しかし、<th>の幅が変わってしまうことは改善できません。
その件については、別に質問しました。
「<table>の<thead>をposition:fixed;にすると<th>の幅が変わってしまう。」
https://oshiete.goo.ne.jp/qa/9274501.html
こちらでは<colgroup>を使う方法以外での改善策を引き続き求めます。
Javascript(と、その結果による thead{position:fixed;} )を使わず、
CSSだけで<thead>を固定する方法で、
添付画像の状態までは持って行けました。
微妙にずれている(添付画像は縮小されてるので分かりにくい)のですが、
本番ではborderで<th>や<td>を区切らずに間隔を0にするので、
見た目ではほとんど分からないようにできそうです。
まだ、cssのどの部分が重要で、どの部分が無駄かが分かってませんが、
何とかなりそうです。
ありがとうございました。
書き忘れましたが、もちろん、
不要な<style>から</script>までをtest.htmlから削除しました。