CSS: comment créer un espace entre les lignes d'un tableau?

94

Cela signifie que la table résultante ressemble moins à ceci:

[=== ROW ===]
[=== ROW ===]
[=== ROW ===]
[=== ROW ===]

... et plus comme ça:

[=== ROW ===]

[=== ROW ===]

[=== ROW ===]

[=== ROW ===]

J'ai essayé d'ajouter

margin-bottom:1em;

à la fois td et tr mais rien obtenu. Des idées?

MGOwen
la source
2
Pourquoi pas cellspacing et cellpadding?
adatapost
1
Cellspacing donnera également l'espacement entre les colonnes.
rahul
4
Cellspacing et cellpadding ne sont pas du HTML (X) valide. Vous ne devez pas les utiliser.
freiksenet
8
@freiksenet: Vous vous trompez. Ils sont parfaitement valides HTML4 strict ( w3.org/TR/html401/struct/tables.html#h-11.2.1 ), XHTML1 ( w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd ) et même XHTML1 .1 ( w3.org/MarkUp/DTD/xhtml-table-1.mod ).
mercator
1
Possible duplication de l' espace entre deux lignes dans un tableau?
ThisClark

Réponses:

214

Tout ce dont tu as besoin:

table {
    border-collapse: separate;
    border-spacing: 0 1em;
}

Cela suppose que vous souhaitiez un espace vertical de 1em et aucun espace horizontal. Si vous faites cela, vous devriez probablement aussi chercher à contrôler la hauteur de votre ligne.

C'est assez étrange que certaines des réponses que les gens ont données impliquent l'effondrement des frontières: l'effondrement, dont l'effet est exactement le contraire de ce que la question demandait.

John Haugeland
la source
oh droit, j'essayais d'obtenir une colonne spécifique pour avoir un espacement plus large, donc je n'ai pas pensé à l'appliquer à la table
Jonathan.
4
Cette solution ne vous permet pas d'appliquer sélectivement l'espacement à certaines lignes.
Flimm
15
La question ne le demandait pas.
John Haugeland
C'est une bonne idée, mais pour combler le vide supérieur de la première rangée, j'ai dû trouver une solution de contournement qui n'est pas standard, je suppose, mais qui fonctionne. Donner le thead, tbody {position: relative; top: -{border-spacing-value} }.
Farzad YZ
3
puis-je dire que je t'aime? Oh mon Dieu. vous venez de sauver mon un $$
NikosKeyz
93
table {
    border-collapse: collapse;
}

td {
    padding-top: .5em;
    padding-bottom: .5em;
}

Les cellules ne réagiront à rien à moins que vous ne définissiez d'abord la réduction de la bordure. Vous pouvez également ajouter des bordures aux éléments TR une fois que cela est défini (entre autres).

Si c'est pour la mise en page, je passerais à l'utilisation de DIV et de techniques de mise en page plus à jour, mais s'il s'agit de données tabulaires, éliminez-vous. J'utilise encore beaucoup les tableaux dans mes applications Web pour les données.

Ryan Florence
la source
L'avez-vous testé? Il semble que les td peuvent avoir un rembourrage avec ou sans réduction. Les frontières fonctionnent avec l'effondrement, mais pas sur IE.
Kobi
Cela a fonctionné. C'est ennuyeux que les marges ne fonctionnent pas, mais cela n'a pas d'importance dans ce cas. Merci.
MGOwen
30
C'est une très mauvaise approche. Vous modifiez la boîte des cellules pour positionner les cellules, plutôt que de simplement positionner les cellules, en fusionnant les cellules ensemble parce que vous voulez qu'elles soient séparées. La seconde où les cellules ont besoin de fonds, vous êtes foutu. L'approche correcte est la séparation des frontières, et non l'effondrement des frontières, en utilisant la séparation des frontières pour définir, vous savez, la séparation des frontières.
John Haugeland
1
C'est presque le tout premier morceau de CSS2 qui a été implémenté, car les navigateurs avaient déjà des espaces de tableau implémentés pour la version HTML que tout le monde utilisait pour une mise en page au pixel près. Oui, j'en suis certain. :)
John Haugeland
1
C'est l'un de ces coins étranges de CSS que personne d'autre que les personnes qui ont lu les spécifications ne connaît. (Il y en a un nombre étonnamment grand. De même, float ne devrait fondamentalement jamais être utilisé comme il est utilisé dans la pratique.)
John Haugeland
7

Si aucune des autres réponses n'est satisfaisante, vous pouvez toujours simplement créer une ligne vide et la styliser avec CSS de manière appropriée pour être transparente.

Flimm
la source
Pourquoi le vote négatif? Les autres réponses sont problématiques: la réponse de rpflo vous oblige à utiliser border-collapse et à étendre le remplissage des cellules, ce qui fait paraître les cellules plus grandes plutôt que de créer un espacement entre elles. La réponse de John Haugeland ne vous permet pas d'appliquer sélectivement l'espacement à certaines lignes. Je pourrais continuer mais cette réponse est une option qui a fonctionné pour mon cas d'utilisation alors qu'aucune des autres réponses n'a fonctionné.
Flimm
2
L'approche défavorable de l'utilisateur anonyme consistant à spécifier la hauteur des lignes individuelles avec CSS est largement supérieure à l'ajout de contenu factice à la table, si vous avez besoin de contrôler des lignes individuelles, ce qui n'est pas l'objet de cette question.
John Haugeland
Les fausses lignes confondent également les outils qui s'attendent à ce que les lignes de table soient des lignes de table (comme les outils d'accessibilité importants pour les personnes handicapées, et les plugins courants pour l'exportation / le tri / le reformatage / etc.). Il y a de nombreuses raisons d'utiliser des styles pour contrôler le style, plutôt que de pousser de faux éléments, en règle générale. Lisez à propos du balisage sémantique pour plus d'informations.
MGOwen le
@MGOwen Pourriez-vous nommer les outils d'accessibilité qui échoueraient dans ce scénario, et comment ils échoueraient? Je suis maintenant sceptique quant aux conseils d'accessibilité qui ne mentionnent pas de détails, il y a beaucoup de mauvais conseils d' accessibilité qui n'aident en fait personne (par exemple, les conseils de contour de document pour HTML 5 étaient tous faux , les outils d'accessibilité ne le font pas. travailler comme les gens disent qu’ils travaillent).
Flimm le
4

Si vous n'avez pas de bordures ou si vous avez des bordures et que vous voulez l'espacement à l'intérieur des cellules, vous pouvez utiliser paddingou line-height. Autant que je sache, la marge n'a aucun effet sur les cellules et les lignes.
Une propriété CSS pour l'espacement des cellules est border-spacing, mais elle ne fonctionne pas sur IE6 / 7 (vous pouvez donc l'utiliser en fonction de votre foule).

Si tout le reste échoue, vous pouvez utiliser l'ancien cellspacingattribut dans votre balisage - mais cela vous donnera également un espacement entre les colonnes. Certaines réinitialisations CSS suggèrent que vous devriez le configurer de toute façon pour obtenir une prise en charge de plusieurs navigateurs:

/ * les tables ont encore besoin cellspacing="0"dans le balisage * /

Kobi
la source
2

C'est comme ça (je pensais que c'est impossible):

Donnez d'abord au tableau uniquement l'espacement vertical des bordures (par exemple 5px) et définissez son espacement horizontal des bordures sur 0. Ensuite, vous devez donner des bordures appropriées à chaque cellule de ligne. Par exemple, la cellule la plus à droite de chaque ligne doit avoir une bordure en haut, en bas et à droite. Les cellules les plus à gauche doivent avoir une bordure en haut, en bas et à gauche. Et les autres cellules entre ces 2 ne devraient avoir qu'une bordure en haut et en bas. Comme cet exemple:

<table style="border-spacing:0 5px; color:black">
    <tr>
        <td style="border-bottom:thin black solid; border-top:thin black solid; border-left:thin black solid;">left-most cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid; border-right:thin black solid;">right-most cell</td>
    </tr>
    <tr>
        <td style="border-bottom:thin black solid; border-top:thin black solid; border-left:thin black solid;">left-most cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid; border-right:thin black solid;">right-most cell</td>
    </tr>
    <tr>
        <td style="border-bottom:thin black solid; border-top:thin black solid; border-left:thin black solid;">left-most cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid; border-right:thin black solid;">right-most cell</td>
    </tr>
</table>
Arash Esmaeili
la source
1

À mon avis, le moyen le plus simple de le faire est d'ajouter un remplissage à votre balise.

td {
 padding: 10px 0
}

J'espère que ceci vous aidera! Acclamation!

Huy Le
la source
Cela crée un espace supplémentaire à l'intérieur de la ligne du tableau. Si les lignes du tableau ont des couleurs qui ne seront pas bonnes.
Kokodoko
1

Vous pouvez simplement utiliser padding-topet padding-bottomsur un tdélément.

L'unité peut tout de cette liste:

entrez la description de l'image ici

Code de démonstration:

td
{
  padding-top: 10px;
  padding-bottom: 10px;
}
<table>
  <tr>
    <th>Firstname</th>
    <th>Lastname</th>
  </tr>
  <tr>
    <td>Peter</td>
    <td>Griffin</td>
  </tr>
  <tr>
    <td>Lois</td>
    <td>Griffin</td>
  </tr>
</table>

Abrar Jahin
la source
0

le remplissage dans le TD fonctionne si vous voulez que l'espace ait la même couleur d'arrière-plan que le td

dans mon cas, l'exigence était d'espace blanc entre la ligne d'en-tête et tout ce qui se trouvait au-dessus

en appliquant ce style à une seule cellule, j'ai pu obtenir la séparation souhaitée. Il n'était pas nécessaire de l'ajouter à toutes les cellules ... Sans doute pas le PLUS élégant, mais peut-être plus élégant que les lignes de séparation.

<td colspan="10"> 
    <div class="HeaderRow" 
         style="margin-top:10px;">
            <%# Eval("VendorName")%>
     </div>
</td>  
Greg
la source
-1

Si vous vous en tenez à la conception en utilisant des tableaux, la meilleure idée sera de donner une ligne vide sans contenu et hauteur spécifiée entre chaque ligne du tableau.

Vous pouvez utiliser div pour éviter cette complexité. Donnez simplement une marge à chaque div.

rahul
la source
1
Il existe encore de bonnes raisons d'utiliser des tableaux (comme les données tabulaires). Vous avez raison, les lignes vides sont certainement une route idiote: P Mais il existe une solution, l'effondrement des frontières.
Ryan Florence
-1

Vous pouvez également simplement modifier la hauteur de chaque ligne en utilisant CSS.

<head>
 <style>
 tr {
   height:40px;
 }
</style>
</head>

<body>
<table>

<tr> <td>One</td> <td>Two</td> </tr>
<tr> <td>Three</td> <td>Four</td> </tr>
<tr> <td>Five</td> <td>Six</td> </tr>

</table>
</body>

Vous pouvez également modifier la hauteur de l' <td>élément, cela devrait vous donner le même résultat.


la source
-1

Créez-en un autre <tr>juste en dessous et ajoutez de l'espace ou de la hauteur au contenu de<td>

entrez la description de l'image ici

Découvrez le violon par exemple

https://jsfiddle.net/jd_dev777/wx63norf/9/

Jaydeep Chauhan
la source
Ceci est considéré comme une mauvaise pratique. Une des raisons est que les outils (comme les lecteurs pour les utilisateurs désactivés) s'attendent à ce que les lignes de table soient des lignes de table, et exporter / lire / interpréter vos "fausses" lignes mélangées avec les vraies. Voir la première fois que cette même réponse a été donnée en 2014, ci-dessus.
MGOwen le
1
@MGOwen merci pour votre suggestion. totalement d'accord
Jaydeep Chauhan
-4

Ajoutez la règle suivante à tr et cela devrait fonctionner

float: left

Exemple (ouvrez-le dans IE9 offcourse :)): http://jsfiddle.net/zshmN/

EDIT: Ce n'est pas une solution légale ou correcte comme l'ont souligné beaucoup, mais si vous n'avez aucune option et avez besoin de quelque chose, cela fonctionnera dans IE9.

Donc, tous ceux qui donnent des votes, veuillez nous indiquer également la solution correcte

Sandeep Choudhary
la source
3
Cette approche empêche l'alignement automatique des colonnes lorsque les cellules contiennent des données de dimensions différentes - le balisage du tableau est essentiellement inutile. Cela fonctionne assez bien dans les exemples fournis, mais ce n'est pas une technique recommandée. Modifiez le texte d'une cellule pour voir ce que je veux dire.
verism
Hé @verism, désolé mais je n'ai pas compris votre point. Pouvez-vous l'expliquer un peu plus? Ou si vous pouvez fournir un violon là où cette méthode échoue, car j'utilise cette méthode de manière intensive et je voudrais m'occuper des scénarios où elle échoue.
Sandeep Choudhary
Il n'y a pas de délimitation claire des colonnes; ce qui signifie que les données tabulaires perdent leur structure visuelle et deviennent plus difficiles à lire. jsfiddle.net/verism/zshmN/5
vérisme
@verism ya c'est un problème, mais nous pouvons définir des colonnes de largeur fixe. Je sais que ce n'est pas une bonne solution, mais je n'ai trouvé aucune autre solution qui fonctionne sur IE9
Sandeep Choudhary
1
Les lignes de table flottantes ne sont pas légales selon la spécification CSS. La section 17 de CSS2 requiert que les éléments display: table-row soient dans les éléments display: table-row-group, -header-group ou -footer-group. Cependant, l'algorithme flottant selon la section 9 injecte un parent de bloc anonyme. Cela signifie que la ligne du tableau n'a plus de mise en page parent légale et que le navigateur est en train de deviner quoi faire. C'est tout à fait incorrect.
John Haugeland