Как стилизовать родительский элемент при наведении курсора на дочерний элемент?
Я знаю, что не существует родительского селектора CSS, но можно ли стилизовать родительский элемент при наведении на дочерний элемент без такого селектора?
чтобы привести пример: рассмотрим a удалить что при наведении выделит элемент, который вот-вот будет удален:
<div>
<p>Lorem ipsum ...</p>
<button>Delete</button>
</div>
С помощью чистого CSS, как изменить цвет фона этого раздела, когда мышь находится над кнопкой?
8 ответов:
Ну, этот вопрос задается много раз раньше, и короткий типичный ответ: это не может быть сделано с помощью чистого 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}
очевидно, что в большинстве случаев этот трюк зависит от использования абсолютного позиционирования, чтобы дать брату тот же размер, что и родитель, и все же пусть ребенок появляется внутри родителя.
иногда необходимо использовать более квалифицированный путь селектора для выбора конкретного элемент, как показано в эта скрипка, который реализует трюк несколько раз в дерево меню. Очень мило на самом деле.
Я знаю, что это старый вопрос, но мне просто удалось сделать это без псевдо-ребенка (но псевдо-обертку).
если вы установите родителя, чтобы быть с no
pointer-events, а потом ребенкаdivСpointer-eventsзначениеauto, это работает:)
Обратите внимание, что<img>тег (например) не сделать трюк.
Также не забудьте установитьpointer-eventsдоautoдля других детей, которые имеют свой собственный прослушиватель событий, или в противном случае они потеряют свою кнопку функциональность.div.parent { pointer-events: none; } div.child { pointer-events: auto; } div.parent:hover { background: yellow; }<div class="parent"> parent - you can hover over here and it won't trigger <div class="child">hover over the child instead!</div> </div>Edit:
Как Тень Мастера любезно отметил: стоит отметить, что это не будет работать для IE10 и ниже. (Старые версии FF и Chrome тоже, см. здесь)
нет селектора CSS для выбора родителя выбранного ребенка.
вы можете сделать это с помощью JavaScript
другой, простой подход (старый вопрос)..
было бы разместить элементы в качестве братьев и сестер и использовать:Селектор Соседних Братьев И Сестер (
+) или Общий Селектор Братьев И Сестер (~)<div id="parent"> <!-- control should come before the target... think "cascading" ! --> <button id="control">Hover Me!</button> <div id="target">I'm hovered too!</div> </div>#parent { position: relative; height: 100px; } /* Move button control to bottom. */ #control { position: absolute; bottom: 0; } #control:hover ~ #target { background: red; }
Как упоминалось ранее, "нет селектора CSS для выбора родителя выбранного ребенка".
Так ты тоже:
- используйте CSS hack, как описано в ответе NGLN
- используйте javascript-вместе с jQuery скорее всего
вот пример javascript / jQuery решение
на стороне javascript:
$('#my-id-selector-00').on('mouseover', function(){ $(this).parent().addClass('is-hover'); }).on('mouseout', function(){ $(this).parent().removeClass('is-hover'); })и на стороне CSS, вы бы есть что-то вроде этого:
.is-hover { background-color: red; }
это решение полностью зависит от дизайна, но если у вас есть родительский div, который вы хотите изменить фон при наведении на ребенка вы можете попробовать, чтобы имитировать родителей с
::after/::before.<div class="item"> design <span class="icon-cross">x</span> </div>CSS:
.item { background: blue; border-radius: 10px; position: relative; z-index: 1; } .item span.icon-cross:hover::after { background: DodgerBlue; border-radius: 10px; display: block; position: absolute; z-index: -1; top: 0; left: 0; right: 0; bottom: 0; content: ""; }
Я нахожу наиболее удобным и легким для меня быть что-то вроде этого:
CSS.main-nav > li:hover > a { background: #000; }здесь
HTML<ul class="main-nav"> <li><a href="#">Home</a></li> <li><a href="#">About Us</a> <ul class="main-sub-nav"> <li><a href="#">About Sub 1</a></li> <li><a href="#">About Sub 2</a></li> </ul> </li> <li><a href="#">Contact Us</a></li> </ul>
Это очень легко сделать в Sass! Не углубляйтесь в JavaScript для этого. И селектор в Sass делает именно это.
http://thesassway.com/intermediate/referencing-parent-selectors-using-ampersand


Comments