Colspan HTML en CSS

251

J'essaie de construire une disposition similaire à la suivante:

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

où le fond remplit l'espace de la rangée supérieure.

Si cela était une table réelle, je pourrais facilement accomplir ceci avec <td colspan="3">, mais comme je crée simplement une table comme la mise en page , je ne peux pas utiliser les <table>mots clés. Est-ce possible en utilisant CSS?

La tour
la source
8
La meilleure solution dépend vraiment de ce qui entre dans le tableau. S'il s'agit de données (quelque chose qui appartient à une table), utilisez une table. Si vous utilisez un tableau pour contrôler la mise en page de la page, alors l'une des solutions HTML + CSS ci-dessous est préférable.
mwcz
Ajoutez un balisage pour les deux cas, puis affichez un seul à la fois à l'aide d'une classe CSS de requête Media.
DigitalDesignDj
2
Oubliez CSS. Si vous affichez des données tabulaires, vous savez certainement combien de colonnes elles couvriront. Utilisez l' colspanattribut
Tihomir Mitkov
Je le ferais par bootstrap ou grille personnalisée à partir de bootstrap
Arun Prasad ES
Si vous utilisez CSS3, vous pouvez utiliser columnSpan. Contrairement à <td colspan = "#">, vous n'avez pas la possibilité de définir le nombre de colonnes, mais vous pouvez couvrir toutes les colonnes. w3schools.com/cssref/css3_pr_column-span.asp
MistyDawn

Réponses:

407

Il n'y a pas d'analogue CSS simple et élégant pour colspan.

Les recherches sur ce problème donneront une variété de solutions qui incluent une multitude d'alternatives, y compris le positionnement absolu, le dimensionnement, ainsi qu'une variété similaire de mises en garde spécifiques au navigateur et aux circonstances. Lisez et prenez la meilleure décision éclairée possible en fonction de ce que vous trouvez.

David
la source
10
Les tableaux sont des éléments structurels et ce n'est pas parce que l'utilisation de colspan change que son apparence ne l'est pas. CSS est utilisé pour styliser les éléments et ne pas changer la structure. Le W3C discute de la structure des tables ici: w3.org/TR/html401/struct/tables.html#h-11.2
Rob
88
Rob, comprenez votre position, mais regardez dans les recommandations du W3C - concernant spécifiquement le paradigme de la table entière - et vous constaterez qu'une partie de leur considération était, très certainement, la présentation des tables. Cette idée que les tables ont été purement conçues comme une structure est une fiction contemporaine, je pense que nous serions tous mieux servis pour arrêter la propagation. Le fait est que nous devons cesser d'être dogmatiques sur les tables. Il serait erroné pour moi de dire qu'ils sont toujours présentés, et il est tout aussi faux pour vous de dire qu'ils sont toujours structurés. La réalité n'est tout simplement pas si coupée et séchée.
David
4
On dirait que votre réponse est la réponse populaire. :) Je suis heureux d'apprendre que le dogme anti-table (auquel j'ai adhéré) est trop strict. Je ne maintiens ma réponse que dans la mesure où je pense toujours que colspanc'est le bon outil pour le travail. Ma réponse était à 75% juste et la vôtre a 100% raison. Vous devriez revenir à SO.
mwcz
71
Après 2 ans, j'ai fait une recherche sur Google et j'ai voulu voter pour l'auteur mais il a dit "ne peut pas voter pour votre propre poste" et j'ai réalisé que c'était moi, lol. J'ai décidé de changer la solution acceptée en celle-ci car je pense qu'elle contient de meilleures informations.
Tower
14
Ceci est un mini-essai sur une autre réponse (non spécifiée), pas une réponse à la question posée.
Jukka K. Korpela
56

Pour autant que je sache, il n'y a pas de colspan dans CSS, mais il y en aura column-spandans un avenir proche, mais comme il ne s'agit que d'un brouillon en CSS3, vous pouvez le vérifier ici . Quoi qu'il en soit, vous pouvez faire une solution de contournement en utilisant divet spanavec un affichage semblable à un tableau comme celui-ci.

Ce serait le 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>

Et ce serait le 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%; }

La seule raison d'utiliser cette astuce est de tirer parti du table-layoutcomportement, je l'utilise beaucoup si le fait de définir la largeur de div et de span à un certain pourcentage ne remplissait pas pleinement nos exigences de conception.

Mais si vous n'avez pas besoin de bénéficier de ce table-layoutcomportement, la réponse de Durilai vous conviendra assez.

Hendra Uzia
la source
4
Oui, mais un petit correctif: au lieu de .span { ...cela devrait l'être span { ....
Slavik Meltser
2
Utiliser des divbalises pour afficher des données tabulaires est aussi mauvais que d'utiliser tables pour contrôler la mise en page
Tihomir Mitkov
1
@TichomirMitkov dépend si vous utilisez ou non un design réactif pour modifier la mise en page - auquel cas, cela peut parfois très bien fonctionner.
Simon_Weaver
4
Cela ne répond pas vraiment à la question puisque vous avez essentiellement deux tableaux l'un après l'autre dans l'exemple que vous avez donné. (Ietwo divs avec la classe "table")
Hiver
21

Une autre suggestion consiste à utiliser flexbox à la place des tableaux. C'est un "navigateur moderne" bien sûr, mais allez, c'est 2016;)

Au moins, cela pourrait être une solution alternative pour ceux qui recherchent une réponse à cela de nos jours, car le message d'origine datait de 2010.

Voici un excellent guide: 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>

Hiver
la source
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>
Dustin Laine
la source
Je ne peux pas connaître la largeur des cellules.
Tour
1
Alors ne mettez pas de largeur. Cela ne devrait pas avoir d'importance. Mais si vous voulez qu'ils s'étendent sur la même largeur, les deux divisions principales doivent avoir la même largeur.
Dustin Laine
1
Vous pouvez utiliser width: calc (100% / 3) qui fera un peu mieux que de donner au milieu 1% de plus
ii iml0sto1
5

Cela ne fait pas partie de la compétence de CSS. colspandécrit la structure du contenu de la page ou donne un sens aux données du tableau, qui est le travail de HTML.

mwcz
la source
OP mentionne explicitement « la création d' une table comme la mise en page », sans signification structurelle. N'est-ce pas le but même des tables CSS? Il n'y a aucune raison objective de traiter la propriété colspan différemment de la table entière, s'il y a un élément de table CSS de conception uniquement, pourquoi pas une propriété colspan CSS de conception uniquement ...
Skippy le Grand Gourou
2
Découvrez la réponse la mieux notée à cette question. Votre sentiment y est déjà discuté et je suis enclin à l'approuver. Mon opinion sur la question a définitivement changé au cours des cinq années écoulées depuis que j'ai écrit cette réponse.
mwcz
4

Pour fournir une réponse à jour: La meilleure façon de le faire aujourd'hui est d'utiliser la disposition de la grille CSS comme ceci:

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

et le 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>
Toby 1 Kenobi
la source
3

Vous pourriez essayer d'utiliser un système de grille comme http://960.gs/

Votre code ressemblerait à ceci, en supposant que vous utilisez une mise en page "12 colonnes":

<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>
Jeff
la source
3

Essayez d'ajouter display: table-cell; width: 1%;à votre élément de cellule de tableau.

Ismail Farooq
la source
comment cela va-t-il aider? Le concept fondamental d'un tableau est que chaque ligne a des cellules identiques. Si l'une des lignes a une cellule qui implémente avec succès "largeur: 1%", alors toutes les lignes auront cette colonne comme "largeur: 1%". Le point de "colspan" est de prendre 2 (ou plus) des colonnes de largeur fixe et de les combiner pour obtenir une largeur combinée.
IAM_AL_X
3

J'ai eu un certain succès, même si cela dépend de quelques propriétés pour fonctionner:

table-layout: fixed border-collapse: separate

et "largeurs" de cellules qui se divisent / s'étendent facilement, soit 4 x cellules de 25% de largeur:

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

En outre, appliquer display: table-header-group ou table-footer-group est un moyen pratique de déplacer des éléments de «ligne» vers le haut / bas du «tableau».

user3464561
la source
0

si vous utilisez div et span, il occupera plus de taille de code lorsque la ligne du tableau de données est plus volumineuse. Ce code ci-dessous est vérifié dans tous les navigateurs

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;
}
Concepteur Web Cum Promoter
la source
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

Adam Hunter Peck
la source
pas assez de support ... IE8 est malheureusement toujours un problème persistant pour l'évolution
beauXjames
9
OP souhaite avoir une table-cellétendue de plusieurs colonnes de table. column-spansert à contrôler la disposition des colonnes. Ce qui vous permet de faire passer du texte sur plusieurs colonnes, comme le font les journaux.
Chris Wesseling du
1
En effet - alors que ce serait vraiment bien à utiliser à l'écran: table-cell; éléments, il ne s'applique qu'aux colonnes css: jsfiddle.net/mk0rrLc3/1
Mark
@ Mark - span-colonne est utilisé avec la propriété count-colonne définie sur le parent. Il n'est pas nécessaire de modifier le type d'affichage. En outre, la colonne-span ne peut accepter que 1 ou tous comme valeur, elle ne permet pas le fractionnement, donc "column-span: 2", comme vu dans votre violon, n'est pas une utilisation valide de la propriété.
MistyDawn
0

Si vous venez ici parce que vous devez activer ou désactiver l' colspanattribut (par exemple pour une mise en page mobile):

Dupliquez les <td>s et ne montrez que ceux avec les souhaits 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>

luckydonald
la source
0

Les propriétés CSS "column-count", "column-gap" et "column-span" peuvent le faire d'une manière qui garde toutes les colonnes de la pseudo-table dans le même wrapper (le HTML reste agréable et soigné).

Les seules mises en garde sont que vous ne pouvez définir qu'une seule colonne ou toutes les colonnes, et que span-span ne fonctionne pas encore dans Firefox, donc quelques CSS supplémentaires sont nécessaires pour s'assurer qu'il s'affichera correctement. 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>

MistyDawn
la source
0

Je suis venu ici car actuellement le bloc de table WordPress ne prend pas en charge le paramètre colspan et j'ai pensé que je le remplacerais en utilisant CSS. C'était ma solution, en supposant que les colonnes ont la même largeur:

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>

passatgt
la source
-1

Vous pourriez toujours des position:absolute;choses et spécifier des largeurs. Ce n'est pas une façon très fluide de le faire, mais cela fonctionnerait.

doubleJ
la source
Il existe bien plus de façons d'y parvenir que d'utiliser un mauvais balisage. Le positionnement absolu pour forcer une mise en page a toujours été considéré comme une mauvaise pratique.
MistyDawn
-1

J'ai créé ce violon:

entrez la description de l'image ici

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;

}
Layke
la source
1
Mais je pense que la grille de bootstrap peut le faire très facilement
Arun Prasad ES
Cela ne fournit pas la solution que le demandeur recherchait. Il crée simplement une ligne de cellules en ligne.
MistyDawn
-1

Les classes Media Query peuvent être utilisées pour réaliser quelque chose de passable avec un balisage en double. Voici mon approche avec 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 pour mobile, colspan 5 pour les autres avec CSS faisant le travail.

DigitalDesignDj
la source
Le demandeur a spécifiquement déclaré qu'il ne pouvait pas utiliser les éléments HTML <table>. S'il le pouvait, ce serait un problème facile à résoudre.
MistyDawn