ChatGPT解决这个技术问题 Extra ChatGPT

有 CSS 父选择器吗?

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

例如,我的 CSS 是这样的:

li < a.active {
    property: value;
}

显然有一些使用 JavaScript 的方法,但我希望有某种解决方法存在于 CSS Level 2 中。

我试图设置样式的菜单被 CMS 吐出,所以我无法将活动元素移动到 <li> 元素...(除非我为菜单创建模块设置主题,我不想这样做) .

Safari Tech Preview 137 今天介绍了 :has() 选择器的第一个实现。
即将推出:chrome!

T
TylerH

目前没有办法在 CSS 中选择元素的父级,至少不是一种适用于所有浏览器的方式。

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

选择器 3 级规范

CSS 2.1 选择器规范

也就是说,Selectors Level 4 Working Draft 包含将提供此功能的 :has() 伪类。它将类似于 jQuery implementation

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

但是,从 2022 年开始,it is only supported by Safari

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


T
TylerH

是::has()

浏览器支持:Safari by default; Chrome (behind a flag)


正如@Rodolfo Jorge Nemer Nogueira 指出的那样,使用 & 符号可以使用 sass (scss)。然后将其编译为所需的 css。如果支持下一个 css 版本就好了 &
实际上,我认为有 experimental syntax 相当于 Andrew 的声明:@supports selector(:has(a))
@TamusJRoyce ... SASS 也编译生成的 CSS 是什么?它必须在一天结束时使用 CSS。
@Yukulélé 编辑应该改进帖子。将“仅限 Safari”更改为“低”会要求用户单击链接以查看“低”的含义,从而使答案变得不那么清晰。声明“仅限 Safari”可以准确地告诉读者他们需要知道的内容,而无需单击链接并离开网站以找出答案的含义。
P
Peter Mortensen

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

但由于您似乎已经有一个 .active 类,因此将该类移到 li(而不是 a)会更容易。这样,您只能通过 CSS 访问 lia


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

您可以使用 this script

*! > 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>

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

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

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

顺便说一句,它适用于 Internet Explorer。


假设使用 jquery patent() 会更快。然而,这需要测试
@Idered 当您有一个没有子选择器的选择器主题的 CSS 声明时它会失败(单独的 #a! 会引发错误,#a! p 有效),因此其他人也不会因为 Uncaught TypeError: Cannot call method 'split' of undefined 而工作:请参阅 jsfiddle.net/HerrSerker/VkVPs
@HerrSerker 我认为#a!是一个无效的选择器,它应该选择什么?
@Idered 我不知道。规范并没有说这是非法的。 #一个!应该选择自己。至少它们在 JavaScript 中应该没有错误
根据我对已接受答案的评论,看起来即使在不久的将来也可能需要 polyfill,因为主题指示器可能永远不会由浏览器在 CSS 中实现。
A
Alastair

正如其他几个人所提到的,没有办法仅使用 CSS 来设置元素的父级样式,但以下方法适用于 jQuery

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

< 选择器不存在(使用 jQuery 1.7.1 验证)。
也许 <-syntax 在 2009 年有效,但我已经更新了它(2013 年)。
更好的是,使用 jQuery 的内置 :has() selector$("li:has(a.active)").css("property", "value");。它读起来类似于 CSS 4 提出的 ! 选择器。另请参阅::parent selector.parents() method.parent() method
而不是使用 .css("property", "value") 来设置所选元素的样式,您通常应该使用 .addClass("someClass") 并在您的 CSS 中添加 .someClass { property: value } (via)。这样,您可以使用 CSS 和您正在使用的任何预处理器的全部功能来标记样式。
P
Peter Mortensen

没有父选择器;就像没有以前的兄弟选择器一样。没有这些选择器的一个很好的原因是浏览器必须遍历一个元素的所有子元素来确定是否应该应用一个类。例如,如果你写:

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

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

文章Why we don't have a parent selector 详细解释了它。


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

在 CSS 2 中没有办法做到这一点。您可以将该类添加到 li 并引用 a

li.active > a {
    property: value;
}

通过使 a 元素 display:block 您可以设置其样式以适应整个 li 区域。如果你能解释你正在寻找什么风格,也许我可以帮助你解决问题。
s
sol

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

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

Browser support for focus-within

Tabindex

例子

.parent:focus-within { 背景:hsl(199deg, 65%, 73%); } /* 演示样式 */ body { margin: 0; } .parent { 背景:hsl(0, 0%, 80%);最小高度:100vh;显示:网格;地点内容:中心; } .child { 背景:hsl(0, 0%, 0%);白颜色;填充:3rem;大纲:0;光标:指针;字体:18px/1.25 无衬线;宽度:20ch; }

点击或关注我,我的父母会改变。


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

尝试将 a 切换到 block 显示,然后使用您想要的任何样式。 a 元素将填充 li 元素,您可以根据需要修改其外观。不要忘记将 li 填充设置为 0。

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

C
Cody Gray

CSS 选择器“General Sibling Combinator”可以用于您想要的:

E ~ F {
    property: value;
}

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


.component-one:visible ~ body{ background-color: red; } 不起作用。
@F-Natic 不起作用我并不感到惊讶。它不是有效的 CSS(CSS 中没有 :visible 伪类)。 body 也是 html 的直接且唯一后代。
M
Mark Hurd

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


D
David Clarke

我知道 OP 正在寻找 CSS 解决方案,但使用 jQuery 很容易实现。在我的例子中,我需要为子 <li> 中包含的 <span> 标签找到 <ul> 父标签。 jQuery 具有 :has 选择器,因此可以通过它包含的子项来识别父项:

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

将选择具有 ID 为 someId 的子元素的 ul 元素。或者要回答原始问题,类似以下内容应该可以解决问题(未经测试):

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

或者使用 $yourSpan.closest("ul"),您将获得 span 元素的父 UL。不过,您的回答完全是题外话。我们可以使用 jQuery 解决方案来回答所有带有 CSS 标记的问题。
P
Peter Mortensen

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

例如:

body! a:hover{
   background: red;
}

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

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


("!") 功能已替换为 ':has()' drafts.csswg.org/selectors/#changes-2013
T
TylerH

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

a.active h1 {color:red;}

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

a.active h2 {color:blue;}

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

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


这是正确的,但如果您想符合 XHTML 标准,则将 a 标记内的标记代码限制为仅限某些元素。例如,您不能在 a 中使用 div,而不会收到违反架构的警告。
完全正确的伊瓦伊洛! “a”是一个非块元素,所以不能在其中使用块元素。
在 HTML5 中,将块元素放在链接中是非常好的。
...如果它在语义上是错误的,他们就不会在以前不允许的 HTML5 中允许它。
@BoltClock 诚然从遥远的未来回复,但我怀疑 Matthew 关于 HTML5 的评论更多是将“HTML”与“XHTML”进行对比(根据 Ivaylo/riverstorm 的说法,这是不允许的),而不是将 HTML 5 与之前的版本进行对比的 HTML。
J
Jan Kyu Peblik

下面是使用 pointer-eventshover 的 hack:


N
Nathan Tuggy

目前没有父选择器,甚至在 W3C 的任何讨论中都没有讨论它。您需要了解浏览器如何评估 CSS 才能真正了解我们是否需要它。

这里有很多技术解释。

Jonathan Snook explains how CSS is evaluated

Chris Coyier on the talks of Parent selector

Harry Roberts again on writing efficient CSS selectors

但是Nicole Sullivan has some interesting facts on positive trends

这些人都是前端开发领域的顶尖人物。


need 是由 Web 开发人员的要求定义的,是否在规范中包含它是由其他因素决定的。
C
Community

只是水平菜单的一个想法......

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

Updated demo and the rest of code

Another example 如何将其与文本输入一起使用 - 选择父字段集


我完全不清楚你的意思是如何将其推广到一些/许多/大多数父选择器用例,甚至这个 CSS 的哪些部分正在做什么。你能补充一个彻底的解释吗?
我没有尝试将其应用于现实世界的场景,这就是为什么我说“不适用于生产”。但我认为它只能应用于具有固定项目宽度的 2 级菜单。 “这个 CSS 的哪些部分在做什么” - 这里的 .test-sibling 实际上是父项的背景(CSS 的最后一行)。
添加了解释(jsfiddle的css部分,从“MAIN PART”开始)......我弄错了 - 可能有任意数量的子级别。
P
Peter Mortensen

有一个插件可以扩展 CSS 以包含一些在设计网站时真正有用的非标准功能。它称为 EQCSS

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

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

所以这里我们对每个元素 a.active 打开了一个元素查询,对于该查询中的样式,像 $parent 这样的东西是有意义的,因为有一个参考点。浏览器可以找到父节点,因为它与 JavaScript 中的 parentNode 非常相似。

Here's a demo of $parentanother $parent demo that works in Internet Explorer 8,以及 a screenshot in case you don't have Internet Explorer 8 around to test with

EQCSS 还包括 meta-selectors$prev 用于选定元素之前的元素,而 $this 仅用于与元素查询匹配的元素,等等。


C
Community

现在是 2019 年,latest draft of the CSS Nesting Module 实际上有这样的东西。引入 @nest 规则。

3.2.嵌套规则:@nest 虽然直接嵌套看起来不错,但它有点脆弱。一些有效的嵌套选择器,如 .foo &,是不允许的,并且以某些方式编辑选择器可能会使规则意外无效。同样,有些人发现嵌套很难从视觉上与周围的声明区分开来。为了帮助解决所有这些问题,本规范定义了@nest 规则,它对如何有效嵌套样式规则施加的限制较少。它的语法是: @nest = @nest { } @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; }
 */

r
rgb

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


错误的。因为 DOM 是一棵树,它们必须在到达子节点之前先到达父节点,所以只需返回一个节点即可。哦
CSS 选择器是一个 queue,因此评估的是 selector order,而不是文档 XPath 或 DOM 层次结构。
@rgb 至少他们是这么告诉我们的。
P
Peter Mortensen

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

但是,您也可以这样做。

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

jQuery

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

如果您想使用 jQuery 来实现这一点,这里是 jQuery parent selector 的参考。


P
Peter Mortensen

简短的回答是NO;在 CSS 的这个阶段,我们没有 parent selector,但如果您无论如何都不必交换元素或类,则第二种选择是使用 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;

parentElement,sameshing - 只是 document.getElementById().parentElement 等。
R
Rounin - Standing with Ukraine

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

直接父选择器 <(允许对 > 进行相反选择)任何祖先选择器 ^(允许对 [SPACE] 进行相反选择)

ax 目前处于相对早期的 BETA 开发阶段。

在此处查看演示:

.parent {浮动:左;宽度:180px;高度:180px;右边距:12px;背景颜色:RGB(191、191、191); } .child { 宽度:90px;高度:90px;边距:45px;上边距:12px;字体系列:无衬线;文本对齐:居中;字体大小:12px;背景色:rgb(255, 255, 0); } .child.using-axe < .parent { 背景颜色:rgb(255, 0, 0); }

这里是斧头父选择器将外部正方形变为红色。

在上面的例子中,<直接父选择器,所以

.child.using-axe < .parent

方法:

.child.using-axe 的任何直接父级,即 .parent

您也可以使用:

.child.using-axe < div

这意味着:

.child.using-axe 的任何直接父级,它是一个 div


该项目目前处于早期 Beta 阶段。您可以(至少目前)在您的 CSS 样式中激活 ax 选择器,方法是在您的 html 文档的最后,就在 </body> 之前添加 <script src="https://rouninmedia.github.io/axe/axe.js"></script>
T
TylerH

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

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

其他示例:

选择元素的直接父级

<div>
  <p>Child Element</p>
</div>
div:has(> p)

选择一个元素的所有父元素

<div id="grandparent">
      <div id="parent">
            <div id="child"></div>
      <div>
</div>

以下选择器将同时选择 grandparentparent

div:has(.child)

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

div:has(> :nth-child(10))

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

请留意 caniuse.com/css-has 的浏览器兼容性。


P
Peter Mortensen

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

细胞 = document.querySelectorAll('div'); [].forEach.call(cells, function (el) { //console.log(el.nodeName) if (el.hasChildNodes() && el.firstChild.nodeName=="A") { console.log(el) }; });

彼得
菲利普


V
VFDan

当前仅当我们在父元素中有 <input> 元素时才能根据子元素更改父元素。当输入获得焦点时,其对应的父元素可以使用 CSS 受到影响。

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

.outer-div { 宽度:400px;高度:400px;填充:50px;浮动:左 } .outer-div:focus-within { 背景:红色; } .inner-div { 宽度:200px;高度:200px;向左飘浮;背景:黄色;填充:50px; }

我想根据inner-div改变outer-div(Background color)类。可能吗?


The :focus-within CSS pseudo-class matches an element if the element or any of its descendants are focused.works适用于每个元素,而不仅仅是input
P
Peter Mortensen

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

但由于您似乎已经有一个 .active 类,因此将该类移到 li(而不是 a)会更容易。这样,您只能通过 CSS 访问 lia


S
S0AndS0

有任何想法吗?

如果 CSS4 在 向后走 中添加了一些 钩子,那它会很漂亮。在此之前,可以(尽管建议)使用 checkbox 和/或 radio inputs打破常规事物连接的方式,并且通过这种方式还允许CSS在其正常范围之外运行......

/* 隐藏可能稍后显示的内容 */ .menu__checkbox__selection, .menu__checkbox__style, .menu__hidden { display: none;可见性:隐藏;不透明度:0;过滤器:阿尔法(不透明度= 0); /* 旧版 Microsoft 不透明度 */ } /* 内容和样式菜单的基本样式 */ .main__content { background-color: lightgray;颜色:黑色; } .menu__hidden { 背景颜色:黑色;颜色:浅灰色; /* 让列表看起来不那么_listy_ */ list-style: none;左填充:5px; } .menu__option { 框大小:内容框;显示:块;位置:静态; z-index:自动; } /* ▼ - \u2630 - 三栏 */ /* .menu__trigger__selection::before { content: '\2630';显示:内联块; } */ /* ▼ - 向下箭头 */ .menu__trigger__selection::after { content: "\25BC";显示:内联块;变换:旋转(90度); } /* 自定义看起来更像 `select` 如果你喜欢 */ .menu__trigger__style:hover, .menu__trigger__style:active { cursor: pointer;背景颜色:深灰色;白颜色; } /** * 检查复选框/收音机时要做的事情 */ .menu__checkbox__selection:checked + .menu__trigger__selection::after, .menu__checkbox__selection[checked] + .menu__trigger__selection::after { transform: rotate(0deg); } /* 这一点你可能在别处看到 */ .menu__checkbox__selection:checked ~ .menu__hidden, .menu__checkbox__selection[checked] ~ .menu__hidden { display: block;能见度:可见;不透明度:1;过滤器:阿尔法(不透明度= 100); /* 微软!? */ } /** * Hacky CSS 仅根据非内联复选框进行更改 * ...也就是在此之后您无法取消看到的内容... */ .menu__checkbox__style[id="style-default"]:checked ~ .main__content { 背景颜色:浅灰色;颜色:黑色; } .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 { 背景颜色:黑色;颜色:浅灰色; } .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;红色; } .menu__checkbox__style[id="style-two"]:checked ~ .main__content .menu__trigger__style[for="style-two"] { color: darkorange; }

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

结果。 Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。 Exceptioneur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est labourum。

... 漂亮,但仅使用 CSS 和 HTML 就可以通过链接 id 和 { 从几乎任何地方触摸和重新触摸除 body:root radio/checkbox inputslabel triggers 的 4} 个属性;可能有人会在某个时候展示如何重新触摸它们。

另一个警告是,只有 一个 input 可能使用特定 id,换句话说,首先 checkbox/radio 赢得一个切换状态。 . 但是多个标签都可以指向同一个 input,尽管这会使 HTML 和 CSS 看起来更加粗暴。

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

我不确定其他伪类,但我:checked为 pre-CSS 3。如果我没记错的话,它类似于 [checked],这就是为什么您可以在上面的代码中找到它,例如,

.menu__checkbox__selection:checked ~ .menu__hidden,
.menu__checkbox__selection[checked] ~ .menu__hidden {
 /* rules: and-stuff; */
}

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

综上所述,请永远不要在生产中使用它,即使是愤怒也不行。作为一个玩笑,或者换句话说,仅仅因为可以做某事并不总是意味着它应该做。


从来没有计划过“CSS4”,甚至在 2019 年之前,甚至 CSS3 都已合并为“CSS”。
维护规范的人正在考虑 Tyler CSS4。公告链接 → w3.org/community/css4 讨论链接 → github.com/w3c/csswg-drafts/issues/4770
这只是一个讨论组的名称。不会有称为 CSS4 的技术。 CSS 模块是独立版本的,并且已经有很多年了。由于该随机用户的 GitHub 请求中的实际 CSSWG 贡献者已经回复了 and wrote a response about,因此这不是一个好主意。此外,该请求已经失效一年多了(您可以看到 GH w3c 帐户一直在删除最近试图删除它的宣传评论)。
那篇文章是一种平和的观点,总体上分散了规范讨论线程的注意力。少数标记为偏离主题的评论和一条已删除的评论不会有意破坏,如果工作组致力于终止 CSS4 讨论,我希望该问题被标记为已关闭。没关系,在大型项目中是一件好事,模块是独立版本的;模块版本与规范版本不冲突。
这是 CSSWG 的一位贡献成员根据她在 GitHub 请求中的“否”响应推断出的一篇观点文章,该请求中的语言已停用一年多。可以肯定地说它没有被推进。正如线程中的几条评论所强调的那样,模块版本将与规范版本控制发生巨大冲突。听着,尽管您希望它成为一件事,但事实并非如此。重要的是要接受这一点,不要通过提及不存在的事物来混淆读者。
S
Stokely

尝试这个...

此解决方案使用无 Javascript 的纯 CSS2 规则,适用于所有新旧浏览器。单击时,子 anchor 标记会激活其 active 伪类事件。然后它简单地隐藏自己,允许 active 事件冒泡到父 li 标记,然后他重新设置自己的样式并以新的样式再次显示他的锚子。孩子已经为父母设置了样式。

使用您的示例:

<ul>
    <li class="listitem">
        <a class="link" href="#">This is a Link</a>
    </li>
</ul>

现在将这些样式与 a 上的 active 伪类一起应用,以在单击链接时重新设置父 li 标记的样式:

a.link {
    display: inline-block;
    color: white;
    background-color: green;
    text-decoration: none;
    padding: 5px;
}

li.listitem {
    display: inline-block;
    margin: 0;
    padding: 0;
    background-color: transparent;
}

/* When this 'active' pseudo-class event below fires on click, it hides itself,
triggering the active event again on its parent which applies new styles to itself and its child. */

a.link:active {
    display: none;
}

.listitem:active {
    background-color: blue;
}

.listitem:active a.link {
    display: inline-block;
    background-color: transparent;
}

您应该会看到带有绿色背景的链接现在在单击时变为列表项的蓝色背景。

https://i.stack.imgur.com/2MTVy.png

转向

https://i.stack.imgur.com/aRVcH.png

点击。


D
Dmitry Sokolov

由于“CSS 工作组之前拒绝父选择器提案的主要原因与浏览器性能和增量渲染问题有关”,因此没有 css(因此在 css 预处理器中)父选择器。