是否有CSS父选择器?


3175

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

例如,我的CSS将是这样的:

li < a.active {
    property: value;
}

显然,可以使用JavaScript进行此操作,但是我希望CSS Level 2本身具有某种解决方法。

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

有任何想法吗?

Answers:


2529

当前无法在CSS中选择元素的父级。

如果有办法,可以在当前的CSS选择器规范中使用:

也就是说,选择器第4级工作草案包含一个:has()伪类,它将提供此功能。它将类似于jQuery实现

li:has(> a.active) { /* styles to apply to the li tag */ }

但是,截至2020年5月,任何浏览器仍不支持此功能

同时,如果需要选择父元素,则必须使用JavaScript。


68
这似乎是它已经被提出,并拒绝:stackoverflow.com/questions/45004/...
ROBM

14
看起来主题选择器已被重新访问,只是使用了!now:The subject of the selector can be explicitly identified by appending an exclamation mark (!) to one of the compound selectors in a selector.
animuson

13
前置的$对我来说看起来更好...附加的!可以更容易被忽略。
Christoph

51
大情节扭!Selectors 4 WD 今天刚刚更新,将主题指示器从快速配置文件中排除,该配置文件将由CSS实现使用。如果此更改仍然存在,则意味着您将无法再使用样式表中的主题指示符(除非您使用添加某种polyfill(如另一个答案中所述),否则您只能在Selectors API以及任何地方使用它否则可能会实施完整的配置文件。
BoltClock

55
另一个重大更新:看来他们正在考虑完全放弃使用主题选择器语法,并用:has()jQuery伪造的伪代码取代了所有人,这一点已广为人知。最新的ED删除了对主题指示符的所有引用,并将其替换为:has()伪标识。我不知道确切的原因,但是CSSWG早前进行了一项民意调查,其结果肯定影响了这一决定。它最有可能与jQuery兼容(因此它无需修改即可利用qSA),并且因为主题指示符语法过于混乱。
BoltClock

152

我认为您只能在CSS中选择父级。

但是,因为您似乎已经有了一个.active类,所以将该类移到li(而不是a)会更容易。这样,您就只能通过CSS 访问li和和a


4
您不能将伪选择器移动到列表项,因为它不是可聚焦元素。他正在使用:active选择器,因此当锚点处于活动状态时,他希望列表项受到影响。列表项永远不会处于活动状态。顺便说一句,不幸的是这种选择器不存在。没有纯CSS菜单,完全可以通过键盘访问似乎是不可能的(使用同级选择器可以显示使用嵌套列表创建的子菜单,但是一旦列表获得焦点,它就会再次隐藏)。如果有针对此特定社区的仅CSS解决方案

12
@Dominic Aquilina看一个问题,OP使用的是类,而不是伪选择器。
jeroen

125

您可以使用以下脚本

*! > input[type=text] { background: #000; }

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

.input-wrap! > input[type=text] { background: #000; }

或在活动时选择它:

.input-wrap! > input[type=text]:focus { background: #000; }

查看以下HTML:

<div class="input-wrap">
    <input type="text" class="Name"/>
    <span class="help hide">Your name sir</span>
</div>

您可以span.help在处于input活动状态时选择它并显示它:

.input-wrap! .help > input[type=text]:focus { display: block; }

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

顺便说一句,它可以在Internet Explorer中使用。


5
假设使用jquery patent()会更快。但是,这需要测试

2
@Idered当您具有没有子选择器的选择器主题的CSS声明时,它会失败(#a!仅引发错误,#a! p可以工作),因此其他原因也将不起作用,原因是Uncaught TypeError: Cannot call method 'split' of undefined:请参见jsfiddle.net/HerrSerker/VkVPs
yunzen

3
@HerrSerker我认为#a!是无效的选择器,应该选择什么?
Idered

2
@Idered我不知道。规范没有说这是非法的。#一个!应该选择自己。至少他们在JavaScript中应该没有错误
yunzen 2013年

5
根据我对已接受答案的评论,似乎毕竟甚至在不久的将来都可能需要使用polyfill,因为主题指示符可能永远不会由CSS浏览器实现。
BoltClock

108

正如其他一些人提到的那样,没有一种仅使用CSS样式化元素父元素的方法,但是以下方法可用于jQuery

$("a.active").parents('li').css("property", "value");

21
<选择不存在(使用jQuery 1.7.1验证)。
罗伯W

6
也许<-syntax在2009年有效,但我已经对其进行了更新(针对2013年)。
Alastair

5
更好的是,使用jQuery的内置:has()选择器$("li:has(a.active)").css("property", "value");。它的读取方式与CSS 4建议的!选择器类似。另请参见::parent选择器.parents()方法.parent()方法
罗里·奥肯

7
而且.css("property", "value")通常不要使用样式来设置选定的元素,而应该使用.addClass("someClass")CSS .someClass { property: value }通过)。这样,您就可以利用CSS和正在使用的所有预处理器的全部功能来注释样式。
罗里·奥肯


69

没有父选择器。就像以前没有同级选择器一样。没有这些选择器的一个很好的理由是,浏览器必须遍历元素的所有子元素,以确定是否应应用类。例如,如果您写了:

body:contains-selector(a.active) { background: red; }

然后,浏览器将不得不等待,直到它加载并解析了所有内容为止,直到</body>确定该页面是否应为红色为止。

为什么我们没有父选择器的文章对此做了详细说明。


11
因此,请加快浏览器的速度。互联网本身更快。这个选择器绝对是必需的,而不幸的是,由于我们生活在一个缓慢而原始的世界中,所以没有实现它。
vsync

11
实际上,选择器会使浏览器的速度变慢。
Salman 2014年

5
我相信浏览器开发人员会提供(至少)与javascript版本一样快的实现,而javascript版本最终是人们最终使用的。
Marc.2377 '18

“我们生活在一个缓慢而原始的世界中” 咳嗽咳嗽新的苹果手表咳嗽咳嗽
Marvin

@ Marc.2377如果您在网站上的JS中尝试上述示例,我将永远不会访问它。另一方面,我想说的是,在大多数情况下,您只关心直系子女,因此,如果只限于直系子女,这将是一个不错的选择,而且不会产生太大影响。
xryl669

54

CSS 2无法执行此操作。您可以将类添加到li并引用a

li.active > a {
    property: value;
}

3
通过使a元素显示:块,您可以设置其样式以适合整个li区域。如果您可以解释您要寻找的样式,也许我可以提供解决方案。
乔什(Josh)

这实际上是一个简单而优雅的解决方案,并且在许多情况下,将类设置为父类是有意义的。
里卡多

35

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

li {
  padding: 0;
  overflow: hidden;
}
a {
  display: block;
  width: 100%;
  color: ..., background: ..., border-radius: ..., etc...
}
a.active {
  color: ..., background: ...
}


26

据我所知,CSS 2中还没有。CSS 3具有更强大的选择器,但并非在所有浏览器中都一致实现。即使使用了改进的选择器,我也不相信它会完全完成您在示例中指定的功能。


24

我知道OP正在寻找CSS解决方案,但使用jQuery即可轻松实现。就我而言,我需要为子级中包含<ul><span>标签找到父级标签<li>。jQuery具有:has选择器,因此可以通过其包含的子代来标识父代:

$("ul:has(#someId)")

将选择ul具有id为someId的子元素的元素。或回答原始问题,以下方法应可解决(未测试):

$("li:has(.active)")

3
或使用$yourSpan.closest("ul"),您将获得span元素的父UL。但是,您的答案完全是题外之词。我们可以使用jQuery解决方案来回答所有带有CSS标签的问题。
罗宾·范·巴伦

1
正如在其他答案中指出的那样,无法使用CSS 2来执行此操作。鉴于这种限制,我提供的答案是我所知道的一个有效的答案,并且是使用javascript imho回答问题的最简单方法。
大卫·克拉克

在您的支持下,有些人同意您的看法。但是唯一的答案仍然是被接受的答案。简单明了的“无法按照您想要的方式完成”。如果问题是如何骑自行车时速60英里/小时,而您却回答“简单;坐上汽车,然后踩油门。”,那仍然不是答案。因此,我的评论。
罗宾·范·巴伦

1
这种方法将使SO几乎完全无用。我在SO中寻找如何解决问题的方法,但没有找到“唯一答案”不能解决问题的方法。这就是为什么SO如此出色的原因,因为总是有不止一种方式给猫剥皮。
大卫·克拉克

23

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

如果元素具有tabindex属性,则可以将其聚焦。

浏览器对焦点内的支持

标签索引

.click {
  cursor: pointer;
}

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

.color:focus-within p {
  outline: 0;
}
<div class="color">
  <p class="change" tabindex="0">
    I will change color
  </p>
  <p class="click" tabindex="1">
    Click me
  </p>
</div>


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

22

这是选择器4级规范中讨论最多的方面。这样,选择器将能够通过在给定选择器(!)之后使用感叹号来根据元素的子元素设置样式。

例如:

body! a:hover{
   background: red;
}

如果用户将鼠标悬停在任何锚点上,它将设置红色背景色。

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


21

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

a.active h1 {color:red;}

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

a.active h2 {color:blue;}

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

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


1
没错,但是a如果您要符合XHTML标准,则将标记内的标记代码仅限于某些元素。例如,您不能使用一个div内部a,而不会收到违反该模式的警告。
Ivaylo Slavov

2
完全正确的Ivaylo!“ a”是一个非块元素,因此不能在其中使用块元素。
riverstorm

1
在HTML5中,将块元素放在链接内是完全可以的。
马修·詹姆斯·泰勒

2
...如果从语义上讲是错误的,那么他们将不会在HTML5中允许它,而以前是不允许的。
BoltClock

14

当前没有父选择器,并且W3C的任何讨论中都没有讨论它。您需要了解浏览器如何评估CSS,以实际了解我们是否需要它。

这里有很多技术说明。

Jonathan Snook解释了如何评估CSS

克里斯·科耶尔(Chris Coyier)在家长选择者的会谈中

哈里·罗伯茨(Harry Roberts)再次着手编写高效的CSS选择器

但是妮可·沙利文(Nicole Sullivan)在积极趋势方面有一些有趣的事实

这些人都是前端开发领域中的顶级人才。


12
need由Web开发人员的需求定义,是有它的规范是由其他因素决定。
nicodemus13 2014年

14

只是水平菜单的一个主意...

HTML的一部分

<div class='list'>
  <div class='item'>
    <a>Link</a>
  </div>
  <div class='parent-background'></div>
  <!-- submenu takes this place -->
</div>

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

更新了演示和其余代码

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


3
对于我来说,将其推广到某些/很多/大多数父选择器用例,甚至确切地说是CSS的哪些部分正在做什么,对我来说还不是很清楚。您能否添加详尽的说明?
内森·塔吉

2
我没有尝试将其应用于现实情况,这就是为什么我说“不用于生产”。但是我认为它只能应用于具有固定项目宽度的2级菜单。“此CSS的哪些部分在做什么”-.test-sibling实际上是父项的背景(CSS的最后一行)。
Ilya B.

2
添加了解释(jsfiddle的css部分,从“ MAIN PART”开始)...而且我弄错了-可能有许多子级别。
Ilya B.

13

这是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>


12

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

EQCSS添加的一件事是父选择器。它适用于所有浏览器,Internet Explorer 8及更高版本。格式如下:

@element 'a.active' {
  $parent {
    background: red;
  }
}

因此,这里我们在每个元素上都打开了一个元素查询a.active,对于该查询中的样式,这$parent很有意义,因为有一个参考点。浏览器可以找到父对象,因为它与parentNode JavaScript。

这是一个$parentInternet Explorer 8 的演示另一个$parent演示,还提供了一个截图,以防您没有Internet Explorer 8可以进行测试

EQCSS还包括元选择器$prev用于选定元素之前的元素,$this以及仅与元素查询匹配的那些元素,以及更多其他元素。


11

现在是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; }
 */

10

从技术上讲,没有直接的方法可以做到这一点。但是,您可以使用jQuery或JavaScript进行分类。

但是,您也可以执行类似的操作。

a.active h1 {color: blue;}
a.active p {color: green;}

jQuery的

$("a.active").parents('li').css("property", "value");

如果要使用jQuery实现此目的,则这里是jQuery父选择器的参考。


9

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


27
假。因为DOM是一棵树,所以在到达子节点之前,它们必须先到达父节点,因此只需返回一个节点即可。oo
NullVoxPopuli

9
CSS选择器是一个队列,因此评估选择器顺序而不是文档XPath或DOM层次结构。
保罗·史威特

3
@rgb至少那是他们告诉我们的。
yunzen 2013年

9

简短的回答是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;
  }
});

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

$('a.active').parents('li').css('color', 'red'); // Your property: value;

5

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

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

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

在此处查看演示:

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

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


3
该项目目前处于测试阶段。您可以(至少当前)通过<script src="https://rouninmedia.github.io/axe/axe.js"></script>在html文档的末尾(在之前)添加CSS样式的ax选择器</body>
鲁宁

4

至少您不能选择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)
    };
});
<div>Peter</div>
<div><a href="#">Jackson link</a></div>
<div>Philip</div>
<div><a href="#">Pullman link</a></div>


4

有任何想法吗?

CSS 4将被看中,如果它增加了一些挂钩倒着走。在那之前它是可能的(虽然建议)使用checkbox和/或radio inputS ^打破,事情是连接通常的方式,并通过也让CSS到正常范围之外的业务遍及全球...

/* 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;
}
<!--
  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>

...相当粗略,但是只要使用CSS和HTML,就可以通过链接/ s触发器的and 属性,在几乎任何地方触摸和重新触摸除the body和之外的任何东西;可能有人会在某个时候展示如何重新修饰它们。:rootidforradiocheckbox 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; */
}

...但是对于诸如::after和这类东西:hover,我完全不确定那些最初出现在哪个CSS版本中。

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


3

不,您不能仅在CSS中选择父项。

但是,因为您似乎已经有了一个.active类,所以将该类移到li(而不是a)会更容易。这样,您就只能通过CSS 访问li和和a


1

当前只有<input>在父元素中有一个元素时,才可以基于子元素更改父元素。当输入获得焦点时,其相应的父元素会受到CSS的影响。

以下示例将帮助您了解:focus-within在CSS中的使用。

.outer-div {
  width: 400px;
  height: 400px;
  padding: 50px;
  float: left
}

.outer-div:focus-within {
  background: red;
}

.inner-div {
  width: 200px;
  height: 200px;
  float: left;
  background: yellow;
  padding: 50px;
}
<div class="outer-div">
  <div class="inner-div">
    I want to change outer-div(Background color) class based on inner-div. Is it possible?
    <input type="text" placeholder="Name" />
  </div>
</div>


1

Sass中的&符是可能的:

h3
  font-size: 20px
  margin-bottom: 10px
  .some-parent-selector &
    font-size: 24px
    margin-bottom: 20px

CSS输出:

h3 {
  font-size: 20px;
  margin-bottom: 10px;
}
.some-parent-selector h3 {
  font-size: 24px;
  margin-bottom: 20px;
}

2
没错,但前提是您事先知道选择器。
Shahar

11
这并没有选择h3的母公司,这是目标。这将选择h3的后代.some-parent-selector
雅各布·福特

1

我会雇用一些JavaScript代码来做到这一点。例如,在React中,当您遍历数组时,将另一个类添加到父组件,这表明它包含您的孩子:

<div className={`parent ${hasKiddos ? 'has-kiddos' : ''}`}>
    {kiddos.map(kid => <div key={kid.id} />)}
</div>

然后简单地:

.parent {
    color: #000;
}

.parent.has-kiddos {
    color: red;
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.