The sibling selector matches siblings , which means the two elements must have the same parent A ~ B matches B in a scenario like this: <parent> <A>Lorem ipsum dolor sit amet</A> . . . <B>consectetur adipisicing elit</B> </parent> You are trying to match the descendant of a sibling, so you need to also use the descendant selector (a space). A ~ B D matches D in either of these types of scenarios: <parent> <A>Lorem ipsum dolor sit amet</A> . . . <B> . . . <C>consectetur <D>adipisicing</D> elit</C> </B> </parent> <parent> <A>Lorem ipsum dolor sit amet</A> . . . <B><C>consectetur</C> <D>adipisicing</D> elit</B> </parent> You also have the option of the child selector (>), rather than the descendant selector. The child selector matches something that's an immediate child, rather than an arbitrarily deep descendant. The child selector had some issues during beta, but IIRC it was fixed. With the first example above, this would also match D: A ~ B > C > D. The second example would work with: A ~ B > D. If your checkbox is followed by the table which contains your cell you want to hide, this should work: .sheet-ishorror:checked ~ table .sheet-horror { display: table-cell; } /* Note that I've used table-cell here instead of block since you're using a <td> element */ If your checkbox is in another row of the table, this will not work , because the checkbox would be a cousin to the table cell you're trying to toggle. The elements must be siblings, or the second one must be a descendant of a sibling.