W3C home > Mailing lists > Public > www-style@w3.org > January 2000

Re: target-attr() and /reference combinator/ proposals

From: Ian Hickson <py8ieh@bath.ac.uk>
Date: Mon, 24 Jan 2000 23:13:08 +0000 (GMT)
To: Sjoerd Visscher <sjoerd@heeten.nl>
cc: www-style <www-style@w3.org>
Message-ID: <Pine.GSO.4.04.10001242248380.28883-100000@mary.bath.ac.uk>
On Mon, 24 Jan 2000, Sjoerd Visscher wrote:

>    C A /attr/ B
> would match an element B that is pointed to by an element A, and A
> has an ancestor C.

Right.

>    C (A /attr/ B)
>    A /attr/ (C B)
> would match an element B that is pointed to by an element A,
> and B has an ancestor C.

Ooh. Nasty. I hadn't even remotely thought of that!

Yeah, it would seem that we need scoping rules for that selector. (Or
not. See below.)


>    A:: /attr/ (C B)
>    A:matches(/attr/ (C B))
> would match an element A that points to an element B, and B has an
> ancestor C.

Yup, with scoping again.


>    (C:: A) /attr/ B
>    C:matches(A) /attr/ B
> would match an element B that is pointed to by an element C, and C
> has an descendant A.

Yup.


>    (C:: A):: /attr/ B
>    (C:: /attr/ B):: A
>    C:matches(A):matches(/attr/ B)
>    C:matches(/attr/ B):matches(A)
> would match an element C that points to an element B, and C has an
> descendant A. (Here :matches() wins in clarity!)

Yup. (And yup!)


>    C:: A /attr/ B
>    C:matches(A /attr/ B)
> would match an element B that is pointed to by an element A, and A
> has an ancestor C.

No, it would match an element C that has a descendant A that points to
an element B.


> And indeed, :matches() is clearer than ::

Yes... Scoping looks rather useful, too.

I think for 'simple' cases :matches() is better than :: (or :select),
in particular because it copes with many more cases without explicit
scoping. For more complex cases, scoping is needed:

   A:matches(/attr/ (C B))
   C (A /attr/ B)
   A /attr/ (C B)
   A /attr/ (C /attr/ B)

...or the equivalent of :matches() but starting at the document root,
as in (equivalents to the previous four examples):

   A:matches(/attr/ B:matched(C))
   C B:matched(A /attr/)
   A /attr/ B:matched(C)
   A /attr/ B:matched(C /attr/)

Hmm. I like it. :-)


> although I still think pseudo-elements should be different from
> pseudo-classes, mainly becuase pseudo-elements can appear only once
> in a selector.

Right. (Lest anyone is confused, :matches() is a pseudo-CLASS. The
discussion here is about making pseudo-elements like :before be more
distinct from pseudo-classes. See [1]).


> In fact, pseudo-elements have nothing to do with selecting, it's
> about creating. I would like to see something like:
> 
> selector {
>   color: green;
>   @pseudo-element before {
>     content: "[";
>   }
>   @pseudo-element after {
>     content: "]";
>   }
> }
> 
> That's also because different pseudo-elements will be used together
> with the same selector at the same time. (often both 'before' and
> 'after' will be used f.e.)

Interesting, but I think it's probably too late to change the syntax
that radically. The above cuts deep into how pseudo-elements are
treated, and there are already working implementations that have had
bugs wrung out of them, e.g. Mozilla.

============
[1]: From a proposal I'm writing [2]:

  WHY :SELECTED IS A BAD THING AND WE SHOULD SEPARATE PSEUDO CLASSES
  FROM PSEUDO ELEMENTS

    What is :selected ? Is it a pseudo-class or pseudo-element?

    The answer is 'neither'. It is an entirely new type of selector
    which simply changes the subject of the selector chain. Thus it is
    inconsistent with the rest of the selectors draft. (I propose that
    we use :matches() instead. See footnote [A] below.)
    
    Secondly, what is :-foo-bar ? Is it a pseudo-class or
    pseudo-element? The "-foo-" prefix is a mechanism designed by the
    working group to flag extensions in a forward-compatible way.
    However, implementations with 'open-ended' engines have no way of
    knowing which it is supposed to be, pseudo-class or -element, and
    thus have no easy way of dealing with them internally.

    Thus I propose that pseudo-elements be changed to use the ::
    prefix instead, as I have used above.

      ::before

    ...and so forth. This will also hopefully make people think more
    carefully about whether something is a pseudo-class or -element,
    and they may even realise that things like :selected are neither
    one nor the other...

[2] http://www.bath.ac.uk/%7Epy8ieh/internet/wwwstyle/selectors.txt

-- 
Ian Hickson                            ("`-''-/").___..--''"`-._   
http://www.bath.ac.uk/%7Epy8ieh/        `6_ 6  )   `-.  (     ).`-.__.`)
                                        (_Y_.)'  ._   )  `._ `. ``-..-' fL
Member, Mozilla Quality Assurance     _..`--'_..-_/  /--'_.' ,'
Browser Standards Compliance Team    (il).-''  (li).'  ((!.-'    
Received on Monday, 24 January 2000 18:13:12 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Monday, 27 April 2009 13:54:03 GMT