- From: Tab Atkins Jr. <jackalmage@gmail.com>
- Date: Tue, 25 Nov 2014 14:13:09 -0800
- To: Benjamin Poulain <benjamin@webkit.org>
- Cc: www-style list <www-style@w3.org>
On Tue, Nov 25, 2014 at 1:37 PM, Benjamin Poulain <benjamin@webkit.org> wrote: > My 2 cents, not sure if that helps: > > My own mental model for pseudo element is not one of a combinator that goes > into some kind hidden element. > > The way I use pseudo-elements is as a "generator", to create fake styling > elements where there is none. For example, if I use: > :matches(::first-line, ::before) { ... } > I think of it as if the engine generates elements for the first-line and > something before the current element. It generates *and switches the currently-matched element* to the pseudo-element. That second part is the definition of a combinator - it's identical to the child combinator, for example. It just happens to have the extra magic that it creates the elements for you, rather than them pre-existing in the tree. In other words, if you ignore pseudo-elements, then the set of matched elements after processing a :matches() selector is ALWAYS a subset of the matched elements before processing. Pseudo-elements change this behavior. > In my mind, the way it works with :matches() is as if the rules were > expanded and the pseudo-elements were moved to the end. > For example: > :matches(a, b):matches(*, ::before, ::after) > ->*:matches(a, b), :matches(a, b)::before, :matches(a, b)::after > ->a, b, a::before, b::before, a::after, b::after. This isn't great; it means you can't then continue after the pseudo-element. For example, the spec currently allows `a::before:hover` which matches when the <a>'s ::before pseudo-element is hovered. (I don't think this has been implemented yet by anyone.) The way :matches() works, it *should* be possible to wrap :matches() around any individual simple selector and maintain exactly the same semantics, so `a:matches(::before):hover` should work the exact same way as the previous selector. If you assume that pseudo-elements only ever exist at the end of a selector, like the spec used to require, this isn't as much of a problem. ~TJ
Received on Tuesday, 25 November 2014 22:13:57 UTC