How to target first child that is visible (after children that are set to display: none), with CSS only

I need to target the first element <td>

in a table row that is visible - this means it has no inline style display:none

.

Here's getchyas:

  • They are not always hidden.
  • Sometimes more than one is hiding.
  • I cannot edit HTML or use javascript / jQuery. This should be a clean CSS solution (hopefully)

Here's a quick example of what the code looks like:

<table>
    <thead>
        <tr>
            <th style="display:none">Header1</th>
            <th>Header2</th>
            <th>Header3</th>
            <th>Header4</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td style="display:none">Body1</td>
            <td>Body2</td>
            <td>Body3</td>
            <td>Body4</td>
        </tr>
    </tbody>
</table>

      

I've tried messing up with something like this to no avail:

table > tbody > tr > td:first-of-type:not([style*="display:none"]) 

      

Here's a fiddle to tinker with

Thanks in advance.

+3


source to share


2 answers


If your hidden elements are always at the beginning of the line, you can use a direct selector for that +

.



td:first-child,
td[style*="none"] + td {
  color: red;
}
      

<table>
  <thead>
    <tr>
      <th style="display:none">Header1</th>
      <th>Header2</th>
      <th>Header3</th>
      <th>Header4</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="display:none">Body1</td>
      <td>Body2</td>
      <td>Body3</td>
      <td>Body4</td>
    </tr>
    <tr>
      <td>First</td>
      <td>Second</td>
      <td>Third</td>
    </tr>
    <tr>
      <td style="display:none">and</td>
      <td>here's</td>
      <td>an</td>
      <td style="display:none">edge</td>
      <td>case</td>
    </tr>

  </tbody>
</table>
      

Run codeHide result


+2


source


This will style anything that does not display "display: none", but cancel that when it hits the next "display: none".



table > tbody > tr > td:not([style*="display:none"]) {
    color: red;
}
table > tbody > tr > td:not([style*="display:none"]) ~ td:not([style*="display:none"]) {
    color: inherit;
}
      

<table>
  <thead>
    <tr>
      <th style="display:none">Header1</th>
      <th>Header2</th>
      <th>Header3</th>
      <th>Header4</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="display:none">Body1</td>
      <td>Body2</td>
      <td>Body3</td>
      <td>Body4</td>
    </tr>
    <tr>
      <td>First</td>
      <td>Second</td>
      <td>Third</td>
    </tr>
  </tbody>
</table>
      

Run codeHide result


+1


source







All Articles