Bem, essa pergunta é feita muitas vezes antes, e a resposta curta e típica é: Ela não pode ser feita por CSS puro. Está no nome: as folhas de estilo em cascata suportam apenas o estilo na direção em cascata, e não para cima.
Mas na maioria das circunstâncias em que esse efeito é desejado, como no exemplo dado, ainda há a possibilidade de usar essas características em cascata para alcançar o efeito desejado. Considere esta pseudo marcação:
<parent>
<sibling></sibling>
<child></child>
</parent>
O truque é dar ao irmão o mesmo tamanho e posição do pai e estilizar o irmão em vez do pai. Parece que o pai está estilizado!
Agora, como estilizar o irmão?
Quando a criança passa o mouse, o pai também, mas o irmão não. O mesmo vale para o irmão. Isso termina em três caminhos possíveis do seletor de CSS para estilizar o irmão:
parent sibling { }
parent sibling:hover { }
parent:hover sibling { }
Esses caminhos diferentes permitem algumas boas possibilidades. Por exemplo, desencadear esse truque no exemplo da pergunta resulta nesse violino :
div {position: relative}
div:hover {background: salmon}
div p:hover {background: white}
div p {padding-bottom: 26px}
div button {position: absolute; bottom: 0}
Obviamente, na maioria dos casos, esse truque depende do uso de posicionamento absoluto para dar ao irmão o mesmo tamanho do pai e ainda deixar a criança aparecer dentro do pai.
Às vezes, é necessário usar um caminho de seletor mais qualificado para selecionar um elemento específico, como mostrado neste violino que implementa o truque várias vezes em um menu em árvore. Muito bom mesmo.