Как применить child: hover, но не parent: hover

С помощью следующего html, когда я наводю курсор на child, я получаю зеленый фон на parent. Как я могу остановить это? Мне нужен зеленый фон, если я нахожусь за пределами дочернего элемента.

CSS3 в порядке.

.parent {
  padding: 100px;
  width: 400px;
  height: 400px;
}

.parent:hover {
  background-color: green;
}

.child {
  padding: 100px;
  width: 200px;
  height: 200px;
}

.child:hover {
  background-color: blue;
}
<div class="parent">
  <div class="child">Child</div>
</div>

Ответы

Ответ 1

Так что это действительно уродливо, но это работает (вроде). Я в основном создаю дубликат родителя как родного брата ребенка. Перезапись родителя по умолчанию скрыта, а затем отображается при наведении на дочерний элемент. Chrome не понравится, если вы не используете селектор + вместо селектора ~. Это не очень масштабируемо, но может работать.

Как написали другие ребята, javascript, вероятно, будет лучшим решением.

 <style>
  .parent { padding: 100px; width: 400px; height:400px; position: relative; z-index: 998; }
  .parent:hover { background-color: green; }
  .child { padding: 100px; width: 200px; height:200px; position: relative; z-index: 1000; }
  .child:hover { background-color: blue; }
  .parent-overwrite { padding: inherit; width: inherit; height: inherit; position: absolute; top: 0; left: 0; z-index: 999; background-color: #FFF; display: none; }
  .child:hover ~ .parent-overwrite { display: block; }
</style>

<div class="parent">
    <div class="child">Child</div>
    <div class="parent-overwrite"></div>
</div>

Ответ 2

Я могу сделать это только с добавлением дополнительной разметки. Необходимо добавить пустой div, который по существу функционирует как родительский фон. Взгляните на CSS здесь.

Часть HTML:

  <div class="parent">
    Parent
    <div class="child">
      Child
      <div class="grandson">
        Grandson
        <div class="grandson-bg"></div>
      </div>
      <div class="child-bg"></div>
    </div>
    <div class="parent-bg"></div>
  </div>

часть CSS:

article, aside, figure, footer, header, hgroup, menu, nav, section { display: block; }

  .parent { display: block; position: relative; z-index: 0;
            height: auto; width: auto; padding: 25px;
          }

  .parent-bg { display: block; height: 100%; width: 100%; 
               position: absolute; top: 0px; left: 0px; 
               border: 1px solid white; z-index: 0; 
             }
  .parent-bg:hover { border: 1px solid red; }

  .child { display: block; position: relative; z-index: 1; 
           height: auto; width: auto; padding: 25px;
         }

  .child-bg { display: block; height: 100%; width: 100%; 
              position: absolute; top: 0px; left: 0px; 
              border: 1px solid white; z-index: 0; 
            }
  .child-bg:hover { border: 1px solid red; }

  .grandson { display: block; position: relative; z-index: 2; 
              height: auto; width: auto; padding: 25px;
            }

  .grandson-bg { display: block; height: 100%; width: 100%; 
                 position: absolute; top: 0px; left: 0px; 
                 border: 1px solid white; z-index: 0; 
               }
  .grandson-bg:hover { border: 1px solid red; }

http://jsbin.com/ubiyo3/edit

Ответ 3

Простейшей задачей может быть использование JS для такого рода CSS. Возможно, вы можете попытаться переосмыслить свою реализацию. Почему вы пытаетесь сделать что-то подобное?

Ответ 4

Это невозможно, используя простой ванильный CSS. Вы запрашиваете псевдокласс класса (child:hover), чтобы повлиять на объявление background родителя. Нет способа указать такую ​​вещь, используя обычный css.

Это можно сделать с помощью javascript.

Ответ 5

У меня есть то, что я считаю лучшим решением, поскольку оно масштабируется до большего количества уровней, сколько угодно, не только двух или трех.

Я использую границы, но это также можно сделать с любым желаемым стилем, например фоном.

С границей идея состоит в следующем:

  • У другого цвета границы есть только один div, div над которым находится мышь, а не на любом родителе, а не на любом дочернем элементе, поэтому можно увидеть только такую ​​границу div в другом цвете, в то время как остальное останется на белом.

Вы можете проверить его на: http://jsbin.com/ubiyo3/13

И вот код:

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Hierarchie Borders MarkUp</title>
<style>

  .parent { display: block; position: relative; z-index: 0;
            height: auto; width: auto; padding: 25px;
          }

  .parent-bg { display: block; height: 100%; width: 100%; 
               position: absolute; top: 0px; left: 0px; 
               border: 1px solid white; z-index: 0; 
             }
  .parent-bg:hover { border: 1px solid red; }

  .child { display: block; position: relative; z-index: 1; 
           height: auto; width: auto; padding: 25px;
         }

  .child-bg { display: block; height: 100%; width: 100%; 
              position: absolute; top: 0px; left: 0px; 
              border: 1px solid white; z-index: 0; 
            }
  .child-bg:hover { border: 1px solid red; }

  .grandson { display: block; position: relative; z-index: 2; 
              height: auto; width: auto; padding: 25px;
            }

  .grandson-bg { display: block; height: 100%; width: 100%; 
                 position: absolute; top: 0px; left: 0px; 
                 border: 1px solid white; z-index: 0; 
               }
  .grandson-bg:hover { border: 1px solid red; }

</style>
</head>
<body>
  <div class="parent">
    Parent
    <div class="child">
      Child
      <div class="grandson">
        Grandson
        <div class="grandson-bg"></div>
      </div>
      <div class="child-bg"></div>
    </div>
    <div class="parent-bg"></div>
  </div>
</body>
</html>