- From: Tab Atkins Jr. <jackalmage@gmail.com>
- Date: Wed, 23 Jul 2014 11:20:37 -0700
- To: Michaël Rouges <michael.rouges@gmail.com>
- Cc: www-style list <www-style@w3.org>
On Wed, Jul 23, 2014 at 10:49 AM, Michaël Rouges
<michael.rouges@gmail.com> wrote:
> Hi all,
>
> At work, I found a funny and usefull idea missing in CSS.
>
> I'm surely not the first, maybe proposed or planned but, if not...
>
> The goal is to have a selector that matches on CSS properties (or property
> values).
>
> It usefull to make custom stylesheets (like one by user, overloading a
> default stylesheet), to easily add/change some properties on a lot of
> elements with common property/properties.
>
> But where is all his power is in Javascript, since it allows to do much more
> than add style! :P
>
> I let you to think on its capabilities and on a syntax proposal. ;)
Unfortunately, this isn't possible to do. It suffers from basic
circularity problems. For example:
div {
display: block;
}
div:property(display:block) {
display: inline;
}
Since the first rule sets the div to display:block, then this selector
will match and set it to display:inline in the second rule. But that
means the selector doesn't match anymore, so it goes back to being
display:block. But that means the selector matches again, so it goes
back to being display:inline. Etc.
Many people then try to avoid this by saying you can't set a property
that's used in the selector, so the above would be invalid and safe.
But that doesn't actually stop the problem:
div {
display: block;
color: black;
}
div:property(display:block) {
color: red;
}
div:property(color:red) {
display: inline;
}
This has the same problem, just with a larger loop. If it's block, it
turns red. If its red, it becomes an inline. But as an inline, it's no
longer a block, so it's no longer red. But if it's no longer red, it's
back to being a block. But that means it's red... etc. You can have
an arbitrarily-long chain of selectors and values that participate in
a loop like this, and you can't even detect the loop statically,
because you need to apply the rules to a document to see which rules
combine on a single element.
I have a proposal for solving this in more limited cases
<https://tabatkins.github.io/specs/css-toggle-states/#checked-problems>,
but that won't work here, since it would add *all* properties the list
of selector-affecting properties, preventing you from using any
properties at all in a rule containing a :property() selector. This
obviously isn't very useful for CSS. ^_^
That said, there are use-cases for making it easier for *JS* to figure
out what elements have what properties, such as using custom
properties <http://dev.w3.org/csswg/css-variables/#defining-variables>
and using JS to actually make them have an effect. I plan to figure
out something for this in the nearish future, so keep an eye out for
either a Level 2 of Variables, or an update to the Extensions spec
<http://dev.w3.org/csswg/css-extensions/> covering more advanced
custom properties handling.
~TJ
Received on Wednesday, 23 July 2014 18:21:24 UTC