HTML colspan in CSS


251

Sto cercando di costruire un layout simile al seguente:

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

dove il fondo sta riempiendo lo spazio della fila superiore.

Se questa fosse una tabella reale, potrei facilmente farlo con <td colspan="3">, ma dato che sto semplicemente creando un layout simile a una tabella , non posso usare i <table>tag. È possibile usare CSS?


8
La soluzione migliore dipende davvero da cosa sta succedendo nella tabella. Se sono dati (qualcosa che appartiene a una tabella), usa una tabella. Se si utilizza una tabella per controllare il layout della pagina, una delle soluzioni HTML + CSS di seguito è migliore.
mwcz,

Aggiungi markup per entrambi i casi, quindi mostra solo uno alla volta utilizzando una classe CSS di query multimediali.
DigitalDesignDj,

2
Dimentica i CSS. Se visualizzi dati tabulari, sapresti sicuramente su quante colonne si estendono. Usa l' colspanattributo
Tihomir Mitkov

Lo farei da bootstrap o griglia personalizzata da bootstrap
Arun Prasad ES

Se stai usando CSS3, puoi usare columnSpan. A differenza di <td colspan = "#">, non hai la possibilità di impostare il numero di colonne, ma puoi estendere tutte le colonne. w3schools.com/cssref/css3_pr_column-span.asp
MistyDawn

Risposte:


407

Non esiste un analogo CSS semplice ed elegante per colspan.

Le ricerche su questo tema restituiranno una varietà di soluzioni che includono una serie di alternative, tra cui posizionamento assoluto, dimensionamento, insieme a una varietà simile di avvertenze specifiche del browser e delle circostanze. Leggi e prendi la decisione più informata possibile in base a ciò che trovi.


10
Le tabelle sono elementi strutturali e solo perché l'utilizzo di colspan cambia il suo aspetto non significa che non lo sia. Il CSS è usato per definire gli elementi e non cambiare la struttura. Il W3C discute la struttura della tabella qui: w3.org/TR/html401/struct/tables.html#h-11.2
Rob

88
Rob, capisci la tua posizione, ma dai un'occhiata alle raccomandazioni del W3C - in particolare relative all'intero paradigma della tabella - e scoprirai che parte della loro considerazione è stata, certamente, la presentazione delle tabelle. L'idea che i tavoli fossero puramente concepiti come struttura è una finzione contemporanea, penso che saremmo tutti serviti meglio per smettere di diffonderci. Il punto è che dobbiamo smettere di essere dogmatici riguardo alle tabelle. Sarebbe sbagliato per me dire che sono sempre presentazione, ed è altrettanto sbagliato per te dire che sono sempre struttura. La realtà non è semplicemente così semplice.
David,

4
Sembra che la tua risposta sia la risposta popolare. :) Sono felice di apprendere che il dogma anti-tavolo (che ho acquistato) è troppo severo. Attendo la mia risposta solo nella misura in cui penso colspansia ancora lo strumento giusto per il lavoro. La mia risposta era giusta al 75% e la tua al 100%. Dovresti tornare a SO.
mwcz,

71
Dopo 2 anni, ho cercato su Google questo e volevo votare l'autore ma diceva "non posso votare per il tuo post" e mi sono reso conto che ero io, lol. Ho deciso di cambiare la soluzione accettata per questa poiché ritengo che abbia informazioni migliori.
Torre

14
Questo è un mini-saggio su un'altra risposta (non specificata), non una risposta alla domanda posta.
Jukka K. Korpela,

56

Non c'è colspan in CSS per quanto ne so, ma ci sarà column-spanper il layout multi colonna in un prossimo futuro, ma dal momento che è solo una bozza in CSS3, puoi verificarlo qui . Ad ogni modo puoi fare una soluzione usando divespan con un display simile a una tabella come questo.

Questo sarebbe l'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>

E questo sarebbe il 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%; }

L'unico motivo per usare questo trucco è ottenere il vantaggio di table-layout comportamento, lo uso molto se solo impostare div e ampiezza span su una certa percentuale non soddisfacesse il nostro requisito di progettazione.

Ma se non hai bisogno di beneficiare del table-layoutcomportamento, la risposta di durilai ti farebbe abbastanza.


4
Sì, ma una piccola correzione: invece di .span { ...dovrebbe essere span { ....
Slavik Meltser,

2
L'uso dei divtag per visualizzare i dati tabulari è negativo come usare tables per controllare il layout della pagina
Tihomir Mitkov

1
@TichomirMitkov dipende dal fatto che stai utilizzando il design reattivo per modificare il layout, nel qual caso a volte può funzionare abbastanza bene.
Simon_Weaver

4
Questo in realtà non risponde alla domanda poiché in sostanza hai due tabelle una dopo l'altra nell'esempio che hai dato. (Ietwo divs con la classe "table")
Inverno

21

Un altro suggerimento è l'utilizzo del flexbox anziché delle tabelle del tutto. Si tratta ovviamente di un "browser moderno", ma dai, è il 2016;)

Almeno questa potrebbe essere una soluzione alternativa per coloro che cercano una risposta a questo al giorno d'oggi, poiché il post originale era del 2010.

Ecco un'ottima guida: 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>

Non riesco a conoscere la larghezza delle celle.
Torre

1
Quindi non mettere una larghezza. Non dovrebbe importare. Ma se vuoi che abbiano la stessa larghezza, i due div principali devono avere la stessa larghezza.
Dustin Laine,

1
Puoi usare larghezza: calc (100% / 3) che farà un po 'meglio che dare in mezzo l'1% in più
ii iml0sto1

5

Ciò non fa parte del campo di applicazione dei CSS. colspandescrive la struttura del contenuto della pagina o dà un significato ai dati nella tabella, che è il lavoro di HTML.


OP menziona esplicitamente "la creazione di un layout simile a una tabella ", senza significato strutturale. Non è proprio lo scopo delle tabelle CSS? Non vi è alcun motivo oggettivo per trattare la proprietà colspan in modo diverso rispetto all'intera tabella, se esiste un elemento tabella CSS solo design, perché non una proprietà colspan CSS solo design ...
Skippy le Grand Gourou

2
Dai un'occhiata alla risposta più votata a questa domanda. Il tuo sentimento è già stato discusso lì e sono propenso ad accettarlo. La mia opinione sulla questione è decisamente cambiata nei cinque anni da quando ho scritto questa risposta.
mwcz,

4

Per fornire una risposta aggiornata: il modo migliore per farlo oggi è utilizzare il layout della griglia CSS in questo modo:

.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;
}

e il codice 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

Potresti provare a utilizzare un sistema a griglia come http://960.gs/

Il tuo codice sarebbe simile a questo, supponendo che stai utilizzando un layout a "12 colonne":

<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

Prova ad aggiungere display: table-cell; width: 1%;l'elemento cella della tabella.


come può essere d'aiuto? Il concetto fondamentale di una tabella è che ogni riga ha celle identiche. Se una delle righe ha una cella che implementa correttamente "larghezza: 1%", tutte le righe avranno quella colonna come "larghezza: 1%". Il punto di "colspan" è quello di prendere 2 (o più) delle colonne a larghezza fissa e combinarle per ottenere una larghezza combinata.
IAM_AL_X il

3

Ho avuto un certo successo, anche se si basa su alcune proprietà per funzionare:

table-layout: fixed border-collapse: separate

e "larghezze" di celle che si dividono / si estendono facilmente, ovvero 4 x celle con una larghezza del 25%:

.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/

Inoltre, l'applicazione display: table-header-group o table-footer-group è un modo pratico di saltare gli elementi 'row' nella parte superiore / inferiore della 'table'.


0

se usi div e span occuperà più dimensioni del codice quando la riga della tabella datagrid ha più volume. Questo codice di seguito è verificato in tutti i browser

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


supporto insufficiente ... IE8 è purtroppo ancora un problema persistente per l'evoluzione
beauXjames

9
OP desidera avere table-cellun'estensione su più colonne di tabella. column-spanserve per controllare un layout di colonna. Ciò ti consente di far scorrere il testo su più colonne, come fanno i giornali.
Chris Wesseling,

1
Anzi - mentre questo sarebbe davvero buono da usare in mostra: table-cell; elementi, si applica solo alle colonne css: jsfiddle.net/mk0rrLc3/1
Segna il

@ Mark: l'intervallo di colonne viene utilizzato con la proprietà di conteggio delle colonne definita sul padre. Non è necessario modificare il tipo di visualizzazione. Inoltre, l'intervallo di colonne può accettare solo 1 o tutti come valore, non consente il frazionamento, quindi "span di colonna: 2", come visto nel violino, non è un uso valido della proprietà.
MistyDawn,

0

Se vieni qui perché devi attivare o disattivare l' colspanattributo (ad esempio per un layout mobile):

Duplica le <td>s e mostra solo quelle con quelle desiderate 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

Le proprietà CSS "column-count", "column-gap" e "column-span" possono farlo in un modo che mantiene tutte le colonne della pseudo-tabella all'interno dello stesso wrapper (HTML rimane bello e pulito).

L'unica avvertenza è che puoi definire solo 1 colonna o tutte le colonne e l'intervallo di colonne non funziona ancora in Firefox, quindi è necessario qualche CSS aggiuntivo per assicurarti che venga visualizzato correttamente. 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

Sono venuto qui perché attualmente il blocco tabella di WordPress non supporta il parametro colspan e ho pensato che lo sostituirò usando CSS. Questa era la mia soluzione, supponendo che le colonne avessero la stessa larghezza:

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

Puoi sempre position:absolute;cose e specificare larghezze. Non è un modo molto fluido di farlo, ma funzionerebbe.


Ci sono molti più modi per raggiungere questo obiettivo che utilizzare un markup errato. Il posizionamento assoluto per forzare un layout è sempre stato considerato una cattiva pratica.
MistyDawn,

-1

Ho creato questo violino:

inserisci qui la descrizione dell'immagine

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
Ma penso che la griglia di bootstrap possa farcela molto facilmente
Arun Prasad ES,

Questo non fornisce la soluzione che cercava il richiedente. Crea solo una riga di celle in linea.
MistyDawn,

-1

Le classi Media Query possono essere utilizzate per ottenere risultati accettabili con markup duplicato. Ecco il mio approccio con bootstrap:

  <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 per dispositivi mobili, colspan 5 per gli altri con CSS che fa il lavoro.


Il richiedente ha dichiarato specificamente di non poter utilizzare gli elementi HTML <table>. Se potesse, questo sarebbe un problema facile da risolvere.
MistyDawn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.