将悬停样式应用于任何孩子但不是父母

Posted

技术标签:

【中文标题】将悬停样式应用于任何孩子但不是父母【英文标题】:Apply hover style to any child but not parent 【发布时间】:2015-11-18 11:47:50 【问题描述】:

我正在构建一个需要用户单击/选择页面上的元素的工具。页面内容/结构/css 未知。

我正在使用 javascript 鼠标进入/离开事件向元素添加/删除大纲类并向用户显示他们正在选择的内容。但是,这些事件是不可靠的,并且轮廓元素并不总是被单击的元素。

使用:hover css 添加样式更快更可靠。

有没有办法勾勒出任何悬停的元素,但没有它的父元素?

一种方法是:

*:hover outline: 1px solid green;

示例:http://codepen.io/anon/pen/xGvXbm

但这会勾勒出元素的每个父元素。

有没有办法从这个选择器中排除父母?

【问题讨论】:

不....对不起。如果您将鼠标悬停在孩子身上,那么您将悬停在父母身上。 尝试检查类似问题的答案:***.com/a/2701495/3340702 CSS How to apply child:hover but not parent:hover 的可能副本 你能阻止悬停事件的传播吗?还是有一些选择器只能获取您所在的元素? 这在 CSS 中是不可能的。每个子元素都在父元素内部,因此当您将鼠标悬停在子元素上时,您也将鼠标悬停在其所有父元素上。这可能在 Javascript 中是可能的,但是...... 【参考方案1】:
:hover *  outline: 1px solid green; 

也就是说,找到任何悬停的元素并将此样式应用于所有子元素。

【讨论】:

使用该方法,当body悬停时,样式应用于页面上的每个元素 如果你只想从正文中选择元素,你可以body :hover *【参考方案2】:

您可以通过创建 2 个(或更多 div)兄弟而不是后代来做到这一点。然后绝对定位它们。 现在,如果您对它们应用悬停,那么它将独立工作,因为它们不会相互继承。

例如:

<div class="one">
</div>
<div class="two">
</div>
<div class="three">
</div>

然后是css

 *:hover 
   outline: 3px solid red;
  

 .two, .three 

  position:absolute;
  top:0;
  left:0;
  

【讨论】:

【参考方案3】:

使用 jQuery,您可以执行以下操作:

$('*').hover(
  function() 
    $('*').css('outline', 'none')
    $(this).css('outline', '3px solid red')
  ,
  function() 
    $(this).css('outline', 'none')
  
)

您还必须删除 :hover CSS 规则。 查看CodePen 以及下面的 sn-p。

注意这似乎只在进入元素时起作用,离开时你必须有一个.mousemove()函数并检测鼠标是否在元素上,然后重复第一个.hover()函数中的代码。

$('*').hover(
  function() 
    $('*').css('outline', 'none')
    $(this).css('outline', '3px solid red')
  ,
  function() 
    $(this).css('outline', 'none')
  
)
/* *:hover 
  outline: 3px solid red;
 */

.one 
  display: inline-block;
  width: 1000px;
  height: 800px;
  background-color: green;


.two 
  display: inline-block;
  width: 200px;
  height: 200px;
  background-color: yellow;


.three 
  display: inline-block;
  width: 100px;
  height: 100px;
  background-color: blue;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="one">
  <div class="two">
    <div class="three"></div>
  </div>
  <div class="two">
  </div>
</div>

【讨论】:

以上是关于将悬停样式应用于任何孩子但不是父母的主要内容,如果未能解决你的问题,请参考以下文章

如果父母改变孩子的背景:悬停

如果没有父母的悬停被激活,我怎样才能在孩子中使用?

Jquery选择孩子但不是父母

将孩子的属性应用到父母

将孩子添加到父母后是不是必须调用 doLayout() 方法?

查找父母的上一个兄弟姐妹的孩子(其中任何一个)是不是包含特定文本