Comment ajouter un rayon de bordure sur la ligne du tableau

108

Est-ce que quelqu'un sait comment le coiffer comme on aime?

J'ai utilisé border-collapse sur la table, après que tr's puisse afficher une bordure solide de 1px que je leur donne.

Cependant, quand j'ai essayé -moz-border-radius, cela ne fonctionne pas. Même une simple marge ne fonctionne pas.

Henson
la source

Réponses:

221

Vous ne pouvez appliquer border-radius qu'à td, pas à tr ou table. J'ai contourné cela pour les tables d'angle arrondies en utilisant ces styles:

table { border-collapse: separate; }
td { border: solid 1px #000; }
tr:first-child td:first-child { border-top-left-radius: 10px; }
tr:first-child td:last-child { border-top-right-radius: 10px; }
tr:last-child td:first-child { border-bottom-left-radius: 10px; }
tr:last-child td:last-child { border-bottom-right-radius: 10px; }

Assurez-vous de fournir tous les préfixes de fournisseur. En voici un exemple en action .

ombre à paupières
la source
Droite. Si vous voulez des coins arrondis dans IE, vous devrez utiliser des images et un balisage étrange.
theazureshadow
6
@Henson: Non, car CSS3 n'est pas pris en charge dans IE <9 cependant, vous pouvez utiliser CSS3PIE pour le faire fonctionner dans IE, y compris IE6: css3pie.com
Sarfraz
31
Attention: si vous omettez border-collapse: separate;cela ne fonctionnera pas.
Kevin Borders
@KevinBorders qui est incorrect, du moins dans Chrome v39. J'ai eu un problème pour que cela fonctionne lorsque la couleur d'arrière-plan était appliquée à la table elle-même. Apparemment, ça doit être sur les éléments tr ou td.
Big McLargeHuge
1
separateest nécessaire pour Chrome 44.
Hugh Guiney
38

Espacement réel entre les lignes

Ceci est un vieux fil, mais j'ai remarqué la lecture des commentaires du PO sur d'autres réponses que l'objectif initial était apparemment d'avoir border-radiussur les lignes, et les écarts entre les lignes. Il ne semble pas que les solutions actuelles fassent exactement cela. La réponse de theazureshadow va dans la bonne direction, mais semble avoir besoin d'un peu plus.

Pour ceux qui s'y intéressent, voici un violon qui sépare les lignes et applique le rayon à chaque ligne. (REMARQUE: Firefox a actuellement un bogue dans l'affichage / le découpage background-colorau niveau des rayons de bordure .)

Le code est le suivant (et comme l'a noté theazureshadow, pour la prise en charge antérieure du navigateur, les différents préfixes de fournisseur border-radiusont été ajoutés au besoin).

table { 
    border-collapse: separate; 
    border-spacing: 0 10px; 
    margin-top: -10px; /* correct offset on first border spacing if desired */
}
td {
    border: solid 1px #000;
    border-style: solid none;
    padding: 10px;
    background-color: cyan;
}
td:first-child {
    border-left-style: solid;
    border-top-left-radius: 10px; 
    border-bottom-left-radius: 10px;
}
td:last-child {
    border-right-style: solid;
    border-bottom-right-radius: 10px; 
    border-top-right-radius: 10px; 
}
ScottS
la source
3
Bien mieux que la réponse ci-dessus.
Exzile
12

Info bonus: border-radiusn'a aucun effet sur les tables avec border-collapse: collapse;et bordure définie sur td's. Et peu importe si border-radiusest activé table, trou td- il est ignoré.

http://jsfiddle.net/Exe3g/

Ronni Egeriis Persson
la source
Le jsfiddle a des coins arrondis sur Firefox.
Jukka K. Korpela
4
@ JukkaK.Korpela Oui, si border-collapse: collapse; n'est pas défini, cliquez sur le bouton bascule et voyez la magie opérer.
Ronni Egeriis Persson
3

L'élément tr respecte le rayon de la frontière. Peut utiliser du HTML pur et du CSS, pas de javascript.

Lien JSFiddle: http://jsfiddle.net/pflies/zL08hqp1/10/

tr {
    border: 0;
    display: block;
    margin: 5px;
}
.solid {
    border: 2px red solid;
    border-radius: 10px;
}
.dotted {
    border: 2px green dotted;
    border-radius: 10px;
}
.dashed {
    border: 2px blue dashed;
    border-radius: 10px;
}

td {
    padding: 5px;
}
<table>
    <tr>
        <td>01</td>
        <td>02</td>
        <td>03</td>
        <td>04</td>
        <td>05</td>
        <td>06</td>
    </tr>
    <tr class='dotted'>
        <td>07</td>
        <td>08</td>
        <td>09</td>
        <td>10</td>
        <td>11</td>
        <td>12</td>
    </tr>
    <tr class='solid'>
        <td>13</td>
        <td>14</td>
        <td>15</td>
        <td>16</td>
        <td>17</td>
        <td>18</td>
    </tr>
    <tr class='dotted'>
        <td>19</td>
        <td>20</td>
        <td>21</td>
        <td>22</td>
        <td>23</td>
        <td>24</td>
    </tr>
    <tr class='dashed'>
        <td>25</td>
        <td>26</td>
        <td>27</td>
        <td>28</td>
        <td>29</td>
        <td>30</td>
    </tr>
</table>

bonne humeur
la source
4
Changer la propriété d'affichage du TR sur "block" va probablement gâcher la disposition du tableau. En particulier, si votre tableau comporte plusieurs lignes contenant différentes longueurs de contenu, les cellules du tableau ne s'aligneront pas.
Jess
2

Je pense que l'effondrement de vos frontières n'est pas la bonne chose à faire dans ce cas. Les réduire signifie essentiellement que la frontière entre deux cellules voisines devient partagée. Cela signifie qu'il n'est pas clair dans quelle direction il doit se courber en fonction d'un rayon.

Au lieu de cela, vous pouvez donner un rayon de bordure aux deux coins à gauche du premier TD et aux deux coins à droite du dernier. Vous pouvez utiliser les sélecteurs first-childet last-childcomme suggéré par theazureshadow, mais ceux-ci peuvent être mal pris en charge par les anciennes versions d'IE. Il peut être plus facile de définir simplement des classes, telles que .first-columnet .last-columnde servir cet objectif.

Levik
la source
Je réduit la bordure pour que le tr puisse afficher le style que je donne. J'essaierai la méthode de classe. mais qu'en est-il de la marge? J'ai essayé d'utiliser l'espacement des bordures pour afficher les marges entre les lignes, mais ce n'est pas la meilleure façon de le faire, je crois ...
Henson
Il ne peut y avoir aucune marge entre les lignes si elles partagent une bordure, c'est-à-dire lorsque la bordure est réduite. Je suppose que ce que vous essayez de faire est de faire en sorte que vos TR aient une couleur d'arrière-plan avec des coins arrondis? Si tel est le cas, les
retirer
en fait, la chose la plus urgente est d'afficher la marge entre les lignes avec des bordures. La bordure ne doit pas nécessairement avoir des coins arrondis
Henson
2

Selon Opera, la norme CSS3 ne définit pas l'utilisation de border-radiussur les TD. Mon expérience est que Firefox et Chrome le prennent en charge, mais Opera ne le fait pas (je ne sais pas pour IE). La solution de contournement consiste à envelopper le contenu td dans un div, puis à appliquer le border-radiusau div.

Rayon
la source
2

N'essayant pas de prendre des crédits ici, tout le mérite revient à @theazureshadow pour sa réponse, mais j'ai personnellement dû l'adapter pour une table qui en a <th>au lieu de<td> cellules de la première ligne.

Je publie juste la version modifiée ici au cas où certains d'entre vous voudraient utiliser la solution de @ theazureshadow, mais comme moi, en avoir <th>dans le premier <tr>. La classe "reportTable" ne doit être appliquée qu'à la table elle-même:

table.reportTable {
    border-collapse: separate;
    border-spacing: 0;
}

table.reportTable td {
    border: solid gray 1px;
    border-style: solid none none solid;
    padding: 10px;
}

table.reportTable td:last-child {
    border-right: solid gray 1px;
}

table.reportTable tr:last-child td{
    border-bottom: solid gray 1px;
}

table.reportTable th{
    border: solid gray 1px;
    border-style: solid none none solid;
    padding: 10px;
}

table.reportTable th:last-child{
    border-right: solid gray 1px;
    border-top-right-radius: 10px;
}

table.reportTable th:first-child{
    border-top-left-radius: 10px;
}

table.reportTable tr:last-child td:first-child{
    border-bottom-left-radius: 10px;
}   

table.reportTable tr:last-child td:last-child{
    border-bottom-right-radius: 10px;
}

N'hésitez pas à ajuster les rembourrages, les rayons, etc. selon vos besoins. J'espère que cela aide les gens!

Mathieu Turcotte
la source
1

J'ai trouvé que l'ajout de border-radius aux tables, très et tds ne semble pas fonctionner à 100% dans les dernières versions de Chrome, FF et IE. Ce que je fais à la place, c'est envelopper la table avec un div et y mettre le rayon de la bordure.

<div class="tableWrapper">
  <table>
    <tr><td>Content</td></tr>
  <table>
</div>

.tableWrapper {
  border-radius: 4px;
  overflow: hidden;
}

Si votre table ne l'est pas width: 100%, vous pouvez faire votre emballage float: left, n'oubliez pas de le vider.

ScubaSteve
la source
solution simple et élégante
ufk
1

Utilisez border-collapse: seperate; et espacement des bordures: 0; mais n'utilisez que border-right et border-bottom pour le tds, avec border-top appliqué à th et border-left appliqué uniquement à tr td: nth-child (1).

Vous pouvez ensuite appliquer un rayon de bordure au coin tds (en utilisant nth-child pour les trouver)

https://jsfiddle.net/j4wm1f29/

<table>
  <tr>
    <th>title 1</th>
    <th>title 2</th>
    <th>title 3</th>
  </tr>
  <tr>
    <td>item 1</td>
    <td>item 2</td>
    <td>item 3</td>
  </tr>
  <tr>
    <td>item 1</td>
    <td>item 2</td>
    <td>item 3</td>
  </tr>
  <tr>
    <td>item 1</td>
    <td>item 2</td>
    <td>item 3</td>
  </tr>
  <tr>
    <td>item 1</td>
    <td>item 2</td>
    <td>item 3</td>
  </tr>
</table>
table {
  border-collapse: seperate;
  border-spacing: 0;
}

tr th,
tr td {
  padding: 20px;
  border-right: 1px solid #000;
  border-bottom: 1px solid #000;
}

tr th {
  border-top: 1px solid #000;
}

tr td:nth-child(1),
tr th:nth-child(1) {
  border-left: 1px solid #000;
}

/* border radius */
tr th:nth-child(1) {
  border-radius: 10px 0 0 0;
}

tr th:nth-last-child(1) {
  border-radius: 0 10px 0 0;
}

tr:nth-last-child(1) td:nth-child(1) {
  border-radius: 0 0 0 10px;
}

tr:nth-last-child(1) td:nth-last-child(1) {
  border-radius: 0 0 10px 0;
}
John Fotios
la source
0

Ou utilisez box-shadow si la table est réduite

Siviy
la source
0

Toutes les réponses sont bien trop longues. Le moyen le plus simple d'ajouter un rayon de bordure à un élément de table qui accepte la bordure comme propriété consiste à faire un rayon de bordure avec débordement: masqué.

border: xStyle xColor xSize;
border-collapse: collapse;
border-radius: 1em;
overflow: hidden;
E Alexis MT
la source
@ypresto la première réponse de #theazureshadow mentionne que le rayon de la bordure ne fonctionne pas pour tr, mais la raison en est que vous ne pouvez même pas lui appliquer une bordure, mais la table fonctionne: (Je ne sais pas pourquoi mais cette réponse date de 2013 .
E Alexis MT