Padding a table row
Solution 1
The trick is to give padding on the td
elements, but make an exception for the first (yes, it's hacky, but sometimes you have to play by the browser's rules):
td {
padding-top:20px;
padding-bottom:20px;
padding-right:20px;
}
td:first-child {
padding-left:20px;
padding-right:0;
}
First-child is relatively well supported: https://developer.mozilla.org/en-US/docs/CSS/:first-child
You can use the same reasoning for the horizontal padding by using tr:first-child td
.
Alternatively, exclude the first column by using the not
operator. Support for this is not as good right now, though.
td:not(:first-child) {
padding-top:20px;
padding-bottom:20px;
padding-right:20px;
}
Solution 2
In CSS 1 and CSS 2 specifications, padding was available for all elements including <tr>
. Yet support of padding for table-row (<tr>
) has been removed in CSS 2.1 and CSS 3 specifications. I have never found the reason behind this annoying change which also affect margin property and a few other table elements (header, footer, and columns).
Update: in Feb 2015, this thread on the [email protected]
mailing list discussed about adding support of padding and border for table-row. This would apply the standard box model also to table-row and table-column elements. It would permit such examples. The thread seems to suggest that table-row padding support never existed in CSS standards because it would have complicated layout engines. In the 30 September 2014 Editor's Draft of CSS basic box model, padding and border properties exist for all elements including table-row and table-column elements. If it eventually becomes a W3C recommendation, your html+css example may work as intended in browsers at last.
Solution 3
Option 1
You could also solve it by adding a transparent border to the row (tr), like this
HTML
<table>
<tr>
<td>1</td>
</tr>
<tr>
<td>2</td>
</tr>
</table>
CSS
tr {
border-top: 12px solid transparent;
border-bottom: 12px solid transparent;
}
Works like a charm, although if you need regular borders, then this method will sadly not work.
Option 2
Since rows act as a way to group cells, the correct way to do this, would be to use
table {
border-collapse: inherit;
border-spacing: 0 10px;
}
Solution 4
give the td padding
Related videos on Youtube
Spencer
Updated on July 08, 2022Comments
-
Spencer almost 2 years
<html> <head> <title>Table Row Padding Issue</title> <style type="text/css"> tr { padding: 20px; } </style> </head> <body> <table> <tbody> <tr> <td> <h2>Lorem Ipsum</h2> <p>Fusce sodales lorem nec magna iaculis a fermentum lacus facilisis. Curabitur sodales risus sit amet neque fringilla feugiat. Ut tellus nulla, bibendum at faucibus ut, convallis eget neque. In hac habitasse platea dictumst. Nullam elit enim, gravida eu blandit ut, pellentesque nec turpis. Proin faucibus, sem sed tempor auctor, ipsum velit pellentesque lorem, ut semper lorem eros ac eros. Vivamus mi urna, tempus vitae mattis eget, pretium sit amet sapien. Curabitur viverra lacus non tortor luctus vitae euismod purus hendrerit. Praesent ut venenatis eros. Nulla a ligula erat. Mauris lobortis tempus nulla non scelerisque.</p> </td> </tr> </tbody> </table> </body> </html>
Here's what the padding looks like. See how the td inside isn't affected. What's the solution?
-
Natrium almost 14 yearsuse
<div>
and<p>
instead of a table -
Spencer almost 14 yearsthe data being presented is tabular and should be in a table
-
-
Spencer almost 14 yearsOnly thing is the if there is 2 td inside a tr then there will be padding between the 2 td, which I don't want.
-
jeff over 10 yearsI would use :not operator for excluding a single item. like tr:not(#first_row)
-
Joeri Hendrickx over 10 years@CengizFrostclaw indeed, that would be more consise. But support is not as good.
-
jeff over 10 yearsOh, you may be right. I don't know, it just makes sense to believe that :not operator is a more supported one, but again, I only test in Chrome :D
-
spinners about 10 yearsthis is not 'hacky', this is exactly what these selectors are designed for
-
Dan over 8 yearsI would be very interested in the reason as well!
-
caesay over 6 yearsThis totally screws with how table layout usually works. If you're doing this, you shouldn't be using a table - use a regular
div
. -
Adam Leggett over 6 years@spinners this is hacky. It does not work with RTL layout. Create dummy
<td>
s. -
Joeri Hendrickx over 6 years@AdamLeggett adding non-semantic html is always the last resort. You can adapt the rule for rtl content by using the
:dir(rtl)
pseudoclass (I would add it to the answer but I did not actually test this) -
Adam Leggett over 6 years@JoeriHendrickx
:dir(rtl)
is only supported on Firefox. You could wrap inhtml(dir=rtl)
but this is just as hacky as non-semantic HTML. -
Joeri Hendrickx over 6 yearsAssuming you already need the dir attribute at the top level, adding that to your css selector sounds pretty sane to me.
-
Adam Leggett about 6 years@JoeriHendrickx I am not happy with assuming the
html
element will have this attribute. -
Mike A over 3 yearsThis one should be the accepted answer based on the question. It's not always straight forward to add padding to columns (td) (and might be headers (th) as well). This answers the question more accurately. The assumption is often that the OP can modify the HTM, but with visual builders and CMS having such prominence, that's often not the case. Upvoted
-
Mike A over 3 yearsOne more thing. Better I think would be
border-collapse: collapse
rather thaninherit