Bueno, esta pregunta se hace muchas veces antes, y la respuesta típica corta es: no se puede hacer con CSS puro. Está en el nombre: las hojas de estilo en cascada solo admiten el estilo en dirección en cascada, no hacia arriba.
Pero en la mayoría de las circunstancias donde se desea este efecto, como en el ejemplo dado, todavía existe la posibilidad de utilizar estas características en cascada para alcanzar el efecto deseado. Considere este pseudo marcado:
<parent>
<sibling></sibling>
<child></child>
</parent>
El truco es darle al hermano el mismo tamaño y posición que el padre y darle estilo al hermano en lugar del padre. ¡Esto se verá como si el padre tuviera estilo!
Ahora, ¿cómo peinar al hermano?
Cuando el niño está suspendido, el padre también, pero el hermano no. Lo mismo vale para el hermano. Esto concluye en tres posibles rutas de selector CSS para diseñar el hermano:
parent sibling { }
parent sibling:hover { }
parent:hover sibling { }
Estos diferentes caminos permiten algunas buenas posibilidades. Por ejemplo, desencadenar este truco en el ejemplo de la pregunta da como resultado este violín :
div {position: relative}
div:hover {background: salmon}
div p:hover {background: white}
div p {padding-bottom: 26px}
div button {position: absolute; bottom: 0}
Obviamente, en la mayoría de los casos este truco depende del uso de posicionamiento absoluto para darle al hermano el mismo tamaño que el padre, y aún así dejar que el niño aparezca dentro del padre.
A veces es necesario usar una ruta de selector más calificada para seleccionar un elemento específico, como se muestra en este violín que implementa el truco varias veces en un menú de árbol. Bastante agradable de verdad.