- From: Gavin Engel <gavin@engel.com>
- Date: Fri, 06 Dec 2013 08:59:39 +0000
- To: www-style@w3.org
- Message-ID: <CABeWdxDprOT19ppXRv93zNYVszhHHraUOUZcked3e66kdfDn0Q@mail.gmail.com> (sfid-20131206_085945_177473_356BDE0C)
Hello, I have a suggestion for the "Reference" syntax. (I have been reviewing this document <http://dev.w3.org/csswg/selectors4/#idref-combinators>.) The current proposal gives this example: label:matches(:hover, :focus) /for/ input { } I basically read that as: *When label is focused or hovered, select input with id inside label's > attribute for.* I see some things which could be improved with that syntax: 1. The attribute (in the example: *for*) is required to point to *only* an id. I do realize the *for* attribute is designed to bind a label to an input by id. (*I'm also assuming that references are intended for more than labels and inputs, although maybe I'm very mistaken and if that is the case feel free to stop reading this email!*) The problem I have is that it limits use of references. For example, what if we wanted to store a *class*name in an attribute and use that instead of id? For instance, <div data-someclass='foo'>*hover this...*</div> <div class='foo'>*...to select this*</div> 2. It is somewhat non-intuitive as to where the reference (*for*) applies to the second selector (*input*). If we use a more complex example we can see this more clearly: > label:matches(:hover, :focus) /for/ .foo input { } Does the *for*'s id apply to the .foo or to the input? I imagine it is meant to always apply to the *final* simple selector (*input*), even though reading from left-to-right the /for/ is next to .foo. This makes it somewhat non-intuitive. It also removes the *possibility* of attaching the id to the first simple selector (*.foo*). 3. The *for* isn't wrapped in the attribute combinators, *[* and *]*. That makes it *slightly* harder to recognize it as an attribute. An alternate syntax, for example this: label:matches(:hover, :focus) /input#[for]/ { } /** I feel this would > address the issues I gave above */* label:matches(:hover, :focus) /input#[data-foo]/ { } /* *uses the value of > attribute 'data-foo' to reference an id */* label:matches(:hover, :focus) /input.[data-foo]/ { } /* *uses the value of > attribute 'data-foo' to reference a class */* label:matches(:hover, :focus) /body #foo .bar div.[data-foo] .foo p div > span .bar/ { } /** allows reference to be anywhere in the second > compound selector */* Which can be expressed as: *When label is focused or hovered, select *body #foo .bar div.[data-foo] .foo > p div span .bar* with string inside label's attribute data-foo.* Perhaps this functionality goes way beyond the scope of what is meant to be accomplished, because references could end up being used in highly complex/CPU expensive ways. I suppose when I read the proposal, the though of something like :parent came to mind. Although if this is really only meant for label & input pairs, my suggestions above aren't useful. -Gavin
Received on Friday, 6 December 2013 12:33:12 UTC