让我们假设我有一个主题,我正在设计form
。我们进一步假设form
可能有一个submit
类.submit
按钮。有时按钮为disabled
(form
尚未准备好提交)且按钮不是disabled
。我可以像这样设计按钮:
.submit {
/*Some Rules*/
}
.submit:disabled {
/*Some Rules*/
}
但是,如果我知道该按钮位于div
内并且我想根据disabled
属性设置其父级样式,那么我需要实现disable
和在这些function
中启用parentElement
并设置function
样式。而不是我希望能够定义这样的规则:
.submit < div { /*where < would mean parent*/
/*Some rules*/
}
.submit:disabled < div {
/*Some rules*/
}
目前不支持此功能。
让我们进一步假设我想根据按钮的form
属性设置disabled
的样式,以直观地显示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
不是代码重复,因为我们打算添加不同的样式。当然,这段代码可以在某种程度上进行重构,但它很丑陋,难以维护,而且很糟糕,更不用说它假设每当disable
或enable
调用时disabled
或disabled
1}}属性需要更改。虽然上面显示的所有问题都是可以解决的,即使没有父/祖先选择器,我宁愿能够在没有Javascript黑客的情况下在.css文件中实现主题,而不假设只要按钮获得disable
{{1调用按钮时,只要一个按钮被启用,就会调用enable
。此外,如果这种事情可以由CSS触发,那么我们可以自动使用浏览器级别的果汁,这样可以提高性能。
另一种方法是为class
定义form
,但是class
需要以编程方式与disabled
属性一起维护,事情并不多更好。
我相信我已经在我的问题中证明,与Javascript ui hacks相比,这样的CSS规则会优于几个观点:
我知道父和祖先选择器不属于我们可以使用的CSS功能,所以我想知道情况是否会改善。是否有针对此类功能的已知计划?这些是否安排在未来的日期?
答案 0 :(得分:3)
是。在CSSv4中将是:has()
伪选择器。父元素的问题是陈旧的,您的建议是众所周知的:
element < parent {}
会有严重的问题。浏览器从右到左读取CSS,因此这种选择器性能较低。
相关链接(2008年建议):
为了达到这个目的,我们可以在CSS4中做到:
element:has(.parent) {}
这将是完美的!它可以选择.parent
选择器包含的元素。我们可以做更多的事情:
element:not(:has(.parent)) {}
element:has(#myId > .myClass) {}
任何浏览器目前都不支持此功能。这是一个工作草案,将附带CSS级别4。
相关链接:
虽然这个令人敬畏的选择器不可用于一般用途,但您必须使用Javascript或考虑其他HTML结构来避免需要父选择器。
我现在发现了一个polyfill,它允许你使用CSS定位父元素。它是用jQuery编写的,但它可以翻译CSS内容,所以你不需要做任何事情来使它工作(除了插件包含)
从插件页面中提取的快速信息:
!
- 根据CSS4参考
E > F
- 选择一个F元素,即E
E! > F
- 选择一个E元素,F
CSS4参考
过去,这种语法用于开发父元素选择器,但由于性能原因,它被丢弃了。在这里,你是一个解释它的链接:
这是一种技术,允许您在纯CSS中思考不同以实现相同的功能(样式化父元素)。您可以在此链接中看到:
它解释了如何选择没有奇怪的东西,插件或polyfill的父元素。它只是纯粹的CSS,但背后有着昂贵的想法。