Padding a table row

277,366

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

Share:
277,366

Related videos on Youtube

Spencer
Author by

Spencer

Updated on July 08, 2022

Comments

  • Spencer
    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? Table Row Padding Issue

    • Natrium
      Natrium almost 14 years
      use <div> and <p> instead of a table
    • Spencer
      Spencer almost 14 years
      the data being presented is tabular and should be in a table
  • Spencer
    Spencer almost 14 years
    Only 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
    jeff over 10 years
    I would use :not operator for excluding a single item. like tr:not(#first_row)
  • Joeri Hendrickx
    Joeri Hendrickx over 10 years
    @CengizFrostclaw indeed, that would be more consise. But support is not as good.
  • jeff
    jeff over 10 years
    Oh, 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
    spinners about 10 years
    this is not 'hacky', this is exactly what these selectors are designed for
  • Dan
    Dan over 8 years
    I would be very interested in the reason as well!
  • caesay
    caesay over 6 years
    This 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
    Adam Leggett over 6 years
    @spinners this is hacky. It does not work with RTL layout. Create dummy <td>s.
  • Joeri Hendrickx
    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
    Adam Leggett over 6 years
    @JoeriHendrickx :dir(rtl) is only supported on Firefox. You could wrap in html(dir=rtl) but this is just as hacky as non-semantic HTML.
  • Joeri Hendrickx
    Joeri Hendrickx over 6 years
    Assuming you already need the dir attribute at the top level, adding that to your css selector sounds pretty sane to me.
  • Adam Leggett
    Adam Leggett about 6 years
    @JoeriHendrickx I am not happy with assuming the html element will have this attribute.
  • Mike A
    Mike A over 3 years
    This 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
    Mike A over 3 years
    One more thing. Better I think would be border-collapse: collapse rather than inherit