At some point, Chris Coyier suggested people write blog posts presenting why they might need parent selectors. Here's mine.
I've got some form that looks like this:
<form>
<fieldset>
<label for="category_1">Category 1</label>
<input type="checkbox" id="category_1" name="category_1"><span></span><br><br>
</fieldset>
<fieldset>
<label for="category_2">Category 2</label>
<input type="checkbox" id="category_2" name="category_2"><span></span><br><br>
</fieldset>
<fieldset>
<label for="category_3">Category 3</label>
<input type="checkbox" id="category_3" name="category_3"><span></span><br><br>
</fieldset>
<input type="submit" value="Show results">
</form>
It allows people to select some grouping of filters: category 1, category 2, and category 3. When they hit Show results
, they get some results back based on these filters.
I want to give a visual cue for which filters they've used. Maybe something like a background color on each associated fieldset
that contains checked checkboxes. That feels somewhat straightforward.
But right now if I want to style the fieldset
based on its child, I have to use JavaScript to maybe listen for a change
or click
event, find the correct fieldset
, and update its styles through JS.
Alternatively, I could set up a pseudo-element to do the job. But wait! input
elements can't have pseudo-elements. So now I have to add an empty span
as a sibling and style its pseudo-elements. The markup changes to this:
<form>
<fieldset>
<label for="category_1">Category 1</label>
<input type="checkbox" id="category_1" name="category_1"><span></span><br><br>
</fieldset>
<fieldset>
<label for="category_2">Category 2</label>
<input type="checkbox" id="category_2" name="category_2"><span></span><br><br>
</fieldset>
<fieldset>
<label for="category_3">Category 3</label>
<input type="checkbox" id="category_3" name="category_3"><span></span><br><br>
</fieldset>
<input type="submit" value="Show results">
</form>
And then I write these styles:
fieldset {
position: relative;
}
input:checked + span:before {
content: '';
position: absolute;
height: 100%;
width: 100%;
top: 0;
left: 0;
z-index: -1;
background-color: green;
}
It's workable. It's only a little extra code. But it would be really slick if I could write some CSS that looked like:
input:checked PARENT_SELECTOR_SYMBOL_HERE fieldset {
background-color: green
}
Here's a codepen with the sample code so you can play around with it and see what I mean
Top comments (0)