如何选择作为锚点元素的直接父级的 <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>
元素中...(除非我主题化菜单创建模块,但我宁愿不这样做)。
:has()
伪类,它提供了这种功能,以及其他功能。li:has(> a.active) { /* styles to apply to the li tag */ }
about:config
中手动启用它,将layout.css.has-selector.enabled
更改为true
。 - D.Kastier:has(> svg)
!谢谢! - Neil Gaetano Lindberg你可以使用 :has()
CSS 伪类
但是它有有限的浏览器支持(目前 Firefox 不支持)。
@supports selector(:has(a))
。 - xdhmoore@supports not selector(:has(a, b)) { ... }
成功地检查了非兼容浏览器,例如撰写时的Firefox。请参阅https://developer.mozilla.org/en-US/docs/Web/CSS/@supports#testing_for_the_support_of_a_selector。 - Ludovic Kuty我认为在CSS中无法仅选择父元素。
但是,由于您似乎已经拥有一个.active
类,将该类移动到li
(而不是a
)将更容易。这样,您可以仅通过CSS访问li
和a
。
您可以使用此脚本:
*! > 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中可以使用。
patent()
会更快。不过需要进行测试验证。 - Dan#a!
单独会抛出错误,#a! p
有效),因此其他选择器也无法正常工作,因为会出现“Uncaught TypeError: Cannot call method 'split' of undefined”错误。请参见http://jsfiddle.net/HerrSerker/VkVPs/。 - yunzen正如其他几位提到的,仅使用CSS无法样式化元素的父级元素,但以下内容可使用 jQuery 实现:
$("a.active").parents('li').css("property", "value");
<
语法在2009年可行,但我已将其更新(适用于2013年)。 - Alastair:has()
选择器: $("li:has(a.active)").css("property", "value");
。它与CSS 4提议的!
选择器类似。另请参见::parent
选择器、.parents()
方法、.parent()
方法。 - Rory O'Kane.css("property", "value")
来为选定元素设置样式,通常你应该使用.addClass("someClass")
并在CSS中定义.someClass { property: value }
(来源)。这样,你可以利用完整的CSS功能及任何预处理器来注释样式。 - Rory O'Kane没有父级选择器,就像没有前一个同级选择器一样。不使用这些选择器的一个好原因是因为浏览器必须遍历元素的所有子元素来确定是否应该应用类。例如,如果您编写了以下代码:
body:contains-selector(a.active) { background: red; }
然后浏览器将不得不等待直到它加载和解析了 </body>
之前的所有内容,才能确定页面是否应该是红色的。
为什么我们没有父级选择器这篇文章详细解释了这个问题。
伪元素:focus-within
允许在后代元素获得焦点时选择其父元素。
如果一个元素有tabindex
属性,它就可以被聚焦。
示例
.parent:focus-within {
background: hsl(199deg, 65%, 73%);
}
/* demo styles */
body {
margin: 0;
}
.parent {
background: hsl(0, 0%, 80%);
min-height: 100vh;
display: grid;
place-content: center;
}
.child {
background: hsl(0, 0%, 0%);
color: white;
padding: 3rem;
outline: 0;
cursor: pointer;
font: 18px/1.25 sans-serif;
width: 20ch;
}
<div class="parent">
<div class="child" tabindex="0">
Click or Focus on me, my parent will change.
</div>
</div>
.color:focus-within .change
替换为.color:focus-within
来实现。在我的情况下,我正在使用bootstrap nav-bar,在活动时将类添加到子元素,并且我想要向父级.nav-bar
添加类。我认为这是一个相当常见的场景,其中我拥有标记,但组件css+js是bootstrap(或其他),因此我无法更改其行为。尽管如此,我可以添加tabindex并使用此CSS。谢谢! - cancerbero在CSS 2中没有办法实现这个。您可以将该类添加到li
并引用a
:
li.active > a {
property: value;
}
尝试将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: ...
}
:visible
伪类)。body
也是html
的直接且唯一后代。 - TylerH
:has()
选择器的实现。 - TylerHel.parenteElement.parenteElement...
一致的工作方式,比如a:active:parent:parent
或者甚至是a::active::parent::parent
,用两个分号。这不仅更符合现有伪类的逻辑,而且更易于使用和链接,以便在需要时向上多级。我真的希望有这种实现,因为我真的很讨厌使用:has(something)
:它既没有逻辑性,也没有直观性和人体工程学可用性。JavaScript 的方式更好,远胜于 :has()。 - willy wonka