0

span click <p> color change

span:focus~.to-be-changed {
  color: red;
}
<p class="to-be-changed">I'm going to be red! It's gonna be legen... Wait for it...</p>
<span tabindex="0">Click me!</span>
I'm going to be red! It's gonna be legen... Wait for it...

Click me!

Temani Afif
  • 245,468
  • 26
  • 309
  • 415

2 Answers2

3

The ~ refers to all the siblings after the element. In your example the .to-be-changed is a previous sibling. You can place them in the order you need in the dom and then reorder them using flex and order

span:focus~.to-be-changed {
  color: red;
}

.container{
  display: flex;
  flex-direction: column;
}

.container .to-be-changed{
  order: 1;
}

.container span{
  order: 2;
}
<div class="container">
  <span tabindex="0">Click me!</span>
  <p class="to-be-changed">I'm going to be red! It's gonna be legen... Wait for it...</p>
</div>
Itay Gal
  • 10,706
  • 6
  • 36
  • 75
-1

.parent {display: flex;}
span { order: 2;}
.to-be-changed {order: 1;}
span:active~.to-be-changed {
  color: red;
}
<div class="parent">
<span tabindex="0">Click me!</span>
<p class="to-be-changed">I'm going to be red! It's gonna be legen... Wait for it...</p>
</div>

So far (Feb.2019) you cannot select parent of an element, or the previous sibling of an element.

But you can do a css trick to place the <p> element after <span> element in html but display the <p> element before span element. Then you can achieve the goal. The snippet above is an example, if you need to support old browser you can also use float:right; instead.

However, in the future, we will have ':has()' css selector which will allow us to select parent of an element. Here you can check this selector info :has() selector.

jilykate
  • 5,430
  • 2
  • 17
  • 26