Как применить 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>