Ну, этот вопрос задавался много раз раньше, и короткий типичный ответ таков: это не может быть сделано простым CSS. Это в названии: каскадные таблицы стилей поддерживают стилизацию только в каскадном направлении, но не вверх.
Но в большинстве случаев, когда этот эффект желателен, как в данном примере, все еще существует возможность использовать эти каскадные характеристики для достижения желаемого эффекта. Рассмотрим эту псевдо-разметку:
<parent>
<sibling></sibling>
<child></child>
</parent>
Хитрость заключается в том, чтобы дать брату тот же размер и положение, что и у родителя, и стилизовать родного брата вместо родителя. Это будет выглядеть как родительский стиль!
Теперь, как уложить родного брата?
Когда ребенок находится под охраной, родитель тоже, а брат - нет. То же самое касается брата и сестры. Это завершается тремя возможными путями селектора CSS для стилизации родного брата:
parent sibling { }
parent sibling:hover { }
parent:hover sibling { }
Эти разные пути дают хорошие возможности. Например, использование этого трюка на примере в вопросе приводит к этой скрипке :
div {position: relative}
div:hover {background: salmon}
div p:hover {background: white}
div p {padding-bottom: 26px}
div button {position: absolute; bottom: 0}
Очевидно, что в большинстве случаев этот трюк зависит от использования абсолютного позиционирования, чтобы дать брату одинаковый размер с родителем, и при этом позволить ребенку появляться внутри родителя.
Иногда необходимо использовать более точный путь селектора для выбора конкретного элемента, как показано в этой скрипте, которая реализует трюк несколько раз в древовидном меню. Довольно мило на самом деле.