我知道不存在CSS父选择器,但是在不使用选择器的情况下将子元素悬停在父元素上时是否可以设置样式?

举个例子:考虑一下删除按钮悬停将突出显示将要删除的元素:

<div>
    <p>Lorem ipsum ...</p>
    <button>Delete</button>
</div>


通过纯CSS的方法,当鼠标悬停在鼠标上方时如何更改此部分的背景颜色按钮?

评论

是否存在CSS父选择器?

可能的解决方案:stackoverflow.com/q/39374918/3597276

#1 楼

好吧,这个问题之前已经被问过很多次了,最简短的典型答案是:纯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}
 




显然,在大多数情况下,此技巧取决于绝对定位的使用,以使兄弟姐妹具有与父对象相同的大小,并仍然允许子对象出现在父对象中。
< br有时,有必要使用更合格的选择器路径来选择特定元素,如此小提琴所示,该小提琴在树形菜单中多次实现了该技巧。真的很好。

评论


这对突出显示很有用,但是如果您尝试更改字体颜色将不起作用,对吗?

–贾汗泽布·汗(Jahanzeb Khan)
13年7月12日在11:39

@JahanzebKhan更改字体颜色没有问题。

– NGLN
13年7月12日在15:42

#2 楼

我知道这是一个老问题,但是我设法做到了没有伪子对象(而是伪包装器)。

如果将父级设置为不带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;
}     





编辑:
正如Shadow Wizard亲切指出的:值得一提的是,这不适用于IE10及以下版本。 (也有FF和Chrome的旧版本,请参见此处)

评论


值得一提的是,这不适用于IE10及以下版本。 (FF和Chrome的旧版本也是如此,请参见此处)

–影子向导正在接种疫苗
17年5月3日在7:22



将指针事件设置为none也意味着该元素上的事件侦听器将无法工作。

–rhazen
18/09/25在9:49

@rhazen你是完全正确的。尽管根据我的经验,这种用法通常与单个点击区域/元素相关,但是您可以将点击侦听器分配给父对象

–guy_m
18-09-26在0:29



如果我有两个级别的父级,child1和child1的子级,该怎么办。我没有将指针事件添加到父级,而将指针事件自动添加到了子级。我想将鼠标悬停在child1的孩子之外的child1上。此处演示:codepen.io/lion5893/pen/WNQgyVx

– NamLêQuý
5月15日6:46

#3 楼

另一种更简单的方法(针对一个老问题)。
将元素放置为兄弟姐妹并使用:

相邻兄弟选择器(+

常规兄弟选择器(~

 <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;
}
 




演示小提琴在这里。

评论


值得注意的是,这仅适用于#targets在DOM中的#control之后(即,您不能影响以前的兄弟姐妹,而只能影响后面的兄弟姐妹)

– Gio
3月16日10:41

#4 楼

没有用于选择所选子项的父项的CSS选择器。

您可以使用JavaScript进行选择

评论


真正。像$(child).hover(function(){$(this).closest(parentSelector).addClass('hoverClass')},function(){$(this).closest(parentSelector).removeClass('hoverClass' )});

– Aamir Afridi
2014年1月16日,9:42

@AamirAfridi虽然这不是纯JS,但您必须使用jQuery。

– Ivotje50
15年3月22日在14:29

#5 楼

如前所述,“没有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;
}


#6 楼

此解决方案完全取决于设计,但是如果您有一个要在悬停孩子时更改背景的父级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: "";
}


在此处查看完整的小提琴示例

#7 楼

适用于不需要纯CSS解决方案的人的简单jquery解决方案:




     $(".letter").hover(function() {
      $(this).closest("#word").toggleClass("hovered")
    }); 

 .hovered {
  background-color: lightblue;
}

.letter {
  margin: 20px;
  background: lightgray;
}

.letter:hover {
  background: grey;
} 

 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="word">
  <div class="letter">T</div>
  <div class="letter">E</div>
  <div class="letter">S</div>
  <div class="letter">T</div>
</div> 




#8 楼

这在Sass中非常容易做到!请勿深入研究JavaScript。 sass中的&选择器完全可以做到这一点。

http://thesassway.com/intermediate/referencing-parent-selectors-using-ampersand

评论


-1 Sass不会为CSS添加更多功能,而只是使编写变得更容易。您可以在sass中做的所有事情都可以在css中完成,反之亦然。

– Dastur
16年9月1日在7:01

@Dastur给定变量和mixins,我想说Sass给CSS增加了很多。您可以在CSS中完成所有操作,就像您仍然可以使用普通的旧C语言编写复杂的软件一样。现代语言在不启用以前无法完成的功能的情况下增加了很多。与Sass和CSS相同。

–科布斯·克鲁格(Cobus Kruger)
16年11月1日在9:11

@Cobus Kruger您的部分正确,但您无法进行比较。尽管c ++ c#和javascript之类的语言可能基于C,但它们在运行时不会变成C。 Sass在运行时之前在CSS中进行了转换,因此您永远不会真正加载Sass样式表,而只是加载CSS样式表。

– Dastur
16年11月1日在13:29