【问题标题】:How do I only target the :hovered element and none of its parents in CSS?如何在 CSS 中只定位 :hovered 元素而不定位其父元素?
【发布时间】:2014-10-06 03:00:24
【问题描述】:

所以我有嵌套的 div。当我将鼠标悬停在一个 div 上时,我希望该 div 和 没有其他 div 获得box-shadow。不幸的是,:hovered div 的父母也是box-shadowing,因为他们有相同的签名。我无法更改它,因为它们来自无限嵌套模板。

我想我只需要用box-shadow 定位任何:hovered 的列表项,然后定位它的父项以防止他们表达box-shadow,但我不知道如何在CSS 中表达这一点:

ul:hover{
  box-shadow: 0px 1px 2px 1px rgba(0,0,0,0.12);
}

<some statement..?>{
  box-shadow: none;
}

编辑: This is a JSFiddle of my thing

【问题讨论】:

  • 您希望有选择地定位 div。您想要定位的 div 元素是否有任何独特的 DOM 结构?即,它们是具有特定 ID 的元素的子元素,而其他 div 不是?
  • 据我所知,目前还没有可用的父级定位语法。
  • 继续阅读CSS Specificity
  • 你能发布这个嵌套模板的 jsfiddle 吗?只需检查容器上的元素并复制为 html,然后在 jsfiddle 中复制粘贴。
  • @Randyaa 我想删除整个 UL 即 :hovered没有别的(就像它的父母一样)

标签: html hover mouseover css


【解决方案1】:

您可以通过为您的元素指定一个 id 来做到这一点:

<style type="text/css">
div[id='child']:hover{
background-color:purple;
}

</style>

<div id='parent'>

Hello<br>
<div id='child'>hi<div>

</div>

jsfiddle example

【讨论】:

  • 需要能够无限嵌套;不幸的是,我不能直接命名这些元素,也不能因此给它们类。
  • 这并不能真正回答问题;并不是他们想要专门针对一个元素,而是他们想要 - 不 - 以父母为目标,而只针对底层元素。你的解决方案意味着给所有东西和它的母亲一个 id。
【解决方案2】:

您没有选择正确的元素。使用:

span:hover {
  box-shadow: 0px 1px 2px 1px rgba(0,0,0,0.12);
}

小提琴:http://jsfiddle.net/vy3g5e64/1/

【讨论】:

  • 他们想避免选择父母;目前不可能的事情。
  • 我希望阴影封装整个项目,而不仅仅是其中的文本。我知道把选择器 tyvm 放在哪里。
  • @Daedalus 这不可能吗?真的吗?
  • @ThatTreeOverThere 在 css3 中没有父选择器。 css4 中可能有一个;这是规格:dev.w3.org/csswg/selectors4/#relational 这是进一步阅读:stackoverflow.com/a/1014958/785241
  • @ThatTreeOverThere 误解了你的问题。不幸的是,我能想到的唯一方法是使用 javascript。
【解决方案3】:

如果您有一个无法修改其结构的嵌套模板,您始终可以使用 css 特性来覆盖悬停时的视觉效果(添加框阴影)。

我看到你有ul:hover { box-shadow: 0px 1px 2px 1px rgba(0,0,0,0.12); }

而且你想避免它被应用到所有的 li 上,对吧?

你应该应用到每个单独的li而不是ul,如果你需要覆盖一些属性而不能修改结构,在html中添加id或类,你可以使用特异性来覆盖一些属性。

例如,如果你想覆盖

 ul:hover{
  box-shadow: 0px 1px 2px 1px rgba(0,0,0,0.12);
}

您可以更具体一些,并在选择器中添加父元素,例如:

div ul:hover{
   box-shadow: 0px 1px 2px 1px rgba(0,0,0,0.12);
}

在此处查看特异性的工作原理。 Prioritize id selector over an id and class

编辑

注意到添加的jsfiddle后:

只需选择 li 元素,但是:

ul li:hover{
  box-shadow: 0px 1px 2px 1px rgba(0,0,0,0.12);
}

您的 jsfiddle 中的 div 后面有一个跨度。 然后,您可以简单地定位跨度并为其添加显示块和 100% 宽度,以提供类似于应用于 li 的框阴影:

ul li span:hover{
  box-shadow: 0px 1px 2px 1px rgba(0,0,0,0.12);
}

span{ display:block; width:100%; }

如果您需要定位父元素,则当前 CSS3 规范没有可用的选择器。您可以使用这个 CssParentSelector jQuery 插件作为解决方法,并能够在 CSS 中选择父元素:https://github.com/Idered/cssParentSelector

【讨论】:

  • 我想选择整个列表,而不仅仅是其中的文本。我希望它做它现在正在做的事情,而不是在树中的每个元素上。
  • 好的,那么您想选择哪个元素,哪个不选择?
  • 当我将鼠标悬停在顶部时,我想选择包含所有内容的容器。当我将鼠标悬停在较低级别时,我想选择该容器并且只选择那个容器,而不是它上面的容器。
  • 但是 jsfiddle 是您正在处理的模板吗?它似乎来自一个有角度的 js 应用程序......
  • 是的。我只是不想嵌入我的整个应用程序,因为这与minimal example 相差甚远;我只是放弃了它的渲染形式,因为这就是真正效果所需要的全部
猜你喜欢
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
相关资源
最近更新 更多