145 votes

Colspan/Rowspan pour les éléments dont l'affichage est défini sur table-cell

J'ai le code suivant :

<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell colspan2">Cell</div>
    </div>
</div>

<style>
    .table {
        display: table;
    }
    .row {
        display: table-row;
    }
    .cell {
        display: table-cell;
    }
    .colspan2 {
        /* What to do here? */
    }
</style>

C'est assez simple. Comment puis-je ajouter un colspan (ou l'équivalent de colspan) pour les éléments dont le nom est display: table-cell ?

7 votes

Tu ne peux pas simplement utiliser une table ? Ce serait beaucoup plus facile. De plus, s'il s'agit de données tabulaires, ce serait aussi plus sémantique.

0 votes

@thirtydot c'est probablement possible, ce serait juste une douleur et inutile. Les systèmes de grille comme le 960 permettent de faire cela, mais pour une mise en page entière.

0 votes

@MrMisterMan : Je ne suis pas sûr de ce que vous dites. 960.gs n'utilise pas display: table-cell .

58voto

Russell Zahniser Points 11176

Pour autant que je sache, l'absence de colspan/rowspan n'est qu'une des limitations de l'application display:table . Voir ce billet :

http://www.onenaught.com/posts/201/use-css-displaytable-for-layout

30voto

F-3000 Points 131

Puisque l'OP ne explicitement Je vais donc m'entêter et proposer la solution que j'ai trouvée aujourd'hui, d'autant plus qu'elle est beaucoup plus élégante que d'avoir un tableau dans un tableau.

L'exemple est égal à <table> avec deux cellules par ligne et deux rangées, où la cellule de la deuxième rangée est un td avec colspan="2" .

Je l'ai testé avec Iceweasel 20, Firefox 23 et IE 10.

div.table {
  display: table;
  width: 100px;
  background-color: lightblue;
  border-collapse: collapse;
  border: 1px solid red;
}

div.row {
  display: table-row;
}

div.cell {
  display: table-cell;
  border: 1px solid red;
}

div.colspan,
div.colspan+div.cell {
  border: 0;
}

div.colspan>div {
  width: 1px;
}

div.colspan>div>div {
  position: relative;
  width: 99px;
  overflow: hidden;
}

<div class="table">
    <div class="row">
        <div class="cell">cell 1</div>
        <div class="cell">cell 2</div>
    </div>
    <div class="row">
        <div class="cell colspan">
            <div><div>
                cell 3
            </div></div>
        </div>
        <div class="cell"></div>
    </div>
</div>

Action en direct (démo) aquí .

EDIT : J'ai affiné le code pour qu'il soit plus facile à imprimer, car les couleurs d'arrière-plan sont omises par défaut. J'ai également créé rowspan-demo inspiré par la réponse tardive ici.

0 votes

Je suis à la recherche d'une solution similaire. Mais à la place, j'ai 5 cellules sur la ligne supérieure. Sur la ligne inférieure, j'ai besoin d'une cellule de la même taille que la ligne supérieure. Puis une cellule ayant colspan=2 et une autre cellule ayant colspan=2, ce qui fait un total de 5 cellules dans la rangée du bas également. Voici le problème jsfiddle basé sur votre solution. Avez-vous des idées ? jsfiddle.net/7wdza4ye/1

1 votes

@VarunVerma, vous devez ajouter une cellule vide entre les cellules 7 et 8. Il suffit d'ajouter <div class="cell"></div> fonctionne (au moins avec Firefox). Avec ce modèle, vous devez ajouter des cellules vides. Par exemple, si vous avez fait en sorte que la cellule 7 soit colspan=3 et que la cellule 8 soit normale, vous aurez besoin de deux cellules vides entre les cellules 7 et 8. À moins que vous ne conceviez autre chose (marges ? div personnalisé unique ?). De plus, une largeur de 100px et 5 cellules rendent les choses délicates, car les mots étirent les cellules css, les paramètres d'overflow ne semblent pas faire de différence. Vous devez également recalculer width para div.colspan>div>div .

0 votes

Ça a marché. Merci. En fait, j'ai ajouté une cellule vide après la cellule 8 parce que la bordure inférieure n'apparaissait pas. Voici les dernières nouvelles : jsfiddle.net/7wdza4ye/3 . Je ne savais pas comment obtenir la bordure entre les cellules 7 et 8. Avez-vous des suggestions ? Merci pour votre aide.

17voto

Philippe97 Points 150

Une solution plus simple qui fonctionne pour moi dans Chrome 30 :

Colspan peut être émulé en utilisant display: table au lieu de display: table-row pour les rangs :

.table {
    display: block;
}
.row {
    display: table;
    width: 100%;
}
.cell {
    display: table-cell;
}
.row.colspan2 {/* You'll have to add the 'colspan2' class to the row, and remove the unused <div class=cell> inside it */
    display: block;
}

Le seul inconvénient est que les cellules des rangées empilées ne seront pas alignées verticalement, car elles proviennent de tableaux différents.

6voto

Curt Points 42871

Il suffit d'utiliser un table .

Les tables ne sont désapprouvées que lorsqu'elles sont utilisées à des fins de mise en page.

Cela ressemble à des données tabulaires (rangées/colonnes de données). Par conséquent, je recommanderais d'utiliser un table .

Voir ma réponse à cette question pour plus d'informations :

créer la même chose avec des divs comme tableaux

15 votes

Le problème, c'est que ce n'est pas pour des données tabulaires, donc je ne veux pas utiliser de tableau :)

16 votes

Je ne comprends pas pourquoi il est préférable d'utiliser des feuilles de style en cascade pour que tout se comporte exactement comme un tableau plutôt que d'utiliser simplement un tableau. Certes, tr / td Le spam n'est pas le plus beau des html mais est-ce la seule raison ? Tout le monde dit que les tableaux n'étaient pas "censés" être utilisés pour le formatage, mais le html lui-même n'était pas "censé" faire la moitié des choses que nous considérons comme acceptables selon les normes actuelles, y compris les applications web.

4 votes

Presque un an plus tard, mais Léger, je partage votre irritation à l'égard des personnes qui évitent les tableaux sans autre raison que "les tableaux ne sont plus à la mode". Cependant, je me heurte à quelques conceptions réactives où il est utile qu'un tableau ne soit pas un tableau, afin qu'il puisse être réorganisé à des largeurs inférieures. Apprendre que je n'ai pas de colspan pour les divs est un peu décevant.

0voto

Roy Shoa Points 166

Vous devez créer un div's vide pour simuler un colspan :

Dans le cas où vous n'utilisez pas la largeur :

<div class="row">
    <div class="cell">Cell</div>
    <div class="cell">Cell</div>
</div>
<div class="row">
    <div class="cell">Cell</div>
    <div class="cell">&nbsp</div>
</div>

Dans le cas où vous utilisez la largeur :

<div class="row">
    <div class="cell" style="width:25%">Cell</div>
    <div class="cell" style="width:25%">Cell</div>
    <div class="cell" style="width:25%">Cell</div>
    <div class="cell" style="width:25%">Cell</div>
</div>
<div class="row">
    <div class="cell" style="width:25%">Cell</div>
    <div class="cell" style="width:75%">&nbsp</div>
</div>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X