【问题标题】:How to style the parent element when hovering a child element?悬停子元素时如何设置父元素的样式?
【发布时间】:2011-12-28 05:12:39
【问题描述】:

我知道不存在CSS parent selector,但是在没有此类选择器的情况下悬停子元素时是否可以设置父元素的样式?

举个例子:考虑一个删除按钮,当它悬停时会突出显示即将被删除的元素:

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

通过纯CSS的方式,如何在鼠标悬停在按钮上时,改变本节的背景颜色?

【问题讨论】:

标签: html css


【解决方案1】:

嗯,这个问题以前被问过很多次,简短的典型回答是:纯 CSS 做不到。它的名字是:层叠样式表只支持层叠方向的样式,不支持向上。

但是在大多数需要这种效果的情况下,例如在给定的示例中,仍然有可能使用这些级联特征来达到所需的效果。考虑这个伪标记:

<parent>
    <sibling></sibling>
    <child></child>
</parent>

诀窍是赋予兄弟姐妹与父级相同的大小和位置,并设置兄弟级而不是父级的样式。这看起来像父级的样式!

现在,如何设置兄弟的样式?

当孩子悬停时,父母也是,但兄弟姐妹不是。兄弟姐妹也是如此。这总结了三个可能的 CSS 选择器路径,用于设置兄弟的样式:

parent sibling { }
parent sibling:hover { }
parent:hover sibling { }

这些不同的路径提供了一些不错的可能性。例如,对问题中的示例使用此技巧会导致 this fiddle

div {position: relative}
div:hover {background: salmon}
div p:hover {background: white}
div p {padding-bottom: 26px}
div button {position: absolute; bottom: 0}

显然,在大多数情况下,这个技巧依赖于使用绝对定位来使兄弟姐妹与父节点大小相同,并且仍然让子节点出现在父节点中。

有时需要使用更合格的选择器路径来选择特定元素,如 this fiddle 所示,它在树形菜单中多次实现该技巧。真的很不错。

【讨论】:

  • 这对突出显示很有用,但如果你尝试改变字体颜色就不行了,对吗?
  • @JahanzebKhan 更改字体颜色 is no problem.
【解决方案2】:

我知道这是一个老问题,但我只是设法在没有伪孩子(但伪包装器)的情况下做到了。

如果您将父级设置为没有pointer-events,然后将子级div 设置为pointer-events 设置为auto,它可以工作:)
请注意,&lt;img&gt; 标记(例如)不起作用。
还记得将pointer-events 设置为auto 以供其他拥有自己的事件侦听器的孩子使用,否则他们将失去点击功能。

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 也可以,请参阅here

【讨论】:

  • 值得一提的是,这不适用于 IE10 及以下版本。 (旧版本的 FF 和 Chrome 也可以,请参阅 here
  • 将指针事件设置为无也意味着该元素上的事件侦听器将不起作用..!
  • @rhazen 你是绝对正确的。尽管根据我的经验,这种用法通常连接到单击区域/元素,因此您可以将单击侦听器分配给父级
  • 如果我有两层,parent,child1,child1的child。我将指针事件无添加到父项,将指针事件自动添加到子项。我想将鼠标悬停在 child1 上,除了孩子 1 的孩子。这里演示:codepen.io/lion5893/pen/WNQgyVx
  • 这是一个大拇指兄弟,当我只悬停孩子时,我设法对父级进行 css,wp
【解决方案3】:

另一种更简单的“替代”方法(针对一个老问题)..
将元素放置为 siblings 并使用:

Adjacent Sibling Selector (+) 要么 General Sibling Selector (~)

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

Demo Fiddle here.

【讨论】:

  • 值得注意的是,这仅适用于 #targets 在 DOM 中的 #control 之后(即,您不能影响以前的兄弟姐妹,只能影响后面的兄弟姐妹)
【解决方案4】:

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

你可以用 JavaScript 做到这一点

【讨论】:

  • 真的。类似于 $(child).hover(function(){$(this).closest(parentSelector).addClass('hoverClass')}, function(){$(this).closest(parentSelector).removeClass('hoverClass' )});
  • @AamirAfridi 不过这不是纯 JS,你必须使用 jQuery。
【解决方案5】:

如前所述,“没有用于选择所选孩子的父母的 CSS 选择器”。

所以你要么:


这是 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: "";
    }
    

    See a full fiddle example here

    【讨论】:

      【解决方案7】:

      这在 Sass 中非常容易做到!不要为此深入研究 JavaScript。 sass 中的 & 选择器正是这样做的。

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

      【讨论】:

      • -1 Sass 没有为 css 添加更多功能,它只是让编写变得更容易。你可以在 sass 中做的任何事情都可以在 css 中完成,反之亦然。
      • @Dastur 给定变量和 mixin,我会说 Sass 为 CSS 添加了很多东西。您可以在 CSS 中完成这一切,就像您仍然可以使用普通的旧 C 语言编写复杂的软件一样。现代语言添加了很多内容,而无需启用以前无法完成的功能。与 Sass 和 CSS 相同。
      • @Cobus Kruger 您部分正确,但您无法进行比较。尽管像 c++、c# 和 javascript 这样的语言可能基于 C,但它们在运行之前不会变成 C。 Sass 在运行前在 css 中转换,因此您永远不会真正加载 sass 样式表,只是一个 css 样式表。
      猜你喜欢
      • 1970-01-01
      • 2011-11-05
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      相关资源
      最近更新 更多