W3C home > Mailing lists > Public > www-style@w3.org > April 2015

Re: CSS selector to better match label elements

From: Florian Rivoal <florian@rivoal.net>
Date: Thu, 30 Apr 2015 11:06:59 +0200
Cc: Manuel Strehl <svg@manuel-strehl.de>, www-style@w3.org
Message-Id: <66101CAD-87B0-4D25-ADF6-5BC7B4E3393D@rivoal.net>
To: Henrik Andersson <henke@henke37.cjb.net>

> On 30 Apr 2015, at 09:21, Henrik Andersson <henke@henke37.cjb.net> wrote:
> There was an idea to introduce the exclamation mark in selectors as a
> way to specify the subject. It was ultimately rejected . It would have
> been of some help in this situation, since it let you use the /for/
> syntax to select the label instead of the input.
> I will leave it to more experienced people with better memory to explain
> why it was rejected.

There's been a syntactical change. "!foo > bar { fizz: buzz; }" has been
replaced with "foo:has(> bar) { fizz: buzz; }".

However, :has is *not* part of the so called dynamic profile (aka fast
profile) of selectors. This means that while its meaning is defined, it
is not available for use in stylesheets, because it cannot be implemented
in a way that is fast enough in the general case. Selectors used in
stylesheets need to be fast, as they all have to be re-matched against
the DOM every time it changes.

Instead, :has is only available in contexts where selectors are run once,
such as the javascript query() method.

Finally, the /for/ syntax isn't defined yet, but even it if was, as far
as I can tell, it primarily is useful in combination with :has(), since
the inverse of /for/ relationship is most often what you need. The reason
for that is that a form control can have many different states that you may
want to depend on to style the label, but the label doesn't have many
different states. It has :active and :hover, and these already propagate
to the form control anyway, so you can directly use "input:hover" and
and style the input when the label is hovered. This means that the most
typical way you'd want to use /for/ is something like this:

  label:has(/for/ :invalid)) { border-color: red; }

But even if we had /for/, you can't use that in style sheets because you
would need :has(), which can't. The :for() proposal gets you that, is more
readable, and can be included in the dynamic profile:

  label:for(:invalid) { border-color: red; }

 - Florian
Received on Thursday, 30 April 2015 09:07:24 UTC

This archive was generated by hypermail 2.4.0 : Friday, 17 January 2020 22:52:09 UTC