有一个CSS父选择器吗?

jcu*_*nod 2986 css css-selectors

如何选择<li>作为锚元素直接父元素的元素?

在示例中,我的CSS将是这样的:

li < a.active {
    property: value;
}
Run Code Online (Sandbox Code Playgroud)

显然有一些方法可以使用JavaScript来实现这一点,但我希望CSS Level 2本身存在某种解决方法.

我尝试设置样式的菜单正在由CMS喷出,因此我无法将活动元素移动到<li>元素...(除非我主题菜单创建模块,我宁愿不这样做).

有任何想法吗?

Dan*_*ert 2380

目前无法在CSS中选择元素的父级.

如果有办法,它将在当前的CSS选择器规范中:

与此同时,如果您需要选择父元素,则必须使用JavaScript.


选择器4级工作草案包括:has()伪类的作品一样的jQuery的实现.截至2018年,任何浏览器仍然不支持此功能.

使用:has()原始问题可以通过以下方法解决:

li:has(> a.active) { /* styles to apply to the li tag */ }
Run Code Online (Sandbox Code Playgroud)

  • 它似乎已被建议和拒绝:http://stackoverflow.com/questions/45004/complex-css-selector-for-parent-of-active-child/45530#45530 (62认同)
  • 另一个主要的更新:看起来他们正在考虑完全取消主题选择器语法并将其替换为`:has()`pseudo,每个人都会从jQuery中了解并喜欢它.最新的ED删除了对主题指示符的所有引用,并将其替换为`:has()`pseudo.我不知道具体原因,但CSSWG不久前举行了一次民意调查,结果肯定会影响这一决定.它最有可能与jQuery兼容(因此它可以在不进行修改的情况下利用qSA),并且因为主题指示器语法被证明太混乱了. (53认同)
  • 主要情节扭曲!选择器4 WD刚刚[今天](http://www.w3.org/TR/2013/WD-selectors4-20130502)更新,以从快速配置文件中排除主题指示符,CSS指令将使用该指示符.如果此更改仍然存在,则表示您将无法再使用样式表中的主题指示器(除非您使用添加某种类型的polyfill,如[另一个答案]中所述)(http://stackoverflow.com/questions/ 1014861/is-there-a-css-parent-selector/7049832#7049832)) - 您只能将它与Selectors API以及可以实现完整配置文件的任何其他地方一起使用. (49认同)
  • 看起来像[主题选择器](http://dev.w3.org/csswg/selectors4/#subject)已被重新访问,除了使用`!`now:`选择器的主题可以通过附加显式标识感叹号中的一个复合选择器的感叹号(!) (13认同)
  • 前面的'$`对我来说看起来更好......附加的`!`可以更容易被忽略. (13认同)
  • @Juan Cascading并不是在CSS中创建"父"选择器的限制.已有兄弟选择器,奇数/偶数选择器,以及各种选择器,这些选择器指的是没有任何"自上而下"模式的元素状态/位置.真正的限制是实现细节.浏览器优化了选择器,只能向前解析,因此任何需要回溯的选择器都是低效的.这就是为什么有一个"下一个兄弟"选择器,但没有"前一个兄弟"选择器的原因. (9认同)
  • @Juan这不是"级联"在这种情况下的含义.级联几乎与选择器无关.样式表"级联"的意思是"a {rule1:value; } .foo {rule2:value2; 在`rule1`和`rule2`中,它们的值设置在一个带有`foo`类的`a`元素上.父选择器的存在与此无关. (6认同)
  • 所以,相应的选择器将是`li:has(> a.active)`.请注意,jQuery已经支持`:has()`中的相对选择器语法,尽管它没有在任何地方记录. (4认同)
  • @Juan:这与级联完全无关. (4认同)
  • 就像快速一样,Selectors 4 WD在几个月前更新了,以包含新语法.当然,将"旧"不可用的样本更新为仍然无法使用的东西将是徒劳的.此外,他们仍然没有决定最终的语法. (3认同)
  • @David Thomas:大多数人都没有意识到这一点,但Selectors之所以成为自己的模块的原因是,虽然选择器最初被设想为CSS的一部分,但它们现在被用于除样式表以外的许多地方,例如库像jQuery和测试框架,如Selenium.我认为所有这一切的要点是不要让CSS实现的性质影响可以为更广泛的目的定义哪种选择器. (3认同)
  • 它不是css4,它们也需要停止说css3,它只是来自这里的css.工作草案或水平是可以的,但'css3'和'css4'的公然标记必须停止,否则每个人都会开始像疯了一样把它们弄出来.CSS ......看到了什么? (3认同)
  • 如果有人读这篇文章可以给草稿提供输入,那么```似乎是现在选择的符号,那么如何在CSS属性中为`!important`做一个单独的`!`的别名.这样,当在_CSS_中思考时,`!`具有统一的含义(类似于)_"我想要这个"_.由此构建,附加在选择器中也可能更适合均匀性.了解`span!:nth-​​child(4)`(跨越4个孩子)和`span:nth-​​child(4)!`(跨度的第4个孩子)之间的区别.我希望这些想法可以进入讨论! (2认同)
  • @Paul S.:如果你想选择一个有4个孩子的跨度,正确的选择器就是`span!>:nth-​​child(4)`,如果你想选择span的第4个子节点,那就是`span>:nth-​​child(4)`(今天已经是一个有效的选择器).它们中的每一个都有两个复合选择器:`span`和`:nth-​​child(4)`,默认情况下(因为它已经是当前的CSS)最右边的一个是主题,这使得`!`可选在后一种情况下. (2认同)
  • @osirisgothra:是的,即使是 CSS3 的官方定义也是“CSS2 之外的任何东西”,这在实践中完全没有意义(当然也没有“CSS4”)。 (2认同)
  • @jhpratt 你在向合唱团讲道,伙计。我知道工作组如何运作和编写规范,多年来一直与他们合作并倡导 :has() (以及许多其他事情)。 (2认同)

jer*_*oen 147

我认为你不能只选择css中的父级.

但是,由于您似乎已经有了一个.active类,将该类移动到li(而不是a)上会不会更容易?这样你就可以只访问lia通过css.

  • @Dominic Aquilina看看这个问题,OP正在使用一个类,而不是一个伪选择器. (11认同)
  • 您不能将伪选择器移动到列表项,因为它不是可聚焦元素.他正在使用:active选择器,因此当锚点处于活动状态时,他希望列表项受到影响.列表项永远不会处于活动状态.顺便说一句,不幸的是,这样的选择器不存在.如果没有它,使得纯CSS菜单完全可以通过键盘访问似乎是不可能的(使用兄弟选择器可以使用嵌套列表创建子菜单,但是一旦列表获得焦点,它就会再次隐藏).如果这个特定的conun有任何只有CSS的解决方案 (4认同)

Ide*_*red 121

您可以使用此脚本.

*! > input[type=text] { background: #000; }
Run Code Online (Sandbox Code Playgroud)

这将选择文本输入的任何父级.但是等等,还有更多.如果需要,可以选择指定的父级:

.input-wrap! > input[type=text] { background: #000; }
Run Code Online (Sandbox Code Playgroud)

或者在它处于活动状态时选择它:

.input-wrap! > input[type=text]:focus { background: #000; }
Run Code Online (Sandbox Code Playgroud)

看看这个HTML:

<div class="input-wrap">
    <input type="text" class="Name"/>
    <span class="help hide">Your name sir</span>
</div>
Run Code Online (Sandbox Code Playgroud)

您可以span.helpinput激活时选择它并显示它:

.input-wrap! .help > input[type=text]:focus { display: block; }
Run Code Online (Sandbox Code Playgroud)

还有更多功能; 只需查看插件的文档.

顺便说一句,它适用于IE.

  • 假设使用jquery`property()`会更快.然而,这需要测试 (5认同)
  • 根据我对已接受的答案的评论,看起来甚至在不久的将来也可能需要填充,因为主题指示器可能永远不会被CSS中的浏览器实现. (5认同)
  • @HerrSerker我想#a!是一个无效的选择器,它应该选择什么? (3认同)
  • @Idered当你有一个没有子选择器的选择器主题的CSS声明时失败它(`#a!`单独抛出一个错误,`#a!p`工作),所以其他的都不会因为`Uncaught TypeError :无法调用undefined`的方法'split':请参阅http://jsfiddle.net/HerrSerker/VkVPs/ (2认同)
  • @Idered我不知道.该规范并未说明它是非法的.#一个!应该选择自己.至少他们应该在JavaScript中没有错误 (2认同)
  • OP是否要求CSS解决方案? (2认同)

zcr*_*r70 101

正如其他几个人所提到的那样,没有办法只使用CSS来设置元素的父/的样式,但以下内容适用于jQuery:

$("a.active").parents('li').css("property", "value");
Run Code Online (Sandbox Code Playgroud)

  • ``选择器不存在(使用jQuery 1.7.1验证). (21认同)
  • 而不是使用`.css("property","value")`来设置所选元素的样式,你通常应该`.addClass("someClass")`并且在你的CSS中有.someClass {property:value}`( [通过](http://stackoverflow.com/a/6279001/578288)).这样,您可以使用CSS的全部功能和您正在使用的任何预处理器来标记样式. (7认同)
  • 也许那个`<`-syntax在2009年工作但我已经更新了(2013年). (6认同)
  • 更好的是,使用jQuery的内置[`:has()`selector](http://api.jquery.com/has-selector/):`$("li:has(a.active)").css ("财产","价值");`.它类似于CSS 4提出的`!`选择器.另见:[`:parent` selector](http://api.jquery.com/parent-selector/),[`.parents()`method](http://api.jquery.com/parents/) ,[`.parent()`method](http://api.jquery.com/parent/). (5认同)

Sal*_*n A 63

没有父选择器; 只是没有以前的兄弟选择器的方式.没有这些选择器的一个好理由是浏览器必须遍历元素的所有子元素以确定是否应该应用类.例如,如果您写道:

body:contains-selector(a.active) { background: red; }
Run Code Online (Sandbox Code Playgroud)

然后浏览器必须等到它已加载并解析所有内容,直到</body>确定页面是否应为红色.

本文为什么我们没有父选择器详细解释它.

  • 所以让浏览器更快.互联网本身更快.这个选择器肯定是必需的,遗憾的是,没有实现它的原因是因为我们生活在一个缓慢的,原始的世界中. (11认同)
  • 实际上,选择器会使浏览器看起来很慢. (10认同)
  • 我相信浏览器开发人员会提供(至少)与javascript版本一样快的实现,而javascript版本最终是人们最终使用的。 (3认同)
  • @Marc.2377 如果你在你的网站上用 JS 尝试上面的例子,我永远不会访问它。另一方面,我想说的是,大多数时候,你只关心直系子代,所以如果它只限于直系子代,那么这将是一个很好的补充,不会产生太大影响。 (2认同)

Yuk*_*élé 58

是: :has()

浏览器支持:

  • `CSS:has(':has') == false` (26认同)
  • `CSS:has(':has') === false` (20认同)
  • @TamusJRoyce ...SASS 编译生成的 CSS 是什么?最终它必须使用CSS。 (13认同)
  • 嗯,这很有用 (6认同)
  • @Yukulélé 抱歉开了个玩笑。Andrew 的评论有点像“has”这个词的双关语,就好像它是一个 CSS 运算符,表示 CSS 是否“具有”某个功能。在这种情况下,CSS 没有 `:has` 选择器,因此 `CSS::has(':has')` 为 false。我的评论提到这样一个事实,即 JavaScript 中的人们通常[建议使用 `===` 运算符而不是 `==`](/sf/ask/25164611/ -vs-should-be-used-in-javascript-比较)。 (4认同)
  • 安德鲁和@xdhmoore 你能解释一下吗? (3认同)
  • 正如 @Rodolfo Jorge Nemer Nogueira 指出的,可以通过使用 &amp; 符号来使用 sass (scss)。然后将其编译为所需的 css。如果下一个 css 版本支持就好了 &amp; (2认同)
  • 实际上,我认为[实验语法](https://developer.mozilla.org/en-US/docs/Web/CSS/@supports)相当于安德鲁的声明:`@supports选择器(:has(a)) ` (2认同)

Jos*_*osh 53

在css2中没有办法做到这一点.你可以把类添加到li并引用a

li.active > a {
    property: value;
}
Run Code Online (Sandbox Code Playgroud)

  • 通过制作元素显示:块,您可以将其设置为适合整个li区域.如果你能解释一下你正在寻找什么样的风格,或许我可以帮助解决问题. (3认同)

小智 34

尝试切换ablock显示,然后使用您想要的任何样式.a元素将填充li元素,您将能够根据需要修改它的外观.不要忘记将li填充设置为0.

li {
  padding: 0;
  overflow: hidden;
}
a {
  display: block;
  width: 100%;
  color: ..., background: ..., border-radius: ..., etc...
}
a.active {
  color: ..., background: ...
}
Run Code Online (Sandbox Code Playgroud)


小智 33

在 CSS 选择器 4 规范中,CSS 引入了一个名为 的新选择器:has(),它最终让我们可以选择父级。这意味着我们\xe2\x80\x99将能够定位其中具有特定子元素的CSS元素。Safari 和 Chrome 105 均已支持此功能。此处显示\n 完整的支持表显示了完整的支持表。

\n

父选择器的工作原理

\n

在 CSS 中,如果我们想要选择某些内容,我们可以使用沿 DOM 向下排列的选择器。

\n

例如,在 div 标签中选择 ap 标签如下所示:

\n
 div p {\n   color: red;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

到目前为止,\xe2\x80\x99t 无法真正选择其中包含标签的div标签,这意味着我们必须求助于. \xe2\x80\x99 没有在 CSS 中实现的主要原因是它\xe2\x80\x99 是一个相当昂贵的操作。CSS 的解析速度相对较快,但选择父标签需要相对大量的处理。pJavascript

\n

使用:has选择器,我们现在可以选择div具有p子元素的元素,或选择器的任何正常组合。

\n

例如,选择一个div有孩子的p现在看起来像这样:

\n
div:has(p) {\n  color: red;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这将使任何div有孩子的人p变红。

\n

将父级选择与其他选择器相结合

\n

就像任何其他 CSS 选择器一样,我们可以针对特定情况结合使用它。\n例如,如果您只想选择div具有直接span子级的标签:

\n
div:has(> span) {\n  color: red;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

正如词汇所:has暗示的,它不仅仅限于父母选择。

\n

例如,下面我们可以选择一个span兄弟::hasdiv

\n
span:has(+ div) {\ncolor: red;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

或者甚至,使用 :not() 选择器选择没有子元素的元素。

\n

例如,以下命令将选择任何没有 ap 子级的 div:

\n
div:not(:has(p)) {\n color: red;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

选择仅包含 CSS 文本的元素

\n

CSS 中一个非常常见的问题是:empty标签不会选择包含任何文本的元素 - 因此有时一个元素可以包含一个空格,并且:empty不适用。选择:has器使我们能够选择仅包含文本节点且不包含其他子元素的元素。

\n

虽然这对于带有空格的简单元素来说并不是完美的解决方案:empty(因为这将选择仅包含文本且没有其他 HTML DOM 元素的任何元素),但它确实使我们能够选择仅包含文本节点的 DOM 元素,这在以前是不可能的。我们可以通过以下代码来实现:

\n
div:not(:has(*)) {\n  background: green;\n}\n
Run Code Online (Sandbox Code Playgroud)\n


小智 32

CSS选择器" General Sibling Combinator "可以用于你想要的东西:

E ~ F {
    property: value;
}
Run Code Online (Sandbox Code Playgroud)

这匹配任何F元素前面的E元素.

  • 这只是兄弟选择器,它不是孩子,父母......不是真正回答问题的伴侣 (16认同)

Mar*_*urd 26

据我所知,不是在CSS 2中.CSS 3具有更强大的选择器,但并非在所有浏览器中始终如一地实现.即使使用改进的选择器,我也不相信它会完全符合您在示例中指定的内容.


Dav*_*rke 25

我知道OP正在寻找一个CSS解决方案,但使用jQuery实现起来很简单.在我的情况下,我需要找到孩子中包含<ul><span>标签的父标签<li>.jQuery具有:has选择器,因此可以通过它包含的子节点来标识父节点:

$("ul:has(#someId)")
Run Code Online (Sandbox Code Playgroud)

将选择ul具有id为someId的子元素的元素.或者回答原始问题,类似下面的内容应该可以做到(未经测试):

$("li:has(.active)")
Run Code Online (Sandbox Code Playgroud)

  • 或者使用`$ yourSpan.closest("ul")`并获得span元素的父UL.然而,你的答案完全是offtopic imho.我们可以使用jQuery解决方案回答所有CSS问题. (3认同)

小智 21

这是Selectors Level 4规范中讨论最多的方面.使用此选择器,可以通过在给定选择器(!)后面使用感叹号根据其子元素设置元素的样式.

例如:

body! a:hover{
   background: red;
}
Run Code Online (Sandbox Code Playgroud)

如果用户悬停在任何锚点上,将设置红色背景颜色.

但是我们必须等待浏览器的实现:(


riv*_*orm 20

您可以尝试使用超链接作为父级,然后在悬停时更改内部元素.像这样:

a.active h1 {color:red;}

a.active:hover h1 {color:green;}

a.active h2 {color:blue;}

a.active:hover h1 {color:yellow;}
Run Code Online (Sandbox Code Playgroud)

这样,您可以根据父元素的翻转更改多个内部标记中的样式.

  • Totaly对Ivaylo!"a"是非块元素,因此不能在其中使用块元素. (2认同)
  • 在 HTML5 中,将块元素放入链接内是完全可以的。 (2认同)
  • ...如果它在语义上是错误的,他们就不会在HTML5中允许它,而不是之前. (2认同)

sol*_*sol 20

:focus-within如果后代具有焦点,则伪元素允许选择父元素.

如果元素具有tabindex属性,则可以对其进行聚焦.

浏览器支持焦点内部

TABINDEX

.click {
  cursor: pointer;
}

.color:focus-within .change {
  color: red;
}

.color:focus-within p {
  outline: 0;
}
Run Code Online (Sandbox Code Playgroud)
<div class="color">
  <p class="change" tabindex="0">
    I will change color
  </p>
  <p class="click" tabindex="1">
    Click me
  </p>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 就我而言,这很好,谢谢!只是不是,如果将颜色更改为父级而不是同级,则示例将更具说明性,这是将.color:focus-within .change`替换为.color:focus-within。在我的情况下,我正在使用引导导航栏,该导航栏在活动时将其添加到子级,而我想向父.nav-bar添加一个类。我认为这是一个很常见的场景,我拥有标记,但是组件css + js是bootstrap(或其他),因此我无法更改行为。虽然我可以添加tabindex并使用此CSS。谢谢! (2认同)

小智 14

目前没有父选择器,甚至在W3C的任何谈话中都没有讨论.您需要了解浏览器如何评估CSS以实际了解我们是否需要它.

这里有很多技术解释.

Jonathan Snook解释了如何评估CSS.

Chris Coyier关于父选择器的谈话.

Harry Roberts再次编写高效的CSS选择器.

Nicole Sullivan对积极趋势有一些有趣的事实.

这些人都是前端开发领域的顶级人物.

  • "需要"是由Web开发人员的要求定义的,是否在规范中将其与其他因素决定. (11认同)

Ily*_* B. 14

有人提出这样的建议吗?只是水平菜单的想法......

HTML的一部分

<div class='list'>
  <div class='item'>
    <a>Link</a>
  </div>
  <div class='parent-background'></div>
  <!-- submenu takes this place -->
</div>
Run Code Online (Sandbox Code Playgroud)

CSS的一部分

/* Hide parent backgrounds... */
.parent-background {
  display: none; }

/* ... and show it when hover on children */
.item:hover + .parent-background {
  display: block;
  position: absolute;
  z-index: 10;
  top: 0;
  width: 100%; }
Run Code Online (Sandbox Code Playgroud)

更新了演示和其余代码

另一个如何将其与文本输入一起使用的示例 - 选择父字段集

  • 我一点也不清楚你是如何将它概括为某些/多个/大多数父选择器用例,或者甚至是CSS的哪些部分正在做什么.你能加一个彻底的解释吗? (3认同)
  • 我没有尝试将其应用于现实世界的场景,这就是我说"不用于制作"的原因.但我认为它只适用于固定项目宽度的2级菜单."这个CSS的哪些部分正在做什么" - .test-sibling这里实际上是父项的背景(CSS的最后一行). (2认同)
  • 添加了解释(jsfiddle的css部分,从"MAIN PART"开始)......我错了 - 可能有任意数量的子级别. (2认同)

小智 12

有一个扩展CSS的插件,包括一些非标准功能,可以在设计网站时提供帮助.它被称为EQCSS.

EQCSS添加的一个东西是父选择器.它适用于所有IE8及更高版本的浏览器.这是格式:

@element 'a.active' {
  $parent {
    background: red;
  }
}
Run Code Online (Sandbox Code Playgroud)

所以这里我们已经在每个元素上打开了一个元素查询a.active,对于查询中的样式,事情就像$parent是有意义的,因为它有一个参考点.浏览器可以找到父级,因为它与parentNodeJavaScript 非常相似.

这是一个演示$parent另一个$parent在IE8中运行的演示,以及一个屏幕截图,以防你没有IE8来测试.

EQCSS还包括元素的元选择器, $prev用于选定元素之前的元素,$this仅包括与元素查询匹配的元素等等.


Met*_*ani 12

CSS 父选择器(也称为:has() 选择器)终于登陆 Safari TP 137。该功能目前也在 Chrome 中实现。(MDN 文档

父级选择是通过伪类完成的:has()。例如,div:has(> .child)将选择<div>具有子child级的所有元素。

其他例子:

选择元素的直接父元素

<div>
  <p>Child Element</p>
</div>
Run Code Online (Sandbox Code Playgroud)
div:has(> p)
Run Code Online (Sandbox Code Playgroud)

选择元素的所有父元素

<div id="grandparent">
      <div id="parent">
            <div id="child"></div>
      <div>
</div>
Run Code Online (Sandbox Code Playgroud)

以下选择器将同时选择grandparentparent

div:has(.child)
Run Code Online (Sandbox Code Playgroud)

您还可以将它用于嵌套选择器,甚至与其他伪类一起使用:

div:has(> :nth-child(10))
Run Code Online (Sandbox Code Playgroud)

其他有效的 CSS 运算符可用于自定义查询。

请密切关注caniuse.com/css-has以了解浏览器兼容性。

  • @CodeForGood `document.querySelector('section:has(h1.heading1)').style.padding = 0` 但它可能无法在所有浏览器中工作 (2认同)

Pra*_*thi 11

从技术上讲,没有直接的方法可以做到这一点,你可以用jquery或javascript对它进行排序.

不过,你也可以这样做.

a.active h1 {color: blue;}
a.active p {color: green;}
Run Code Online (Sandbox Code Playgroud)

jQuery的

$("a.active").parents('li').css("property", "value");
Run Code Online (Sandbox Code Playgroud)

如果你想使用jQuery实现这一点,这里是jQuery父选择器的引用


rgb*_*rgb 9

W3C排除了这样一个选择器,因为它会对浏览器产生巨大的性能影响.

  • 假.因为DOM是一棵树,他们必须在到达孩子之前去父母,所以只需返回一个节点.OO (27认同)
  • CSS选择器是[队列](http://www.snook.ca/archives/html_and_css/css-parent-selectors)所以[选择器顺序](http://www.stevesouders.com/blog/2009/06/评估18/simplifiedifying-css-selectors /)而不是文档XPath或DOM层次结构. (9认同)
  • @rgb至少那是他们告诉我们的. (3认同)

Jan*_*lik 9

这是pointer-events与一起使用的技巧hover

<!doctype html>
<html>
	<head>
		<title></title>
		<style>
/* accessory */
.parent {
	width: 200px;
	height: 200px;
	background: gray;
}
.parent, 
.selector {
	display: flex;
	justify-content: center;
	align-items: center;
}
.selector {
	cursor: pointer;
	background: silver;
	width: 50%;
	height: 50%;
}
		</style>
		<style>
/* pertinent */
.parent {
	background: gray;
	pointer-events: none;
}
.parent:hover {
	background: fuchsia;
}
.parent 
.selector {
	pointer-events: auto;
}
		</style>
	</head>
	<body>
		<div class="parent">
			<div class="selector"></div>
		</div>
	</body>
</html>
Run Code Online (Sandbox Code Playgroud)


Ali*_*eza 8

简短的回答是NO ; 我们parent selector在CSS的现阶段还没有,但是如果您不必交换元素或类,第二种选择是使用JavaScript。像这样:

var activeATag = Array.prototype.slice.call(document.querySelectorAll('a.active'));

activeATag.map(function(x) {
  if(x.parentNode.tagName === 'LI') {
    x.parentNode.style.color = 'red'; // Your property: value;
  }
});
Run Code Online (Sandbox Code Playgroud)

如果您在应用程序中使用jQuery,则可以使用更短的方法:

$('a.active').parents('li').css('color', 'red'); // Your property: value;
Run Code Online (Sandbox Code Playgroud)


rob*_*t-s 7

现在是2019年,CSS嵌套模块最新草案实际上就是这样。介绍@nest规则。

3.2。嵌套规则:@nest

虽然直接嵌套看起来不错,但它有些脆弱。不允许使用某些有效的嵌套选择器,如.foo&,并且以某些方式编辑选择器会使规则意外无效。同样,有些人发现嵌套很难在视觉上与周围的声明区分开。

为了解决所有这些问题,此规范定义了@nest规则,该规则对如何有效嵌套样式规则施加了较少的限制。其语法为:

@nest = @nest <selector> { <declaration-list> }

@nest规则的功能与样式规则相同:它以选择器开头,并包含适用于选择器匹配的元素的声明。唯一的区别是@nest规则中使用的选择器必须包含嵌套,这意味着它在某个位置包含嵌套选择器。如果所有选择器的所有单个复杂选择器都包含嵌套,则选择器列表包含嵌套。

(从上面的URL复制并粘贴)。

此规范下的有效选择器示例:

.foo {
  color: red;
  @nest & > .bar {
    color: blue;
  }
}
/* Equivalent to:
   .foo { color: red; }
   .foo > .bar { color: blue; }
 */

.foo {
  color: red;
  @nest .parent & {
    color: blue;
  }
}
/* Equivalent to:
   .foo { color: red; }
   .parent .foo { color: blue; }
 */

.foo {
  color: red;
  @nest :not(&) {
    color: blue;
  }
}
/* Equivalent to:
   .foo { color: red; }
   :not(.foo) { color: blue; }
 */
Run Code Online (Sandbox Code Playgroud)


Rou*_*ica 5

尽管目前标准CSS中没有父选择器,但我正在一个名为ax(即CSS增强选择器语法/ ACSSSS)的(个人)项目中工作,该项目在其7个新选择器中包括:

  1. 一个直接父选择器<(这使得相对精选>
  2. 任何祖先选择器 ^(这使得相对精选[SPACE]

斧头目前处于相对较新的测试版开发阶段。

在此处查看演示:

http://rounin.co.uk/projects/axe/axe2.html

(比较左侧使用标准选择器样式的两个列表和右侧使用斧形选择器样式的两个列表)

  • 该项目目前处于测试阶段。您可以(至少目前)通过在您的末尾添加`&lt;script src =“ https://rouninmedia.github.io/axe/axe.js”&gt; &lt;/ script&gt;`来激活CSS样式的斧头选择器。 html文档,位于`&lt;/ body&gt;`之前。 (3认同)

Edu*_*scu 5

至少在 CSS 3 之前(包括 CSS 3),您不能这样选择。但是现在用 JavaScript 可以很容易地完成,你只需要添加一些普通的 JavaScript,注意代码很短。

cells = document.querySelectorAll('div');
[].forEach.call(cells, function (el) {
    //console.log(el.nodeName)
    if (el.hasChildNodes() && el.firstChild.nodeName=="A") {
        console.log(el)
    };
});
Run Code Online (Sandbox Code Playgroud)
<div>Peter</div>
<div><a href="#">Jackson link</a></div>
<div>Philip</div>
<div><a href="#">Pullman link</a></div>
Run Code Online (Sandbox Code Playgroud)


S0A*_*dS0 5

有任何想法吗?

如果 CSS4为倒退添加了一些钩子,它会很漂亮。在那之前,有可能(虽然建议)使用和/或s打破事物连接的通常方式,并且通过它也允许 CSS 在其正常范围之外运行......checkboxradio input

/* Hide things that may be latter shown */
.menu__checkbox__selection,
.menu__checkbox__style,
.menu__hidden {
  display: none;
  visibility: hidden;
  opacity: 0;
  filter: alpha(opacity=0); /* Old Microsoft opacity */
}


/* Base style for content and style menu */
.main__content {
  background-color: lightgray;
  color: black;
}

.menu__hidden {
  background-color: black;
  color: lightgray;
  /* Make list look not so _listy_ */
  list-style: none;
  padding-left: 5px;
}

.menu__option {
  box-sizing: content-box;
  display: block;
  position: static;
  z-index: auto;
}

/* &#9660; - \u2630 - Three Bars */
/*
.menu__trigger__selection::before {
  content: '\2630';
  display: inline-block;
}
*/

/* &#9660; - Down Arrow */
.menu__trigger__selection::after {
  content: "\25BC";
  display: inline-block;
  transform: rotate(90deg);
}


/* Customize to look more `select` like if you like */
.menu__trigger__style:hover,
.menu__trigger__style:active {
  cursor: pointer;
  background-color: darkgray;
  color: white;
}


/**
 * Things to do when checkboxes/radios are checked
 */

.menu__checkbox__selection:checked + .menu__trigger__selection::after,
.menu__checkbox__selection[checked] + .menu__trigger__selection::after {
  transform: rotate(0deg);
}

/* This bit is something that you may see elsewhere */
.menu__checkbox__selection:checked ~ .menu__hidden,
.menu__checkbox__selection[checked] ~ .menu__hidden {
  display: block;
  visibility: visible;
  opacity: 1;
  filter: alpha(opacity=100); /* Microsoft!? */
}


/**
 * Hacky CSS only changes based off non-inline checkboxes
 * ... AKA the stuff you cannot unsee after this...
 */
.menu__checkbox__style[id="style-default"]:checked ~ .main__content {
  background-color: lightgray;
  color: black;
}

.menu__checkbox__style[id="style-default"]:checked ~ .main__content .menu__trigger__style[for="style-default"] {
  color: darkorange;
}

.menu__checkbox__style[id="style-one"]:checked ~ .main__content {
  background-color: black;
  color: lightgray;
}

.menu__checkbox__style[id="style-one"]:checked ~ .main__content .menu__trigger__style[for="style-one"] {
  color: darkorange;
}

.menu__checkbox__style[id="style-two"]:checked ~ .main__content {
  background-color: darkgreen;
  color: red;
}

.menu__checkbox__style[id="style-two"]:checked ~ .main__content .menu__trigger__style[for="style-two"] {
  color: darkorange;
}
Run Code Online (Sandbox Code Playgroud)
<!--
  This bit works, but will one day cause troubles,
  but truth is you can stick checkbox/radio inputs
  just about anywhere and then call them by id with
  a `for` label. Keep scrolling to see what I mean
-->
<input type="radio"
       name="colorize"
       class="menu__checkbox__style"
       id="style-default">
<input type="radio"
       name="colorize"
       class="menu__checkbox__style"
       id="style-one">
<input type="radio"
       name="colorize"
       class="menu__checkbox__style"
       id="style-two">


<div class="main__content">

  <p class="paragraph__split">
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
    quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
  </p>

  <input type="checkbox"
         class="menu__checkbox__selection"
         id="trigger-style-menu">
  <label for="trigger-style-menu"
         class="menu__trigger__selection"> Theme</label>

  <ul class="menu__hidden">
    <li class="menu__option">
      <label for="style-default"
             class="menu__trigger__style">Default Style</label>
    </li>

    <li class="menu__option">
      <label for="style-one"
             class="menu__trigger__style">First Alternative Style</label>
    </li>

    <li class="menu__option">
      <label for="style-two"
             class="menu__trigger__style">Second Alternative Style</label>
    </li>
  </ul>

  <p class="paragraph__split">
    consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
    cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
    proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </p>

</div>
Run Code Online (Sandbox Code Playgroud)

... 非常粗糙,但仅使用 CSS 和 HTML,就可以通过链接/ s触发器的和属性,从几乎任何地方触摸和重新触摸除bodyand 之外的:root任何内容;可能有人会在某个时候展示如何重新触摸它们。idforradiocheckbox inputlabel

另外一个需要注意的是,只有一个 input特定的id可能使用,第一checkbox/radio 换句话说,一个切换状态......多个标签都可以指向相同的input,尽管这将使HTML和CSS的外观甚至阴暗面。


...我希望有某种解决方法存在于 CSS Level 2 中...

我不确定其他伪类,但我:checked是 CSS 3 之前的。如果我没记错的话,[checked]这就是为什么你可能会在上面的代码中找到它的原因,例如,

.menu__checkbox__selection:checked ~ .menu__hidden,
.menu__checkbox__selection[checked] ~ .menu__hidden {
 /* rules: and-stuff; */
}
Run Code Online (Sandbox Code Playgroud)

...但是对于像::afterand 之类的东西:hover,我完全不确定它们最初出现在哪个 CSS 版本中。

综上所述,请不要在生产中使用它,甚至不要在生气时使用它。作为一个笑话,或者换句话说,仅仅因为可以做某事并不总是意味着它应该做