Bene, questa domanda è stata posta molte volte prima, e la breve risposta tipica è: non può essere fatta da CSS puro. È nel nome: Cascading Style Sheets supporta solo lo stile in direzione della cascata, non verso l'alto.
Ma nella maggior parte dei casi in cui si desidera questo effetto, come nell'esempio dato, esiste ancora la possibilità di utilizzare queste caratteristiche a cascata per raggiungere l'effetto desiderato. Considera questo pseudo markup:
<parent>
<sibling></sibling>
<child></child>
</parent>
Il trucco è quello di dare al fratello la stessa dimensione e posizione del genitore e di dare uno stile al fratello anziché al genitore. Questo sembrerà che il genitore sia in stile!
Ora, come modellare il fratello?
Quando il bambino è in bilico, anche il genitore lo è, ma il fratello no. Lo stesso vale per il fratello. Questo si conclude in tre possibili percorsi del selettore CSS per lo styling del fratello:
parent sibling { }
parent sibling:hover { }
parent:hover sibling { }
Questi diversi percorsi consentono alcune belle possibilità. Ad esempio, scatenando questo trucco nell'esempio nella domanda si ottiene questo violino :
div {position: relative}
div:hover {background: salmon}
div p:hover {background: white}
div p {padding-bottom: 26px}
div button {position: absolute; bottom: 0}

Ovviamente, nella maggior parte dei casi questo trucco dipende dall'uso del posizionamento assoluto per dare al fratello le stesse dimensioni del genitore e lasciare comunque che il bambino compaia all'interno del genitore.
A volte è necessario utilizzare un percorso selettore più qualificato per selezionare un elemento specifico, come mostrato in questo violino che implementa il trucco più volte in un menu ad albero. Davvero carino davvero.