如何选择作为锚元素的直接父元素的<li>元素?
例如,我的CSS应该是这样的:
li < a.active {
property: value;
}
很显然,JavaScript有很多方法可以做到这一点,但我希望有某种变通方法可以在CSS Level 2中使用。
我正在尝试设置样式的菜单被CMS弹出,因此我无法将活动元素移动到<li>元素。。。(除非我对菜单创建模块进行主题化,否则我不想这样做)。
如何选择作为锚元素的直接父元素的<li>元素?
例如,我的CSS应该是这样的:
li < a.active {
property: value;
}
很显然,JavaScript有很多方法可以做到这一点,但我希望有某种变通方法可以在CSS Level 2中使用。
我正在尝试设置样式的菜单被CMS弹出,因此我无法将活动元素移动到<li>元素。。。(除非我对菜单创建模块进行主题化,否则我不想这样做)。
当前回答
正如其他一些人所提到的,没有一种方法可以仅使用CSS来设置元素的父级,但以下方法适用于jQuery:
$("a.active").parents('li').css("property", "value");
其他回答
没有父选择器;就像以前没有兄弟选择器一样。不使用这些选择器的一个很好的原因是,浏览器必须遍历元素的所有子元素,以确定是否应应用类。例如,如果您写道:
body:contains-selector(a.active) { background: red; }
然后,浏览器必须等到加载并解析完所有内容,直到</body>确定页面是否应为红色。
《为什么我们没有父选择器》一文详细解释了这一点。
更新2022 CSS选择器4
在CSS Selectors 4规范中,CSS引入了一个名为:has()的新选择器,它最终允许我们选择父级。这意味着我们将能够针对一个包含特定子元素的CSS元素。这在Safari和Chrome105中都已得到支持。显示完整的支撑台在这里
父选择器工作
在CSS中,如果我们想选择一些东西,我们使用DOM下面的选择器。
例如,在div标记中选择p标记如下所示:
div p {
color: red;
}
不过,到目前为止,我们还无法真正选择其中包含p标记的div标记,这意味着我们不得不求助于Javascript。没有在CSS中实现这一点的主要原因是,这是一个相当昂贵的操作。CSS解析速度相对较快,但选择父标记需要相对较大的处理量。
使用:has选择器,我们现在可以选择具有p子级的div元素,或选择器的任何正常组合。
例如,选择带有子p的div现在看起来像这样:
div:has(p) {
color: red;
}
这将使任何带有子p的div变为红色。
将父选择与其他选择器组合
就像任何其他CSS选择器一样,我们可以针对特定情况组合这些选择器。例如,如果只选择具有直接span子级的div标记:
div:has(> span) {
color: red;
}
正如:的词汇所暗示的,它不仅仅局限于父母的选择。
例如,下面我们可以选择一个span,该span:有一个同级div:
span:has(+ div) {
color: red;
}
甚至,通过使用:not()选择器选择一个没有子元素的元素。
例如,下面将选择任何没有p子级的div:
div:not(:has(p)) {
color: red;
}
选择仅包含CSS中文本的元素
CSS中一个非常常见的问题是:empty标记不选择包含任何文本的元素,因此有时元素可以包含一个空格,而:empty将不适用。has选择器使我们能够选择只包含文本节点而不包含其他子元素的元素。
虽然这并不是简单的空元素和空格的完美解决方案(因为这将选择任何只包含文本的元素,而不包含额外的HTML DOM元素),但它确实让我们能够选择只包含文本节点的DOM元素,这在以前是不可能的。我们可以通过以下代码实现这一点:
div:not(:has(*)) {
background: green;
}
有什么想法吗?
如果CSS4在向后行走时添加了一些钩子,那么它会很漂亮。在此之前,可以使用复选框和/或无线电输入来打破通常的连接方式,并且通过这种方式也允许CSS在其正常范围之外运行。。。
/*隐藏可能稍后显示的内容*/菜单_复选框_选择,.menu__checkbox _样式,.menu__隐藏{显示:无;可见性:隐藏;不透明度:0;过滤器:alpha(不透明度=0);/*旧Microsoft不透明度*/}/*内容和样式菜单的基本样式*/.main__内容{背景色:浅灰色;颜色:黑色;}.menu__隐藏{背景色:黑色;颜色:浅灰色;/*使列表看起来不是这样_listy_*/列表样式:无;左侧填充:5px;}.menu__选项{框大小:内容框;显示:块;位置:静态;z索引:自动;}/* ▼ - \u2630-三条线*//*.menu__trigger__selection::之前{内容:'\2630';显示:内联块;}*//* ▼ - 向下箭头*/.menu__trigger__selection::之后{内容:“\25BC”;显示:内联块;变换:旋转(90度);}/*自定义以使其看起来更像“选择”(如果愿意)*/.menu__trigger__style:悬停,.menu__trigger__style:活动{光标:指针;背景色:深灰色;颜色:白色;}/***选中复选框/收音机时要做的事情*/.menu__checkbox_selection:选中+.menu__trigger__selection::之后,.menu__checkbox_selection[checked]+.menu__trigger__selection::之后{变换:旋转(0deg);}/*这一点你可以在其他地方看到*/.menu__checkbox_selection:选中~.menu__hidden,.menu__checkbox_selection[checked]~.menu__hidden{显示:块;可见性:可见;不透明度:1;过滤器:alpha(不透明度=100);/*Microsoft*/}/***仅基于非内联复选框的黑客CSS更改* ... AKA这之后你不能解开的东西。。。*/.menu__checkboxx_style[id=“style default”]:选中~.main__content{背景色:浅灰色;颜色:黑色;}.menu__checkboxx_style[id=“style default”]:选中~.main__content.menu__trigger__style[for=“style default”]{颜色:深橙色;}.menu__checkboxx_style[id=“style one”]:选中~.main__content{背景色:黑色;颜色:浅灰色;}.menu__checkboxx_style[id=“style one”]:选中~.main__content.menu__trigger__style[for=“style one”]{颜色:深橙色;}.menu__checkboxx_style[id=“style two”]:选中~.main__content{背景色:深绿色;颜色:红色;}.menu__checkboxx_style[id=“style two”]:选中~.main__content.menu__trigger__style[for=“style二”]{颜色:深橙色;}<!--这一点可行,但总有一天会带来麻烦,但事实是,你可以粘贴复选框/无线电输入随便找个地方,然后用身份证给他们打电话“for”标签。继续滚动查看我的意思--><输入类型=“收音机”name=“上色”class=“menu__checkbox_style”id=“style default”><输入类型=“收音机”name=“上色”class=“menu__checkbox_style”id=“style one”><输入类型=“收音机”name=“上色”class=“menu__checkbox_style”id=“style two”><div class=“main__content”><p class=“paragraph__split”>Lorem ipsum dolor坐amet,consectetur adipiscing elit,sed do eiusmod暂时停止劳动和劳动。乌特海姆和最小的威尼斯,quis nostrud exerciation ullamco labours nisi ut aliquip ex ea commo</p><input-type=“checkbox”class=“menu__checkbox_selection”id=“触发器样式菜单”><label for=“触发器样式菜单”class=“menu__trigger__selection”>主题</label><ul class=“menu__hidden”><li class=“menu__option”><label for=“style default”class=“menu__trigger__style”>默认样式</label></li><li class=“menu__option”><label for=“style one”class=“menu__trigger__style”>第一替代样式</label></li><li class=“menu__option”><label for=“style two”class=“menu__trigger__style”>第二种可选样式</label></li></ul><p class=“paragraph__split”>金桔。我是一个很好的朋友cillum dolore eu fugiat nulla pariator。偶尔会发生意外proident,sunt in guma qui official disestant mollit anim is laburum。</p></div>
……相当粗鲁,但仅使用CSS和HTML,就可以通过链接id和radio/checkbox输入和标签触发器的财产,从几乎任何地方接触和重新接触任何东西,除了正文和:root;很可能有人会在某个时候展示如何重新触摸这些。
一个额外的警告是,只能使用特定id的一个输入,第一个复选框/单选框将赢得切换状态,换句话说。。。但是多个标签都可以指向同一个输入,尽管这会使HTML和CSS看起来更恶心。
…我希望有某种变通方法可以在CSS Level 2中使用。。。
我不确定其他伪类,但我检查了CSS3之前的版本。如果我没记错的话,它类似于[checked],这就是为什么你可以在上面的代码中找到它,例如,
.menu__checkbox__selection:checked ~ .menu__hidden,
.menu__checkbox__selection[checked] ~ .menu__hidden {
/* rules: and-stuff; */
}
…但对于像::after和:hover这样的东西,我完全不确定它们最初出现在哪个CSS版本中。
所有这些都表明,请不要在生产中使用,甚至不要在愤怒中使用。作为一个玩笑,或者换句话说,仅仅因为某件事可以做,并不总是意味着它应该做。
我认为你不能只在CSS中选择父级。
但由于您似乎已经有一个.active类,所以将该类移动到li(而不是a)会更容易。这样,您只能通过CSS访问li和a。
我会雇佣一些JavaScript代码来实现这一点。例如,在React中,当您遍历数组时,向父组件添加另一个类,这表明它包含您的子组件:
<div className={`parent ${hasKiddos ? 'has-kiddos' : ''}`}>
{kiddos.map(kid => <div key={kid.id} />)}
</div>
然后简单地:
.parent {
color: #000;
}
.parent.has-kiddos {
color: red;
}