Reputation: 585
I have never used SCSS before and I would liketo know if it would allow me to style an element depending if the checkbox located inside is checked or not.
For instance, I have :
<label>
<input type="checkbox"/>
</label>
and I would liketo change the content of label::before
depending if the box is checked or not.
Does SCSS allows things like this ? If yes,how can I do it ?
The reason that led me to consider SCSS to execute this is that (if I'm not mistaking) it is indeed possible with SASS.
However since I am not familiar with SASS I'd ratherdo it with SCSS, as converting my file is apparently very easy.
Upvotes: 11
Views: 26181
Reputation: 3483
No, there is no CSS selector that allows one to style an element based on the state of its children.
Update: The :has()
pseudo-class was introduced in 2022, and is supported by all major browsers except Firefox as of June 2023.
You can now style parent elements based on child state like so:
label::before {
content: 'Not checked';
}
label:has(input:checked) {
background: yellow;
}
label:has(input:checked)::before {
content: 'Checked!';
}
<label>
<input type="checkbox" />
</label>
Upvotes: 10
Reputation: 87
As of today you can use the new :has() pseudo-class as a parent selector:
label:has(:checked)::before {
content: "«";
color: blue;
}
Upvotes: 1
Reputation: 5912
You wouldn't be able to change the content of the label based on the state of the input, you'd need JS for that.
However, you can use pseudo selector in regular ol CSS (and SCSS by extension) to style the checkbox itself using input:checked{}
EDIT: I stand corrected, see Leonardo Costa's solution using sibling selectors.
Upvotes: 4
Reputation: 470
I did a little change in your HTML, but I think it can really help you.
Sass code:
input[type=checkbox]
+ .checkbox-label
color: blue
&:checked + .checkbox-label
color: red
&:before
content: ""
border: 1px solid #a3adb3
input[type=checkbox]+.checkbox-label {
color: blue;
}
input[type=checkbox]:checked+.checkbox-label {
color: red;
}
input[type=checkbox]:checked+.checkbox-label:before {
content: "";
border: 1px solid #a3adb3;
}
<input type="checkbox" id="cbox1" value="first_checkbox">
<label for="cbox1" class="checkbox-label">Hello world</label>
I have helped you in some way.
Upvotes: 12