QiMath
QiMath

Reputation: 585

SCSS : change element style if child input is checked or not

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

Answers (4)

darrylyeo
darrylyeo

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

Diego Delgado
Diego Delgado

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

CourtDemone
CourtDemone

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

Leonardo Costa
Leonardo Costa

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

Related Questions