Как я могу использовать зависание в дочернем элементе без активации родительского зависания?

Мой код может добавлять div в качестве дочернего элемента или родственного элемента, я создал два класса и два :hover для каждого класса, но когда я навожу мышь на дочерний элемент, также активируется родительское наведение.

.Group {
  background-color: white;
}

.Group2 {
  background-color: white;
}

.Group:hover {
  background-color: yellow;
}

.Group2:hover {
  background-color: red;
}
<div class="Group">
  root
  <div class="Group">1st child
    <div class="Group2">2nd child
      <div class="Group">3rd child</div>
    </div>
  </div>
  <div class="Group">1st child</div>
</div>


person Simone Rizzi    schedule 09.08.2013    source источник
comment
Что должно произойти, когда вы наведете курсор на .Group2? активируется только красный фон?   -  person Marc Audet    schedule 09.08.2013
comment
да, но это также показывает двух родителей   -  person Simone Rizzi    schedule 09.08.2013


Ответы (6)


Если вы наводите курсор на дочерний элемент, вы также наводите курсор на родительский элемент, и это невозможно обойти.

Что вы можете сделать, так это установить другой или дополнительный класс для 1-го дочернего элемента, у которого нет других дочерних элементов.

person CaribouCode    schedule 09.08.2013
comment
но, как вы можете видеть для второго ребенка с другим классом, проблема не решена, я попытался использовать p вместо div, и это работает, но не выглядит хорошим решением - person Simone Rizzi; 09.08.2013

Подсветка цветов фона во вложенных блоках при наведении

Если вы пытаетесь активировать фоновые цвета вложенных блоков div, я думаю, вы ищете следующее.

Для HTML используйте разные имена классов для идентификации каждого слоя вложенных div блоков:

<div class="Group">root
    <div class="Group1">1st child
        <div class="Group2">2nd child
            <div class="Group3">3rd child</div>
        </div>
    </div>
    <div class="Group1">1st child</div>
</div>

и CSS:

.Group, .Group1, .Group2, .Group3 {
    background-color:transparent;
}
.Group:hover {
    background-color:yellow;
}
.Group1:hover {
    background-color:pink;
}
.Group2:hover {
    background-color:red;
}
.Group3:hover {
    background-color:orange;
}

Демонстрационная скрипта: http://jsfiddle.net/audetwebdesign/Scr9G/

Когда вы последовательно наводите курсор на каждую вложенную div, цвет фона последовательно меняется.

Если вы пытаетесь настроить таргетинг на вложенный элемент с помощью :hover без эффекта, всплывающего через родительские/предковые блоки, вам потребуется использовать JavaScript/jQuery для создания необходимых правил выбора.

Причудливый хак с использованием тегов <p>

Следующая конструкция демонстрирует поведение, которое хотел бы видеть ОП:

<p class="Group">root
    <p class="Group">1st child
        <p class="Group2">2nd child
            <p class="Group">3rd child</p>
        </p>
    </p>
    <p class="Group">1st child</p>
</p>

и CSS прежний:

.Group {
    background-color:white;
}
.Group2 {
    background-color:white;
}
.Group:hover {
    background-color:yellow;
}
.Group2:hover {
    background-color:red;
}

Вторая демонстрационная скрипта: http://jsfiddle.net/audetwebdesign/cf2mn/

В этом случае OP пытался вложить теги <p>, которые на самом деле не работают, как вложение других элементов блока, таких как <div>.

При использовании тегов <p> закрывающий тег </p> является необязательным, если за ним следуют другие элементы потока, такие как p, div, ul и так далее.

В этом случае показанный выше фрагмент HTML эквивалентен следующему:

<p class="Group">root</p>
<p class="Group">1st child</p>
<p class="Group2">2nd child</p>
<p class="Group">3rd child</p>
<p class="Group">1st child</p>

это означает, что все вкладки p являются одноуровневыми, и нет никаких отношений между родителями и детьми, поэтому CSS работает так, как хотелось бы OP.

Если бы теги div использовались вместо тегов p, результирующий DOM продемонстрировал бы отношения родитель-потомок, а CSS показал бы исходное поведение, которого не хотел OP.

Использование тегов p может дать желаемый эффект для CSS, но это работает только потому, что элементы DOM являются одноуровневыми, а не родительско-дочерними. (Кроме того, вложенные теги p не будут проверяться.)

Стоит отметить, что:

CSS 2.1 не определяет, находится ли родитель элемента, который является ':active' или ':hover', также в этом состоянии.

поэтому лучше не полагаться на состояние родительского элемента при применении псевдоэлемента к дочернему элементу.

Ссылки:

О :hover: http://www.w3.org/TR/CSS2/selector.html#dynamic-pseudo-classes

О необязательном закрытии тега p: http://www.w3.org/TR/html-markup/p.html#p

person Marc Audet    schedule 09.08.2013
comment
на самом деле я хотел бы получить такой результат: jsfiddle.net/u7tYE/2127, но, как мы знаем у нас не может быть одного ‹p›: внутри другогоone - person Simone Rizzi; 09.08.2013

Невозможно запретить родительским элементам получать цвет фона. Вместо этого используйте этот код

<div class="root">
Main Root
<div class="group">
    First One
</div>
<div class="group2">
    Second One
</div>
<div class="group">
    Third One
</div>

.group:hover {
    background: yellow;
}
.group2:hover {
    background: red;
}

SEE THE DEMO HERE

person Vikas Ghodke    schedule 09.08.2013
comment
но если у меня есть еще один ребенок, например, второй ребенок или третий ребенок в моем примере, ваше решение не работает :-( - person Simone Rizzi; 09.08.2013

Дайте отдельные идентификаторы div, и когда дочерний div находится над ним, измените цвет его фонового изображения и одновременно удалите цвет фона родителя. Я думаю, это единственный способ обойти это

person Ahmed    schedule 09.08.2013
comment
моя проблема в том, что я создал дочерний элемент динамически, чем я не уверен, что смогу создать время выполнения css для создания nwChildId: hover - person Simone Rizzi; 09.08.2013

Самый простой и лучший способ — использовать любой другой элемент, например li.

CSS:

.Group, .Group2, .Group3
{
background:white;
display: block;
list-style: none;
}
.parent
{
margin: 0;
display: block;
padding: 0;
}
.Group:hover
{
background: yellow;
}
.Group2:hover
{
background: red;
}
.Group3:hover
{
background: yellow;
}

HTML:

<ul class="parent" >
<li class="Group" >root
  <li class="Group">1st child
    <li class="Group2">2nd child
      <li class="Group3">3rd child</li>
    </li >
  </li >
  <li class="Group">1st child</li >
</li>
</ul>
person NatureShade    schedule 09.08.2013
comment
Закрывающий тег в теге li является необязательным. В этом случае вы, по сути, заставили все теги li вести себя как одноуровневые дочерние элементы блока ul.parent. Этот фрагмент HTML не будет проверен. - person Marc Audet; 09.08.2013

Вы должны добавить подэлемент для контента и использовать псевдоселектор element+element.

.group-content:hover {
  background-color: yellow;
}

.group-content:hover + .group {
    background-color: red;
}
<div class="group">
  <div class="group-content">1st child</div>
  <div class="group">
    <div class="group-content">2nd child</div>
    <div class="group">
      <div class="group-content">3nd child</div>
    </div>
  </div>
</div>
<div class="group">
  <div class="group-content">1st child</div>
</div>

person Alexey Prokopenko    schedule 05.03.2018