2

I have the following HTML:

<table id="price-table">
            <tr><th>Price</th><th>Value</th></tr>
            <tr class="price-row">
                <td>0</td>
                <td>1</td>
            </tr>

            <tr><th>Price</th><th>Value</th></tr>
            <tr class="price-row">
                <td>1</td>
                <td>2</td>
            </tr>
</table>

I am trying to style every odd row with the class price-row using the following:

#price-table tr.price-row:nth-child(odd) {
    color: green;
}

And every even row using:

#price-table tr.price-row:nth-child(even) {
    color: blue;
}

However only the even rows are being styled, and the odd rows are being completely ignored. I don't understand why this is? Doesn't the first row have the id of 1 which would be styled as odd, and the second row have an id of 2 being styled as even?

I should mention that I do expect for this table to be expandable such that further rows are able to be added and correctly styled.

Very confused I have no idea what else to try, this doesn't seem complicated unless I'm making a very silly mistake.

Edit full HTML:

<table id="price-table">
  <tr>
    <th>Price</th>
    <th>Value</th>
  </tr>
  <tr class="price-row">
    <td>0</td>
    <td>1</td>
  </tr>
  <tr>
    <th>Price</th>
    <th>Value</th>
  </tr>
  <tr class="price-row">
    <td>1</td>
    <td>2</td>
  </tr>
   <tr>
    <th>Price</th>
    <th>Value</th>
  </tr>
  <tr class="price-row">
    <td>0</td>
    <td>1</td>
  </tr>
  <tr>
    <th>Price</th>
    <th>Value</th>
  </tr>
  <tr class="price-row">
    <td>1</td>
    <td>2</td>
  </tr>
</table>
Vyres
  • 73
  • 8

1 Answers1

2

You need to remove the selector in the tr, otherwise it only select the tr with that class, which are always even in your HTML structure

tr:nth-child(odd) {
  background-color: green;
}

tr:nth-child(even) {
  background-color: blue;
}
<table id="price-table">
  <tr>
    <th>Price</th>
    <th>Value</th>
  </tr>
  <tr class="price-row">
    <td>0</td>
    <td>1</td>
  </tr>
  <tr>
    <th>Price</th>
    <th>Value</th>
  </tr>
  <tr class="price-row">
    <td>1</td>
    <td>2</td>
  </tr>
</table>

UPDATE (based on op comment)

Thank you for the reply, but my aim is to not style the rows containing "price value"

Use the sibling selector (+ and ~) then

/* this will select every .price-row that has a TR as immediate previous sibling*/

tr+.price-row {
  background-color: green;
}


/*this will select every .price-row after the other .price-row */

.price-row~.price-row {
  background: blue
}
<table id="price-table">
  <tr>
    <th>Price</th>
    <th>Value</th>
  </tr>
  <tr class="price-row">
    <td>0</td>
    <td>1</td>
  </tr>
  <tr>
    <th>Price</th>
    <th>Value</th>
  </tr>
  <tr class="price-row">
    <td>1</td>
    <td>2</td>
  </tr>
</table>

UPDATE2 (based on op comment)

Thanks for the updated answer. However this only appears to style the first row after the first "price-row" row. After that no other odd rows which have the class "price-row" are styled as odd, only even?

You can use the nth-child() like below

tr:nth-child(2n+2) {
  background: red
}


tr:nth-child(4n+2) {
  background: blue
}
<table id="price-table">
  <tr>
    <th>Price</th>
    <th>Value</th>
  </tr>
  <tr class="price-row">
    <td>0</td>
    <td>1</td>
  </tr>
  <tr>
    <th>Price</th>
    <th>Value</th>
  </tr>
  <tr class="price-row">
    <td>1</td>
    <td>2</td>
  </tr>
  <tr>
    <th>Price</th>
    <th>Value</th>
  </tr>
  <tr class="price-row">
    <td>0</td>
    <td>1</td>
  </tr>
  <tr>
    <th>Price</th>
    <th>Value</th>
  </tr>
  <tr class="price-row">
    <td>1</td>
    <td>2</td>
  </tr>
  <tr>
    <th>Price</th>
    <th>Value</th>
  </tr>
  <tr class="price-row">
    <td>1</td>
    <td>2</td>
  </tr>
<tr>
    <th>Price</th>
    <th>Value</th>
  </tr>
  <tr class="price-row">
    <td>1</td>
    <td>2</td>
  </tr>
</table>
dippas
  • 58,591
  • 15
  • 114
  • 126
  • Thank you for the reply, but my aim is to not style the rows containing "price value". – Vyres Feb 16 '21 at 01:45
  • Thanks for the updated answer. However this only appears to style the first row after the first "price-row" row. After that no other odd rows which have the class "price-row" are styled as odd, only even? – Vyres Feb 16 '21 at 01:55
  • html is the same apart from duplicating everything inside the table tag to test if your solution would scale in size. I have updated my question with the full html – Vyres Feb 16 '21 at 02:03
  • @Vyres please see updated answer – dippas Feb 16 '21 at 03:17
  • This works perfectly, thank you very much. – Vyres Feb 16 '21 at 03:19