CSS的未来版本会支持父或祖先选择器吗
Will future versions of CSS support parent or ancestor selector?
让我们假设我有一个主题,我在其中设计form
s。让我们进一步假设form
可能有一个.submit
类的submit
按钮。存在按钮为disabled
(form
未准备好提交)和按钮不是disabled
的情况。我可以这样设计按钮:
.submit {
/*Some Rules*/
}
.submit:disabled {
/*Some Rules*/
}
然而,如果我知道按钮将位于div
内部,并且我想基于disabled
属性对其父级进行样式设置,那么我需要实现disable
和启用function
,并在这些function
中对parentElement
进行样式设置。相反,我希望能够定义这样的规则:
.submit < div { /*where < would mean parent*/
/*Some rules*/
}
.submit:disabled < div {
/*Some rules*/
}
目前不支持此功能。
让我们进一步假设,我想根据按钮的disabled
属性来设置form
的样式,以直观地显示form
是否准备好提交。在这种情况下,我需要找到祖先form
标记(如果存在),并在调用disable
或enable
时对其进行样式设置。相反,我希望能够做这样的事情:
.submit << form { /*Where << means ancestor*/
/*Some rules*/
}
.submit:disabled << form {
/*Some rules*/
}
现在我们需要做的不是这种简单明了的方法:
function disable(element) {
element.disabled = true; //Disabling the button
var p = element.parentElement; //Here we need to style p with Javascript
//Find the form element
var formExists = true;
while (formExists && (p.tagName !== "form")) {
if (p.tagName === "html") {
formExists = false;
} else {
p = p.parentElement;
}
}
if (formExists) {
/*Do something with p*/
}
}
function enable(element) {
element.disabled = false; //Disabling the button
var p = element.parentElement; //Here we need to style p with Javascript
//Find the form element
var formExists = true;
while (formExists && (p.tagName !== "form")) {
if (p.tagName === "html") {
formExists = false;
} else {
p = p.parentElement;
}
}
if (formExists) {
/*Do something with p*/
}
}
尽管出现了disable
和enable
,但它们并不是代码重复,因为我们打算添加不同的样式。当然,这段代码可以进行一些重构,但它很难看,很难维护,而且很粗糙,更不用说它假设在需要更改disabled
属性的状态时调用disable
或enable
。虽然上面显示的所有问题都是可以解决的,即使没有父/祖先选择器,我更希望能够在.css文件中实现主题,而不需要Javascript破解,也不需要假设无论何时按钮获得disabled
,disable
都会被调用,无论何时按钮启用,enable
也会被调用。此外,如果这种事情可以由CSS触发,那么我们可以自动使用浏览器级别的果汁,这可以提高性能。
另一种选择是为form
定义一个class
,但class
需要与disabled
属性一起以编程方式维护,情况也好不到哪里去。
我相信我已经在我的问题中证明了,从几个角度来看,与Javascript ui黑客相比,这样的CSS规则会更好:
- 父母和祖先可以在一个.css文件中设计
- 开发人员不必担心调用helper函数,也不必担心将这些策略告诉新的团队成员或记录主题的使用情况
- 不需要编写难以维护的Javascript函数来处理ui更改
- 如果需要,我们可以用其他CSS规则来覆盖规则,而不是将黑客升级为更大的黑客
我知道父和祖先选择器不在我们可以使用的CSS功能之列,所以我想知道这种情况是否会改善。这种功能有已知的计划吗?这些安排在未来的日期吗?
是。在CSSv4中将是:has()
伪选择器。父元素的问题由来已久,您的建议广为人知:
element < parent {}
会有严重的问题。浏览器从右到左读取CSS,所以这种选择器的性能会很低。
相关链接(2008年建议):
- http://shauninman.com/archive/2008/05/05/css_qualified_selectors
为了实现这一点,在CSS4中,我们可以做到:
element:has(.parent) {}
这将是完美的!它可以选择.parent
选择器所包含的元素。我们可以做更多的事情,比如:
element:not(:has(.parent)) {}
element:has(#myId > .myClass) {}
目前任何浏览器都不支持此功能。这是一个工作草案,将附带CSS级别4。
相关链接:
- https://snook.ca/archives/html_and_css/css-parent-selectors
- https://remysharp.com/2010/10/11/css-parent-selector
- https://developer.mozilla.org/en-US/docs/Web/CSS/:has
- https://dev.w3.org/csswg/selectors4/#relational
虽然这种出色的选择器不能用于一般用途,但您必须使用Javascript或考虑其他HTML结构来避免父选择器的需要。
版本:
我现在发现了一个polyfill,它允许您使用CSS定位父元素。它是用jQuery编写的,但它翻译了CSS内容,所以你不需要做任何事情来使它工作(除了插件)
- https://github.com/Idered/cssParentSelector
从插件页面提取的快速信息:
!
-根据CSS4参考确定选择器的主题
E > F
-选择一个F元素,E 的子元素
E! > F
-选择一个E元素,F 的父元素
CSS4参考
过去,这种语法用于开发父元素选择器,但由于性能原因,它被丢弃了。这里有一个链接来解释它:
- http://red-team-design.com/css-parent-selector/
替代技术
这是一种允许您在纯CSS中进行不同思考以实现相同功能(风格化父元素)的技术。你可以在这个链接中看到:
- https://escss.blogspot.com/2014/02/parent-selector-pure-css.html
它解释了如何在没有奇怪的东西、插件或polyfill的情况下选择父元素。它只是纯粹的CSS,但背后有着昂贵的思想。
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 在动态创建的元素上获取对特定选择器的引用
- AngularJS-在JSON选择器中使用变量名
- 每当您在选择器内移动鼠标时,悬停功能就会重复
- 使用CSS或js,使用动态选择器选择任意li的下一个元素
- jQuery最近父级的数据属性选择器
- 为什么不'在JQuery中找到第二个css选择器的工作
- 为什么 .focus() 不起作用,而 .css(“color”,“red”) 在同一个选择器上起作用
- jquery IE7中的第n个选择器
- Webdriver.io pageObject模式-通过传递参数来定义元素选择器
- jquery日期选择器年份范围默认值
- jquery日期选择器失去了交互性
- 正在搜索JavaScript日期选择器滑块
- 获取看起来像选择器的祖先元素
- 使用本机DOM的最近祖先匹配选择器
- 一个祖先的多个元素的选择器
- 添加祖先选择器到这个javascript
- 具有特定类的JQuery祖先td选择器
- CSS的未来版本会支持父或祖先选择器吗
- 另一个最接近的子线程:查找与选择器匹配的元素的最近祖先