我知道并不存在CSS父选择器,但是在没有这样的选择器的情况下,是否有可能在悬停子元素时为父元素设置样式?
举个例子:考虑一个删除按钮,当悬停时会突出显示即将被删除的元素:
<div>
<p>Lorem ipsum ...</p>
<button>Delete</button>
</div>
通过纯CSS,当鼠标悬停在按钮上时,如何更改此部分的背景颜色?
我知道并不存在CSS父选择器,但是在没有这样的选择器的情况下,是否有可能在悬停子元素时为父元素设置样式?
举个例子:考虑一个删除按钮,当悬停时会突出显示即将被删除的元素:
<div>
<p>Lorem ipsum ...</p>
<button>Delete</button>
</div>
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>
编辑:
正如Shadow Wizard友好地指出的那样:值得一提的是,这在IE10及以下版本中不起作用。(旧版FF和Chrome也是如此,请参见此处)
这个问题之前被问过很多次,而典型的简短答案是:无法仅通过 CSS 实现。它体现在名称中:Cascading Style Sheets 只支持在级联方向上进行样式定义,而不支持向上。
但是在大多数情况下,例如给定示例中,仍然可以利用这些级联特性来实现所需效果。考虑这个伪标记:
<parent>
<sibling></sibling>
<child></child>
</parent>
关键在于让兄弟元素与父元素大小和位置相同,并对兄弟元素进行样式设置而不是对父元素进行设置。这样看起来就像是对父元素进行了样式设置!
现在,如何对兄弟元素进行样式设置呢?
当子元素被悬停时,父元素也会被悬停,但兄弟元素不会被悬停。同样的情况也适用于兄弟元素。因此,有三种可能的 CSS 选择器路径可用于对兄弟元素进行样式设置:
parent sibling { }
parent sibling:hover { }
parent:hover sibling { }
这些不同的路径可以带来一些不错的可能性。例如,在问题示例上使用这个技巧会得到这个fiddle:
div {position: relative}
div:hover {background: salmon}
div p:hover {background: white}
div p {padding-bottom: 26px}
div button {position: absolute; bottom: 0}
显然,在大多数情况下,这个技巧依赖于使用绝对定位来使兄弟元素和父元素具有相同的大小,并且仍然让子元素出现在父元素内部。
有时需要使用更合适的选择器路径来选择特定的元素,例如在此 jsfiddle中展示了如何在树形菜单中多次实现该技巧。真的很好用。
:has()
选择器,目前仍不支持)能尽快支持这一功能,因为这样可以让我在用户悬停在结束屏幕项目上时更轻松地调暗视频播放器。 - undefined另一种更简单的“替代”方法(针对一个老问题)是将元素放置为兄弟元素,并使用:
<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中没有选择已选中子元素的父元素的选择器。
您可以使用JavaScript实现它。
如先前提到的“没有CSS选择器可以选择已选子元素的父级”。
所以你可以:
在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;
}
这个解决方案完全取决于设计,但如果您想在鼠标悬停在子元素时更改父元素的背景色,可以尝试使用 ::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: "";
}
在Sass中,这非常容易做到!不需要深入JavaScript。sass中的&选择器正好可以做到这一点。
http://thesassway.com/intermediate/referencing-parent-selectors-using-ampersand