问题描述:
如何选择作为锚元素的直接父级的
- 元素?
-
例如,我的 CSS 是这样的:
li < a.active { property: value; }
显然有一些使用 JavaScript 的方法,但我希望有某种解决方法存在于 CSS Level 2 中。
我试图设置样式的菜单被 CMS 吐出,所以我无法将活动元素移动到
- 元素…(除非我为菜单创建模块设置主题,我不想这样做) .
-
解决方案1:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
目前没有办法在 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。
截至 2022 年 3 月,Safari 15.4 is the first to fully support :has() in stylesheets 和 Chrome is currently implementing it。
它将在 September 2022 在 Chrome 105 中发布。
解决方案2:
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求
是::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”可以准确地告诉读者他们需要知道的内容,而无需单击链接并离开网站以找出答案的含义。
解决方案3:
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求
我认为您不能仅在 CSS 中选择父级。
但由于您似乎已经有一个 .active 类,因此将该类移到 li(而不是 a)会更容易。这样,您只能通过 CSS 访问 li 和 a。
您不能将伪选择器转移到列表项,因为它不是可聚焦的元素。他正在使用 :active 选择器,因此当锚点处于活动状态时,他希望列表项受到影响。列表项永远不会处于活动状态。顺便说一句,不幸的是这样的选择器不存在。如果没有它,让纯 CSS 菜单完全可以通过键盘访问似乎是不可能的(使用同级选择器,您可以使使用嵌套列表创建的子菜单出现,但是一旦列表获得焦点,它就会再次隐藏)。如果这个特定的 conun 有任何纯 CSS 的解决方案
@Dominic Aquilina 看看这个问题,OP 使用的是一个类,而不是一个伪选择器。
解决方案4:
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
您可以使用 this script:
*! > input[type=text] { background: #000; }
这将选择文本输入的任何父级。但是等等,还有更多。如果需要,您可以选择指定的父级:
.input-wrap! > input[type=text] { background: #000; }
或者在它处于活动状态时选择它:
.input-wrap! > input[type=text]:focus { background: #000; }
看看这个 HTML:
Your name sir
您可以在 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 中实现。
解决方案5:
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求
正如其他几个人所提到的,没有办法仅使用 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 和您正在使用的任何预处理器的全部功能来标记样式。
解决方案6:
huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。
没有父选择器;就像没有以前的兄弟选择器一样。没有这些选择器的一个很好的原因是浏览器必须遍历一个元素的所有子元素来确定是否应该应用一个类。例如,如果你写:
body:contains-selector(a.active) { background: red; }
然后浏览器将不得不等到它加载并解析所有内容,直到 来确定页面是否应该是红色的。
文章Why we don’t have a parent selector 详细解释了它。
所以让浏览器更快。互联网本身更快。这个选择器是绝对需要的,遗憾的是,没有实现它的原因是因为我们生活在一个缓慢而原始的世界中。
实际上,选择器会使一个非常快的浏览器看起来很慢。
我相信浏览器开发人员会提出一个(至少)与 javascript 版本一样快的实现,这是人们最终使用的版本。
@Marc.2377 如果您在您的网站上尝试上面的 JS 示例,我将永远不会访问它。另一方面,我会说大多数时候,你只关心直系孩子,所以如果它只限于直系孩子,那将是一个很好的补充,没有太大的影响。
解决方案7:
huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感
在 CSS 2 中没有办法做到这一点。您可以将该类添加到 li 并引用 a:
li.active > a { property: value; }
通过使 a 元素 display:block 您可以设置其样式以适应整个 li 区域。如果你能解释你正在寻找什么风格,也许我可以帮助你解决问题。
解决方案8:
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
如果后代具有焦点,则伪元素 :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。谢谢!
解决方案9:
huntsbot.com – 高效赚钱,自由工作
尝试将 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: ... }
解决方案10:
huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感
CSS 选择器“General Sibling Combinator”可以用于您想要的:
E ~ F { property: value; }
这匹配前面有 E 元素的任何 F 元素。
.component-one:visible ~ body{ background-color: red; } 不起作用。
@F-Natic 不起作用我并不感到惊讶。它不是有效的 CSS(CSS 中没有 :visible 伪类)。 body 也是 html 的直接且唯一后代。
解决方案11:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
据我所知,不在 CSS 2 中。 CSS 3 具有更强大的选择器,但并非在所有浏览器中都一致地实现。即使使用改进的选择器,我也不相信它会完全完成您在示例中指定的内容。
原文链接:https://www.huntsbot.com/qa/w7Ee/is-there-a-css-parent-selector?lang=zh_CN
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求