- From: Kang-Hao (Kenny) Lu <kennyluck@csail.mit.edu>
- Date: Tue, 10 Apr 2012 04:14:04 +0800
- To: "Tab Atkins Jr." <jackalmage@gmail.com>
- CC: WWW Style <www-style@w3.org>
(12/04/10 3:05), Tab Atkins Jr. wrote: > On Mon, Apr 9, 2012 at 11:11 AM, Kang-Hao (Kenny) Lu >> Use Case A: In a User Interface built by nesting elements (say, >> <table>), set background color on the elements alternatively along the >> nesting level. See picture[1] >> >> table { >> background-color: cycle(gray, white); >> } >> >> doesn't work with the current definition of 'cycle()': >> >> # The value returned by ‘cycle()’ must be determined by comparing >> # the inherited value I (the computed value on the parent, or, for >> # the root, the initial value) to the computed values Cn returned by >> # the n-th argument to ‘cycle()’. For the earliest Cn such that >> # Cn = I, the value returned by cycle is Cn+1. However, if this Cn is >> # the last value, or if there are no Cn that equal I, the computed >> # value of the first value is returned instead. >> >> because 'I' is always 'none'. > > ? Why is I always 'none' here? Tables are allowed to have > background-colors. Also, 'none' isn't even a valid value for > background-color. Oops, I meant to say 'transparent'. > Your example should work. Of course, 'background-color' isn't > inherited by default, so if you want it to pierce through <tr> and > <td> to get to a nested <table>, you'll have to set "tr, td { > background-color: inherit; }" as well. I think this is too hacky a solution. It certainly doesn't quite do what the script is doing right now: attaching class alternatively, and sometimes you just don't know what is in between so you probably need 'table :not(table) { background-color: inherit; }' Also, 'background-color' is a bit magical here, another example would be table { transform: cycle(rotate(10deg), rotate(-10deg)); } with table :not(table) { transform: inherit; } which wouldn't work as expected. The general use case here is that cycle() is used like :nth-child(an+b) but applies based on nesting level instead of number of siblings. >> Proposal B: 'cycle()' works as if there's an anonymous counter for each >> declaration with a 'cycle()', which is incremented when entering >> elements where that declaration applies and wins and decremented when >> leaving such elements. 'cycle()' returns the value corresponding to the >> value of the counter. (Some details about what 'a declaration' is >> missing for the moment.) > > Your proposal B requires us to either attach meaning to the *source* > of a declaration (such that splitting "A,B{...}" into "A{...} B{...}" > or merging in the opposite direction will change the behavior of the > CSS by creating more/less counters) which has no precedent in CSS and > is almost certainly a bad idea, Yeah, that's true. > or requires us to compare cycle() > declarations to see if they're identical (and thus should use the same > counter) which also relies on value-equality, which you list as a > problem. Or you can compare by source string, but I think this is too hacky and would create too many subtle bugs. > It also works incorrectly if you have a chain of cycle()s that work > together, but in the middle you instead set the value to an explicit > option - the following cycle() will just ignore that value and > continue to iterate to the entry following whatever the grandparent > used. I think I need an example to fully understand this. Can you give me an example use case? Why would you want to have a chain of cycle()s? My impression is that I don't think this behavior is actually desirable, and this is only correct if you want the "use x if the parent is y..." behavior, which as I said, is very different from "use x, and then y, and then z..." >> == Advantages == >> >> 1. It is a lot more intuitive and less error-prone by specifying "use x, >> and then y, and then z..." than "use x if the parent is y...". For >> example, css3-lists has >> >> # /* Default list style types for unordered lists up to 3 deep */ >> # ul { list-style-type: disc; } >> # ul ul { list-style-type: square; } >> # ul ul ul { list-style-type: circle; } >> # /* Alternately, if Values & Units Level 3 is supported, replace >> # the above three lines with: */ >> # ul { list-style-type: cycle(disc, square, circle); } >> >> in the "Sample style sheet for HTML", which doesn't work without >> Proposal B applied because the inherited value I is 'disc' from the >> initial value (and people forget that) and so the 'list-style-type' of >> the top level <ul> is 'square'. > > Ah, yes, that's definitely an error. This aspect is a bit of a > footgun, but it should be quickly obvious in practice. I'll fix the > error. I am quite interested in your fix. The best I can do is ul { list-style-type: disc; } ul ul { list-style-type: cycle(disc, square, circle);} but it is no longer too useful if I can only reduce three declarations to two. (I don't quite care about this use case though) But anyway, I think this is far from obvious, and this is because "use x, and then y, and then z...(repeat)" and "use x if the parent is y..." require very different thinking. The current definition is mainly designed for the latter as far as I can tell. Cheers, Kenny
Received on Monday, 9 April 2012 20:14:33 UTC