CSS的未来版本会支持父或祖先选择器吗

Will future versions of CSS support parent or ancestor selector?

本文关键字:祖先 选择器 支持 未来 版本 CSS      更新时间:2023-09-26

让我们假设我有一个主题,我在其中设计form s。让我们进一步假设form可能有一个.submit类的submit按钮。存在按钮为disabledform未准备好提交)和按钮不是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标记(如果存在),并在调用disableenable时对其进行样式设置。相反,我希望能够做这样的事情:

.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*/
    }
}

尽管出现了disableenable,但它们并不是代码重复,因为我们打算添加不同的样式。当然,这段代码可以进行一些重构,但它很难看,很难维护,而且很粗糙,更不用说它假设在需要更改disabled属性的状态时调用disableenable。虽然上面显示的所有问题都是可以解决的,即使没有父/祖先选择器,我更希望能够在.css文件中实现主题,而不需要Javascript破解,也不需要假设无论何时按钮获得disableddisable都会被调用,无论何时按钮启用,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,但背后有着昂贵的思想。