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

Re: [Bulk] @with -- DRY syntax for nesting selectors

From: Marat Tanalin | tanalin.com <mtanalin@yandex.ru>
Date: Mon, 09 Jan 2012 20:59:33 +0400
To: François REMY <fremycompany_pub@yahoo.fr>
Cc: www-style@w3.org
Message-Id: <204511326128373@web107.yandex.ru>
> -----Message d'origine-----
> From: Marat Tanalin | tanalin.com
> Sent: Monday, January 09, 2012 2:29 PM
> To: www-style@w3.org
> Subject: [Bulk] @with -- DRY syntax for nesting selectors
>
> One of features most demanded by web developers is grouping/nesting
> selectors DRY way.
>
> Current CSS syntax is far from being DRY since it forces web developers to
> inevitably repeat themselves again and again and again by repeating same
> parts of selectors multiple times.
>
> I propose following convenient syntax:
>
>     @with (selectors) {
>         rules and @with's
>     }
>
> where:
>     * selectors means a selector or multiple comma-separated selectors;
>     * rules are CSS rules;
>     * @with's are nested @with at-rules.
>
> Let's consider following example CSS code:
>
>     #example .foo .bar {background: #ccc; }
>
>     #example .foo .bar > DIV,
>     #example .foo .bar > P {color: #00f; }
>
>     #example .foo .bar > DIV > A,
>     #example .foo .bar > DIV > STRONG {font-style: italic; }
>
>     #example .foo .bar > DIV SPAN {color: #a00; }
>
> With the proposed syntax, the code would get more DRY, compact, readable,
> and eventually much more maintainable:
>
>     @with (#example .foo .bar) {
>         :this {background: #ccc; }
>
>         :this > DIV,
>         :this > P {color: #00f; }
>
>         @with (:this > DIV) {
>             :this > A,
>             :this > STRONG {font-style: italic; }
>
>             SPAN {color: #a00; }
>         }
>     }
>
> As you can see, :this pseudoclass points to selector of immediate containing
> @with and is used to attach declarations to @with selector itself as well as
> to use in conjunction with child combinator (>). Descendant selectors do not
> need for :this since they are automatically resolved in context of subject
> selectors of their corresponding @with.
>
> We actually could use even more DRY/compact syntax where :this is implied:
>
>     @with (#example .foo .bar) {
>         {background: #ccc; }
>
>>  DIV,
>>  P {color: #00f; }
>
>         @with (:this > DIV) {
>
>>  A,
>>  STRONG {font-style: italic; }
>
>             SPAN {color: #a00; }
>         }
>     }
>
> It'd perfectly OK for me, but is not as critical (though would be desirable
> anyway) as conceptual ability to prevent repeating selectors as such.
>
> Compared with existing nonstandard solutions like LESS or SASS, the syntax
> proposed above avoids mixing declarations (property/value pairs) and rules
> on same nesting level (such mixing is generally a bad idea, and this is
> implicitly proved out, for example, by the fact that we don't have this in
> CSS standard so far).
>
> Thanks.

09.01.2012, 20:06, "François REMY" <fremycompany_pub@yahoo.fr>:
> This is rougly what was known as "scoped styles". I don't know where we are
> with this at the moment, however. The idea was to modify the root of the
> tree.
>
> @scope (.message) {
>     :root { ... }
>     .text { ...}
>     button { ... }
> }

Thanks, it's good in general that similar syntax has crossed one's mind too.

However, for me, redefining ':root' pseudoclass depending on specific scope is not a quite good idea from perspectives of both potential confusions and backward incompatibility.

I think ':root' should always consistently point to root element of document (e.g. <html> for HTML documents). Furthermore, in JS querySelector()/querySelectorAll() methods, ':root' already means root of document and thus cannot be redefined in spec without breaking backward compatibility.

On the contrary, scope-level nature of ':this' pseudoclass is very intuitive and logical and is free from such issues.

In turn, using '@scope' as name for the selector-grouping at-rule seems to be undesirable since it could result in confusion/conflicts between HTML5 scopes defined with 'scope' attribute and CSS scopes defined with at-rule.

So '@with' name appears to be more intuitive and straightforward.
Received on Monday, 9 January 2012 17:02:38 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 17:20:48 GMT