CSSのHTML colspan


251

次のようなレイアウトを構築しようとしています。

+---+---+---+
|   |   |   |
+---+---+---+
|           |
+-----------+

下部が上部の行のスペースを埋めているところです。

これが実際のテーブルであれば、で簡単にこれを実現できますが、<td colspan="3">単にテーブルのようなレイアウトを作成しているだけなので、<table>タグを使用できません。これはCSSを使用して可能ですか?


8
最善の解決策は、実際にテーブルに何が入っているかに依存します。データ(テーブルに属するもの)の場合は、テーブルを使用します。テーブルを使用してページのレイアウトを制御している場合は、以下のHTML + CSSソリューションのいずれかが適しています。
mwcz

両方の場合にマークアップを追加し、メディアクエリCSSクラスを使用して一度に1つだけ表示します。
DigitalDesignDj

2
CSSについては忘れてください。表形式のデータを表示すると、データが何列にまたがるかがわかります。colspan属性を使用する
Tihomir Mitkov

私はこれをブートストラップまたはブートストラップからカスタマイズされたグリッドで行います
Arun Prasad ES

CSS3を使用している場合は、columnSpanを使用できます。<td colspan = "#">とは異なり、列数を設定するオプションはありませんが、すべての列にまたがることができます。 w3schools.com/cssref/css3_pr_column-span.asp
MistyDawn

回答:


407

には、シンプルでエレガントなCSSアナログはありませんcolspan

このまさに問題を検索すると、絶対配置、サイズ設定、ブラウザや状況固有のさまざまな警告に加えて、さまざまな代替案を含むさまざまなソリューションが返されます。読んだ内容に基づいて、情報に基づいた最善の決定を下します。


10
テーブルは構造的な要素であり、colspanを使用してその外観を変更したからといって、必ずしもそうではありません。CSSは要素のスタイルを設定するために使用され、構造は変更されません。W3Cはここでテーブル構造について議論します: w3.org/TR/html401/struct/tables.html#h-11.2
Rob

88
ロブ、あなたの立場を理解しますが、W3Cの推奨事項、特にテーブルパラダイム全体に関連するものを見ると、それらの考慮事項の一部が、おそらくテーブルのプレゼンテーションであることがわかります。テーブルは構造が純粋に現代のフィクションであると考えられていたというこの考えは、私たち全員が拡散をやめた方がいいと思います。ポイントは、テーブルについて独断的であるのをやめる必要があるということです。それらが常にプレゼンテーションであると言うのは私にとって間違っているでしょうし、あなたがそれらが常に構造であると言うのも同じように間違っています。現実は、単純にそのような単純なものではありません。
デビッド

4
あなたの答え人気のある答えのようです。:)私は(私が買収した)対表のドグマが厳しすぎることを知ってうれしいです。colspan仕事に適したツールであると私が思う限り、私は自分の答えを待機します。私の答えは75%正解で、あなたの答えは100%正解です。SOに戻る必要があります。
mwcz 2012年

71
2年後、ググって作者に投票したかったのですが、「自分の投稿には投票できない」と書いてありました。より良い情報があると感じたので、受け入れられたソリューションをこのソリューションに変更することにしました。
タワー

14
これは、他の(不特定の)回答についてのミニエッセイであり、尋ねられた質問に対する回答ではありません。
Jukka K. Korpela 14年

56

私の知る限りcssにはcolspanはありませんcolumn-spanが、近い将来に複数列のレイアウトに対応する予定ですが、CSS3のドラフトにすぎないため、ここで確認できます。とにかく、あなたは使用して回避策を行うことができますdivし、spanこのようなテーブルのようなディスプレイで。

これはHTMLです。

<div class="table">
  <div class="row">
    <span class="cell red first"></span>
    <span class="cell blue fill"></span>
    <span class="cell green last"></span>
  </div>
</div>
<div class="table">
  <div class="row">
    <span class="cell black"></span>
  </div>
</div>

そして、これはCSSになります:

  /* this is to reproduce table-like structure
     for the sake of table-less layout. */
  .table { display:table; table-layout:fixed; width:100px; }
  .row { display:table-row; height:10px; }
  .cell { display:table-cell; }

  /* this is where the colspan tricks works. */
  span { width:100%; }

  /* below is for visual recognition test purposes only. */
  .red { background:red; }
  .blue { background:blue; }
  .green { background:green; }
  .black { background:black; }

  /* this is the benefit of using table display, it is able 
     to set the width of it's child object to fill the rest of 
     the parent width as in table */
  .first { width: 20px; }
  .last { width: 30px; }
  .fill { width: 100%; }

このトリックを使用する唯一の理由は、table-layout振る舞いの利点を得るためです。divとspanの幅を特定のパーセンテージに設定しただけでは設計要件を満たせなかった場合は、それをたくさん使用します。

しかし、あなたがそのtable-layout振る舞いから利益を得る必要がないなら、duriraiの答えはあなたに十分に合うでしょう。


4
うん、少し修正:の代わりに、.span { ...それはする必要がありますspan { ...
Slavik Meltser、

2
divタグを使用して表形式データを表示するのは、tablesを使用してページレイアウトを制御するのと同じくらい悪い
Tihomir Mitkov

1
@TichomirMitkovは、レスポンシブデザインを使用してレイアウトを変更しているかどうかに依存します。その場合、これは非常にうまく機能することがあります。
Simon_Weaver 2016

4
あなたが与えた例では基本的に2つのテーブルがお互いに続いているので、これは実際には質問に答えません。(クラス「テーブル」のIetwo div)

21

別の提案は、テーブル全体ではなくflexboxを使用することです。もちろん、これは「モダンなブラウザ」ですが、2016年です。

元の投稿は2010年からだったので、少なくともこれは今日これに対する答えを探している人のための代替ソリューションかもしれません。

ここに素晴らしいガイドがあります:https : //css-tricks.com/snippets/css/a-guide-to-flexbox/

.table {
  border: 1px solid red;
  padding: 2px;
  max-width: 300px;
  display: flex;
  flex-flow: row wrap;
}
.table-cell {
  border: 1px solid blue;
  flex: 1 30%;
}
.colspan-3 {
  border: 1px solid green;
  flex: 1 100%;
}
<div class="table">
  <div class="table-cell">
    row 1 - cell 1
  </div>
  <div class="table-cell">
    row 1 - cell 2
  </div>
  <div class="table-cell">
    row 1 - cell 3
  </div>
  <div class="table-cell colspan-3">
    row 2 - cell 1 (spans 3 columns)
  </div>
</div>


8
<div style="width: 100%;">
    <div style="float: left; width: 33%;">Row 1 - Cell 1</div>
    <div style="float: left; width: 34%;">Row 1 - Cell 2</div>
    <div style="float: left; width: 33%;">Row 1 - Cell 3</div>
</div>
<div style="clear: left; width: 100%;">
Row 2 - Cell 1
</div>

セルの幅がわかりません。
タワー

1
その後、幅を入れないでください。それは問題ではありません。ただし、同じ幅に広げたい場合は、2つのメインdivの幅を同じにする必要があります。
ダスティンレイン

1
width:calc(100%/ 3)を使用できます。これは、中央に1%を追加するよりも少し優れています
ii iml0sto1

5

それはCSSの範囲の一部ではありません。 colspanページのコンテンツの構造を説明するか、HTMLの役割であるテーブル内のデータに何らかの意味を与えます。


OPは、「テーブルのようなレイアウトを作成する」と明示的に言及していますが、構造的な意味はありません。CSSテーブルの目的そのものではないでしょうか。colspanプロパティをテーブル全体とは異なる方法で処理する客観的な理由はありません。デザイン専用のCSSテーブル要素がある場合、デザイン専用のCSS colspanプロパティではないのです…
Skippy le Grand

2
この質問に対するトップ投票の回答をご覧ください。あなたの感情はすでにそこで議論されており、私はそれに同意する傾向があります。私がこの回答を書いてから5年間で、この問題に対する私の見方は明らかに変わりました。
mwcz

4

最新の回答を提供するには:今日これを行う最善の方法は、次のようなcssグリッドレイアウトを使用することです。

.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: auto;
  grid-template-areas: 
    "top-left top-middle top-right"
    "bottom bottom bottom"
}

.item-a {
  grid-area: top-left;
}
.item-b {
  grid-area: top-middle;
}
.item-c {
  grid-area: top-right;
}
.item-d {
  grid-area: bottom;
}

とHTML

<div class="item-a">1</div>
<div class="item-b">2</div>
<div class="item-c">3</div>
<div class="item-d">123</div>

3

あなたはhttp://960.gs/のようなグリッドシステムを使用してみることができます

「12列」のレイアウトを使用している場合、コードは次のようになります。

<div class="container_12">
<div class="grid_4">1</div><div class="grid_4">2</div><div class="grid_4">3</div>
<div class="clear"></div>
<div class="grid_12">123</div>
</div>

3

display: table-cell; width: 1%;テーブルのセル要素に追加してみてください。


それはどのように役立ちますか?テーブルの基本的な概念は、すべての行に同じセルがあることです。行の1つに「width:1%」を正常に実装するセルがある場合、すべての行の列は「width:1%」になります。「colspan」のポイントは、固定幅の列を2つ(またはそれ以上)取り、それらを結合して結合された幅を取得することです。
IAM_AL_X

3

私はいくつかの成功を収めましたが、それは機能するためにいくつかのプロパティに依存しています:

table-layout: fixed border-collapse: separate

簡単に分割/スパンするセルの「幅」、つまり25%幅の4 xセル:

.div-table-cell,
* {
  box-sizing: border-box;
}

.div-table {
  display: table;
  border: solid 1px #ccc;
  border-left: none;
  border-bottom: none;
  table-layout: fixed;
  margin: 10px auto;
  width: 50%;
  border-collapse: separate;
  background: #eee;
}

.div-table-row {
  display: table-row;
}

.div-table-cell {
  display: table-cell;
  padding: 15px;
  border-left: solid 1px #ccc;
  border-bottom: solid 1px #ccc;
  text-align: center;
  background: #ddd;
}

.colspan-3 {
  width: 300%;
  display: table;
  background: #eee;
}

.row-1 .div-table-cell:before {
  content: "row 1: ";
}

.row-2 .div-table-cell:before {
  content: "row 2: ";
}

.row-3 .div-table-cell:before {
  content: "row 3: ";
  font-weight: bold;
}

.div-table-row-at-the-top {
  display: table-header-group;
}
<div class="div-table">

  <div class="div-table-row row-1">

    <div class="div-table-cell">Cell 1</div>
    <div class="div-table-cell">Cell 2</div>
    <div class="div-table-cell">Cell 3</div>

  </div>

  <div class="div-table-row row-2">

    <div class="div-table-cell colspan-3">
      Cor blimey he's only gone and done it.
    </div>

  </div>

  <div class="div-table-row row-3">

    <div class="div-table-cell">Cell 1</div>
    <div class="div-table-cell">Cell 2</div>
    <div class="div-table-cell">Cell 3</div>

  </div>

</div>

https://jsfiddle.net/sfjw26rb/2/

また、display:table-header-groupまたはtable-footer-groupを適用すると、「行」要素を「テーブル」の上部/下部にジャンプできます。


0

divとspanを使用すると、datagrid-table行のボリュームが大きくなると、コードサイズが大きくなります。以下のコードはすべてのブラウザでチェックされます

HTML:

<div id="gridheading">
<h4>Sl.No</h4><h4 class="big">Name</h4><h4>Location</h4><h4>column</h4><h4>column</h4><h4>column</h4><h4>Amount(Rs)</h4><h4>View</h4><h4>Edit</h4><h4>Delete</h4> 
</div>
<div class="data"> 
<h4>01</h4><h4 class="big">test</h4><h4>TVM</h4><h4>A</h4><h4>I</h4><h4>4575</h4><h4>4575</h4></div>
<div class="data"> 
<h4>01</h4><h4 class="big">test</h4><h4>TVM</h4><h4>A</h4><h4>I</h4><h4>4575</h4><h4>4575</h4></div>

CSS:

#gridheading {
    background: #ccc;
    border-bottom: 1px dotted #BBBBBB;
    font-size: 12px;
    line-height: 30px;
    text-transform: capitalize;
}
.data {
    border-bottom: 1px dotted #BBBBBB;
    display: block;
    font-weight: normal;
    line-height: 20px;
    text-align: left;
    word-wrap: break-word;
}
 h4 {
    border-right: thin dotted #000000;
    display: table-cell;
    margin-right: 100px;
    text-align: center;
    width: 100px;
    word-wrap: break-word;
}
.data .big {
    margin-right: 150px;
    width: 200px;
}

0
column-span: all; /* W3C */
-webkit-column-span: all; /* Safari & Chrome */
-moz-column-span: all; /* Firefox */
-ms-column-span: all; /* Internet Explorer */
-o-column-span: all; /* Opera */

http://www.quackit.com/css/css3/properties/css_column-span.cfm


十分なサポートがありません... IE8は残念ながら、依然として進化の
余地のある

9
OPは、table-cell複数のテーブル列にまたがる必要があります。column-span列レイアウトを制御するためのものです。これにより、新聞と同じように、複数の列にテキストを流すことができます。
Chris Wesseling 2013年

1
確かに-これはdisplay:table-cell;で使用するのに本当に良いでしょう。要素、それはcss-columnsにのみ適用されます:jsfiddle.net/mk0rrLc3/1
Mark

@ Mark-- column-spanは、親で定義されたcolumn-countプロパティで使用されます。表示タイプを変更する必要はありません。また、column-spanは値として1つまたはすべてしか受け入れることができず、分数は許可されないため、フィドルで見られる「column-span:2」は、プロパティの有効な使用法ではありません。
MistyDawn

0

colspan属性をオンまたはオフにする必要があるためにここに来た場合(モバイルレイアウトなど):

を複製<td>し、必要なものだけを表示しますcolspan

table.colspan--on td.single {
  display: none;
}

table.colspan--off td.both {
  display: none;
}
<!-- simple table -->
<table class="colspan--on">
  <thead>
    <th>col 1</th>
    <th>col 2</th>
  </thead>
  <tbody>
    <tr>
      <!-- normal row -->
      <td>a</td>
      <td>b</td>
    </tr>
    <tr>
      <!-- the <td> spanning both columns -->
      <td class="both" colspan="2">both</td>

      <!-- the two single-column <td>s -->
      <td class="single">A</td>
      <td class="single">B</td>
    </tr>
    <tr>
      <!-- normal row -->
      <td>a</td>
      <td>b</td>
    </tr>
  </tbody>
</table>
<!--
that's all
-->

 

<!--
stuff only needed for making this interactive example looking good:
-->
<br><br>
<button onclick="toggle()">Toggle colspan</button>
<script>/*toggle classes*/var tableClasses = document.querySelector('table').classList;
function toggle() {
  tableClasses.toggle('colspan--on');
  tableClasses.toggle('colspan--off');
}
</script>
<style>/* some not-needed styles to make this example more appealing */
td {text-align: center;}
table, td, th {border-collapse: collapse; border: 1px solid black;}</style>


0

CSSプロパティの "column-count"、 "column-gap"、および "column-span"は、擬似テーブルのすべての列を同じラッパー内に保持する方法でこれを行うことができます(HTMLは適切に表示されます)。

唯一の注意点は、1つの列またはすべての列しか定義できず、column-spanはFirefoxではまだ機能しないため、正しく表示するために追加のCSSが必要です。 https://www.w3schools.com/css/css3_multiple_columns.asp

.split-me {
  -webkit-column-count: 3;
  -webkit-column-gap: 0;
  -moz-column-count: 3;
  -moz-column-gap: 0;
  column-count: 3;
  column-gap: 0;
}

.cols {
  /* column-span is 1 by default */
  column-span: 1;
}

div.three-span {
  column-span: all !important;
}

/* alternate style for column-span in Firefox */
@-moz-document url-prefix(){
  .three-span {
    position: absolute;
    left: 8px;
    right: 8px;
    top: auto;
    width: auto;
  }
}


    
<p>The column width stays fully dynamic, just like flex-box, evenly scaling on resize.</p>

<div class='split-me'>
  <div class='col-1 cols'>Text inside Column 1 div.</div>
  <div class='col-2 cols'>Text inside Column 2 div.</div>
  <div class='col-3 cols'>Text inside Column 3 div.</div>
  <div class='three-span'>Text div spanning 3 columns.</div>
</div>



  <style>
/* Non-Essential Visual Styles */

html * { font-size: 12pt; font-family: Arial; text-align: center; }
.split-me>* { padding: 5px; } 
.cols { border: 2px dashed black; border-left: none; }
.col-1 { background-color: #ddffff; border-left: 2px dashed black; }
.col-2 { background-color: #ffddff; }
.col-3 { background-color: #ffffdd; }
.three-span {
  border: 2px dashed black; border-top: none;
  text-align: center; background-color: #ddffdd;
}
  </style>


0

私がここに来たのは、現在WordPressのテーブルブロックがcolspanパラメータをサポートしておらず、CSSを使用して置き換えようと思ったためです。列が同じ幅であると仮定すると、これは私の解決策でした:

table {
  width: 100%;
}

table td {
  width: 50%;
  background: #dbdbdb;
  text-align: center;
}

table tr:nth-child(2n+1) {
  position:relative;
  display:block;
  height:20px;
  background:green;
}

table tr:nth-child(2n+1) td {
  position:absolute;
  left:0;
  right:-100%;
  width: auto;
  top:0;
  bottom:0;
  background:red;
  text-align:center;
}
<table>
    <tr>
        <td>row</td>
    </tr>
    <tr>
        <td>cell</td>
        <td>cell</td>
    </tr>
    <tr>
        <td>row</td>
    </tr>
    <tr>
        <td>cell</td>
        <td>cell</td>
    </tr>
</table>


-1

いつでもposition:absolute;物事を行い、幅を指定できます。それを行うための非常に流動的な方法ではありませんが、それはうまくいきます。


これを実現する方法は、不適切なマークアップを使用するよりもはるかに多くあります。レイアウトを強制する絶対配置は常に不適切なプラクティスと見なされてきました。
MistyDawn

-1

私はこのフィドルを作成しました:

ここに画像の説明を入力してください

http://jsfiddle.net/wo40ev18/3/

HTML

<div id="table">
<div class="caption">
    Center Caption
</div>
<div class="group">
      <div class="row">
            <div class="cell">Link 1t</div>
            <div class="cell"></div>
          <div class="cell"></div>
          <div class="cell"></div>
            <div class="cell"></div>
            <div class="cell ">Link 2</div>
      </div>
</div>

CSS

   #table {
    display:table;
}

.group {display: table-row-group; }

.row {
    display:table-row;
    height: 80px;
    line-height: 80px;
}

.cell {
    display:table-cell;
    width:1%;
    text-align: center;
    border:1px solid grey;
    height: 80px
        line-height: 80px;
}

.caption {
    border:1px solid red; caption-side: top; display: table-caption; text-align: center; 
    position: relative;
    top: 80px;
    height: 80px;
      height: 80px;
    line-height: 80px;

}

1
しかし、ブートストラップグリッドは非常に簡単に作成できると思います
Arun Prasad ES

これは、質問者が探していたソリューションを提供しません。セルのインライン行を作成するだけです。
MistyDawn

-1

メディアクエリクラスを使用して、重複したマークアップで合格できるものを実現できます。これがブートストラップを使った私のアプローチです:

  <tr class="total">
    <td colspan="1" class="visible-xs"></td>
    <td colspan="5" class="hidden-xs"></td>
    <td class="focus">Total</td>
    <td class="focus" colspan="2"><%= number_to_currency @cart.total %></td>
  </tr>

モバイル向けのcolspan 1、CSSが機能する他のユーザー向けのcolspan 5。


質問者は、HTMLの<table>要素は使用できないと具体的に述べています。彼ができれば、これは簡単に解決できる問題でしょう。
MistyDawn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.