すべての列を折りたたむ


385

tdタグをすべての列にまたがるように指定するにはどうすればよいですか(テーブル内の列の正確な数が可変で、HTMLがいつレンダリングされるかを決定するのが難しい場合)?w3schoolsはを使用できると述べていますがcolspan="0"、どのブラウザーがその値をサポートしているかを正確に示していません(IE 6はサポートするリストにあります)。

colspan理論上の列数よりも大きい値に設定しても機能するようですが、にtable-layout設定した場合は機能しませんfixed。多数の自動レイアウトを使用することの欠点はありますcolspanか?これを行うより正しい方法はありますか?


受け入れられた答えは、これを行わない方法についてであり、深刻なパフォーマンス/一貫性の欠点があるようです。だから私は答えが推測します:列の数をハードコードします。実行可能な代替案はありません。
Andrew Koster

回答:


268

IE 7.0、Firefox 3.0、Chrome 1.0を使用しています

TDのcolspan = "0"属性は、上記のブラウザのすべてのTDにまたがっていません

おそらく適切なマークアップの実践としてはお勧めできませんが、可能な合計よりも高いcolspan値を指定した場合はできません。他の行の列の場合、TDはすべての列にまたがります。

これは、table-layout CSSプロパティがfixedに設定されている場合は機能しません。

繰り返しますが、これは完璧な解決策ではありませんが、テーブルレイアウトのCSSプロパティが自動の場合、上記の3つのブラウザーバージョンで機能するようです。お役に立てれば。


html Firefox 3の最初で厳格なdoctypeを指定すると、html 4.01仕様で要求されるとおりにcolspanがレンダリングされます。
Eineki 2008

253
私はcolspan="42"全範囲にわたるファンです。明らかにこれは42カラムを超える場合の問題ですが、私が認めている数少ないマジックナンバーの1つです。
マーティンカーニー2013年

40
colspan = <正確な数値>を使用することを強くお勧めします。私はFirefoxの巨大なパフォーマンスバグにぶつかっただけで、1日中理解することができました。任意の大きなcolspanは、border-collapse:collapseを使用して大きなテーブルでFFチョークを発生させます。800行8列のテーブルのレンダリングに5秒かかりました。正しいcolspanで、それは妥当な1秒に戻ります。bugzilla.mozilla.org/show_bug.cgi?id=675417
InfinitiesLoop

2
この方法は使用しないことをお勧めします。OSX上のChromeから非常に奇妙な結果を得た(列が互いに重なり合っている)。
Tzach 2014年

「特大」のTDを含むTR要素に境界線を付けようとすると、Chromeで別の問題が見つかり、右の境界線が表示されなくなります。
Massimo、

272

これを使うだけです:

colspan="100%"

Firefox 3.6、IE 7、Opera 11で動作します!(そして私は他の人に推測し、私は試すことができませんでした)


警告:以下のコメントで述べられているように、これは実際にはと同じcolspan="100"です。したがって、このソリューションは、css table-layout: fixedまたは100を超える列を含むテーブルでは機能しません。


16
IE6-IE8、Chrome [PCとMac]、Firefox 4.0 [PCとMac]、Safari 5 [PCとMac]で[追加]でテスト
hndcrftd

11
これはまだそれほどあいまいですか?これはあらゆる街角で叫ばれるべきです!!! 私はかなり長い間、さまざまなタイミングでこののろわれたcolspanの問題に苦労してきました
hndcrftd

30
chromeとfirefoxでは、colspan = "3%"はcolspan = "3"とまったく同じように処理されます。
zpmorgan

98
@zpmorganと@Sprog、あなたは正しいです!colspan="100%"正確に意味しますcolspan="100"
NemoStein

37
笑、私はようやく、この問題に対する一貫したクロスブラウザソリューションを見つけてとても嬉しかったです。コメントから、これが実際に期待どおりに機能しないものであることがわかりました:(これ以上の投票に値するものではないと思います受け入れられた回答よりも= /
フランシスコ

64

すべての列にまたがる「タイトル」セルをテーブルのヘッダーとして作成する場合は、キャプションタグ(http://www.w3schools.com/tags/tag_caption.asp / https://)を使用できます。 developer.mozilla.org/en-US/docs/Web/HTML/Element/caption)この要素はこの目的のためのものです。これはdivのように動作しますが、テーブルの親の幅全体には及びません(divが同じ位置にあるように(これは家で試してはいけません!))、代わりに、テーブル。国境などのクロスブラウザの問題があります(私には問題ありませんでした)。とにかく、すべての列にまたがるセルのように見せることができます。内で、div要素を追加して行を作成できます。tr要素の間に挿入できるかどうかはわかりませんが、ハッキングになると思います(そのためお勧めしません)。別のオプションは、フローティングdivをいじり回すことですが、それは残念です!

行う

<table>
    <caption style="gimme some style!"><!-- Title of table --></caption>
    <thead><!-- ... --></thead>
    <tbody><!-- ... --></tbody>
</table>

しない

<div>
    <div style="float: left;/* extra styling /*"><!-- Title of table --></div>
    <table>
        <thead><!-- ... --></thead>
        <tbody><!-- ... --></tbody>
    </table>
    <div style="clear: both"></div>
</div>

1
データテーブルの下部にページネーションコントロールを配置するために私が探していたもの。それは完全に動作します。どうもありがとうございました。
コメンカウ2015

5
これは、テーブルの中央にあるすべての列にまたがる場合には機能しません。たとえば、関連する行グループ間の区切り記号によるグループ化などです。(Chrome)
David Hempy

17

部分的な答えとしてcolspan="0"、質問で言及されたに関するいくつかのポイントを次に示します。

tl; drバージョン:

colspan="0"どのブラウザでも機能しません。W3Schoolsは(いつものように)間違っています。HTML 4ではcolspan="0"、これにより列がテーブル全体に広がるはずですが、これは実装されておらず、HTML 4の後に仕様から削除されました。

さらに詳細と証拠:

  • すべての主要なブラウザはそれをと同等として扱いますcolspan="1"

    これを示すデモがあります。お好きなブラウザでお試しください。

    td {
      border: 1px solid black;
    }
    <table>
      <tr>
        <td>ay</td>
        <td>bee</td>
        <td>see</td>
      </tr>
      <tr>
        <td colspan="0">colspan="0"</td>
      </tr>
      <tr>
        <td colspan="1">colspan="1"</td>
      </tr>
      <tr>
        <td colspan="3">colspan="3"</td>
      </tr>
      <tr>
        <td colspan="1000">colspan="1000"</td>
      </tr>
    </table>

  • HTML 4仕様(現在は古くて時代遅れですが、現在この質問が行われたときのことです)colspan="0"、すべての列にまたがるものとして扱う必要があると実際に言っています。

    値ゼロ( "0")は、セルが定義されている列グループ(COLGROUP)の現在の列から最後の列までのすべての列にセルが及ぶことを意味します。

    ただし、ほとんどのブラウザはこれを実装していません。

  • HTML 5.0(2012年に推奨候補になりました)、WhatWG HTMLリビング標準(今日の主要な標準)、および最新のW3 HTML 5仕様にはすべて、上記のHTML 4から引用された表現が含まれていませんcolspan。許可されていません。この表現は3つの仕様すべてに表示されます。

    tdそしてth要素は持っていることがありcolspan、コンテンツの属性は、値がゼロより有効な非負整数大きくする必要があり、指定されました...

    出典:

  • 質問にリンクされているW3Schoolsページからの以下の主張は少なくとも今日では完全に誤りです。

    Firefoxのみがcolspan = "0"をサポートします。これは特別な意味を持っています... [It]ブラウザーにセルを列グループ(colgroup)の最後の列にスパンするように指示します

    そして

    HTML 4.01とHTML5の違い

    無し。

    W3Schoolsが頻繁に不正確であるためにWeb開発者によって侮辱されていることにまだ気付いていない場合は、このレッスンをその理由と考えてください。


4
ははは、便利なAPI機能を実装する人がいないときに完全に削除されるのが好きなのです。すばらしいプロセス。
Andrew Koster

14

IE 6の場合、colspanをテーブルの列数と等しくする必要があります。5つの列がある場合は、次のようになりますcolspan="5"

その理由は、IEがcolspansを異なる方法で処理するためであり、HTML 3.2仕様を使用します。

IEはHTML 3.2定義を実装し、colspan=0として設定しcolspan=1ます。

バグは十分に文書化されています


1
列の数は変動する可能性があります。そのコメントを含めるように質問を更新します。
ボブ

上の段落のアドバイスは理にかなっているようですが、ここでの詳細の多くは完全に正しくないと思います。HTML 3.2仕様では、と言っているcolspanのでなければなりません作るの整数、colspan=0違法。colspan=0として扱われるべきであると明示的に指示している場所はどこにもありませんcolspan=1(ただし、実際にIE 6が行うことは確かです)また、リンクは、あなたがリンクしているフォーラムページのどこにも(もはや?)なく、Google検索結果のほとんど(今?)は、まったく異なる IE 6 colspan関連のバグです。
マークアメリー2018

11

jQueryを使用している場合(または追加してもかまわない場合)、これにより、これらのどのハックよりも作業が効率的に行われます。

function getMaxColCount($table) {
    var maxCol = 0;

    $table.find('tr').each(function(i,o) {
        var colCount = 0;
        $(o).find('td:not(.maxcols),th:not(.maxcols)').each(function(i,oo) {
            var cc = Number($(oo).attr('colspan'));
            if (cc) {
                colCount += cc;
            } else {
                colCount += 1;
            }
        });
        if(colCount > maxCol) { maxCol = colCount };
    });

    return maxCol;

}

実装を簡単にするために、「maxCol」などのクラスで調整する必要があるtd / thを装飾します。これで、次のことができます。

$('td.maxcols, th.maxcols').each(function(i,o) {
    $t = $($(o).parents('table')[0]); $(o).attr('colspan',  getMaxColCount($t));
});

これが機能しない実装を見つけた場合は、答えを非難せず、コメントで説明してください。カバーできる場合は更新します。


1
あなたがバニラJSバージョンを持っているなら素晴らしいでしょう
jpaugh

$(selector)サポートが欠けている、または単に使用したくない一般的なユースケースはありますか?
Rainabba

1
どちらでもない。ここでjQueryが何らかのメリットをもたらすかどうか知りたいだけです。これはかなり高額な前提条件であり、ここでは最小限しか使用されていないように見えます。
jpaugh 2015

けっこうだ。jQueryとAngularの間では、これらのツールがないことはまれなので、デフォルトで使用します。とりあえずバニラバージョンを思いつくのは誰かに任せます。
Rainabba

1
jQueryはやや古くなっているので、es6のバージョン/回答を追加しました(この回答をまったく異なるコードで更新したくありませんでした)。
Sjeiti 2018年

5

別の機能しますが醜い解決策:colspan="100"、ここで100は必要な列の合計よりも大きい値ですcolspan

W3Cによると、このcolspan="0"オプションはCOLGROUPタグでのみ有効です。


colspan = "100"(制限を超えるなど)により、非常に奇妙なテーブルレンダリングが発生する場合があります(テストケースを探してURLを投稿しようとします)
scunliffe

-1です。これは、最後の段落の主張を誤解する限りです。HTML 4では<td>sが許可されますcolspan="0"w3.org/TR/REC-html40/struct/tables.html#adef-colspanを参照)、HTML 5.0では許可さspan="0"れませんcolgroupw3.org/TR/html50/tabular-を参照) data.html#attr-colgroup-spanは、「スパンコンテンツ属性の値は、ゼロより大きい有効な負でない整数である必要がある」と述べています
マークアメリー2018

2

以下は簡潔なes6ソリューションです(Rainbabbaの回答に似ていますが、jQueryがありません)。

Array.from(document.querySelectorAll('[data-colspan-max]')).forEach(td => {
    let table = td;
    while (table && table.nodeName !== 'TABLE') table = table.parentNode;
    td.colSpan = Array.from(table.querySelector('tr').children).reduce((acc, child) => acc + child.colSpan, 0);
});
html {
  font-family: Verdana;
}
tr > * {
  padding: 1rem;
  box-shadow: 0 0 8px gray inset;
}
<table>
<thead>
  <tr>
    <th>Header 1</th>
    <th>Header 2</th>
    <th>Header 3</th>
    <th>Header 4</th>
    <th>Header 5</th>
    <th>Header 6</th>
  </tr>
</thead>
<tbod><tr>
  <td data-colspan-max>td will be set to full width</td>
</tr></tbod>
</table>


-1

私の経験を追加してこれに答えたいだけです。
注:これは、事前に定義されたtabletrwith thがあり、行に(たとえばAJAXを介して)動的にロードしている場合にのみ機能します。

この場合th、最初のヘッダー行にあるの数を数え、それを使用して列全体に広げることができます。

これは、結果が見つからないときにメッセージをリレーする場合に必要になることがあります。

jQueryでの次のようなものtable。入力テーブルはどこですか。

var trs = $(table).find("tr");
var numberColumns = 999;
if (trs.length === 1) {
    //Assume having one row means that there is a header
    var headerColumns = $(trs).find("th").length;
    if (headerColumns > 0) {
        numberColumns = headerColumns;
    }
}

これより前に投稿されたJavaScriptソリューションのように、これは一般化しません。ths の数は必ずしも列の数とは限りません。それらのいくつかはcolspanセットを持っている可能性があるため、これはすべての人のために書かれたようには機能しません。
マークアメリー2018

-2

多分私はまっすぐな思想家かもしれませんが、私は少し困惑しています、あなたはあなたのテーブルの列番号を知りませんか?

ちなみに、IE6はcolspan = "0"を尊重していません。colgroupが定義されていてもいなくてもかまいません。また、theadとthを使用して列のグループを生成しようとしましたが、ブラウザはcolspan = "0"のフォームを認識しません。

私はWindowsおよびLinuxでFirefox 3.0を試してみましたが、厳密なdoctypeでのみ機能します。

あなたはいくつかのクッパでテストをチェックすることができます

http://browsershots.org/http://hsivonen.iki.fi/test/wa10/tables/colspan-0.html

私はここにテストページを見つけましたhttp://hsivonen.iki.fi/test/wa10/tables/colspan-0.html

編集:リンクをコピーして貼り付けてください。フォーマットはリンク内の二重プロトコル部分を受け入れません(または正しくフォーマットするのがあまり賢くない)。


私は最初の部分について同意します。確かに、あなたはあなたが何列に入るつもりのセルがいくつあるかを理解することができますか?他にどのように生成しますか?
nickf 2009

13
必ずしもそうではありませんが、動的に生成されたAJAXテーブルを備えたアプリがあり、列の数はコールバックごとに変わる可能性があります。また、開発時には列の数を「知っている」かもしれませんが、これは変更される可能性があり、これらの1つを見逃すことを知っているだけです
Mad Halfling

11
さらに、後で列を追加する場合、colspanを変更するのを忘れる可能性があります。これは常に最大にすることをお勧めします。
アダム

-2

仕様によると、colspan="0"テーブル幅tdになるはずです。

ただし、これはテーブルに幅がある場合にのみ当てはまります。テーブルには、異なる幅の行が含まれる場合があります。したがって、colgroup定義した場合、レンダラーがテーブルの幅を知っている唯一のケースです。そうでない場合、colspan = "0"の結果は不確定です...

http://www.w3.org/TR/REC-html40/struct/tables.html#adef-colspan

古いブラウザではテストできませんが、これは4.0以降の仕様の一部です...


「これは4.0以降の仕様の一部です」 -いいえ、正確ではありません。これ仕様の一部でしたが、これはHTML 5で削除されcolspan、0のa は違法にされました。どちらw3.org/TR/html50/...(HTML 5.0仕様)とhtml.spec.whatwg.org/multipage/...(最新のWHATWG HTML生活水準)の状態colspanはゼロよりも大きくなければなりません。そして、ここの他の回答で述べたように、ブラウザはあなたが引用した古いHTML 4の動作を実際に実装したことはありません。
マークアメリー2018

-6

「colspan」の代わりに「colSpan」を使用してみてください。IEはcamelBackバージョンを気に入っています...


4
IEを使用し、JavaScriptおよび.setAttribute( 'colSpan'、int);を介して設定する場合のみ。これはIE8で修正されました(標準モードのみ)
scunliffe

1
+1-私はこれを知りませんでした、そしてそれは大きな助けとなりました!colSpanはIE6でも動作するとは思わなかった。
mwilcox 2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.