- From: Marat Tanalin | tanalin.com <mtanalin@yandex.ru>
- Date: Tue, 10 Jan 2012 02:24:02 +0400
- To: Tab Atkins Jr. <jackalmage@gmail.com>
- Cc: www-style@w3.org
09.01.2012, 21:46, "Tab Atkins Jr." <jackalmage@gmail.com>:
> On Mon, Jan 9, 2012 at 5:29 AM, Marat Tanalin | tanalin.com
> <mtanalin@yandex.ru> wrote:
>
>> 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.
>
> I've been procrastinating about bringing it up on the list, but Shane
> Stephens and I wrote up a document for this as well, based on the
> proposal we floated during the Tokyo f2f:
> <http://dev.w3.org/csswg/css3-hierarchies/>
>
> This is slightly simpler. There's no need to alter existing code in
> our proposal; rules just nest inside of rules. To make the parsing
> unambiguous, the nesting selector (represented in our proposal as "&")
> must be at the start of the nested selectors.
>
> So, for example, your example:
>
> @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; }
> }
> }
>
> ...would be written in our proposal as:
>
> #example .foo .bar {
> background: #ccc;
> & > div, & > p { color: #00f; }
> & > div {
> & > a, & > strong { font-style: italic; }
> & span { color: #a00; }
> }
> }
>
> The advantage of our proposal is that it's more compact and less
> visually intrusive than using an at-rule. The major downside is that
> the nesting selector has to come at the front of the nested selectors
> to avoid ambiguity (specifically, if you see something like "a:hover
> span { ... }", you can't tell whether you're looking at a selector or
> a property until you hit the "{"). Using some explicit indicator of
> nesting like an at-rule would remove the possibility of ambiguity,
That's why I think mixing declarations with selectors is not too good idea.
> and
> allow us the more powerful construct of placing the nesting selector
> *anywhere* in the selector.
>
> For example, you could use this to apply some default styles for an
> element, and then tweak some of them when the element was nested
> inside of a particular element:
>
> #example .foo .bar {
> color: blue;
> @nest .baz & {
> text-decoration: underline;
> }
> }
>
> ~TJ
Sounds interesting, though looks not quite readable and DRY. We are forced to always add redundant '&' (this could be very annoying in practice) even if all rules are without leading combinators and could be expressed without :this using my proposed syntax.
BTW, @with/:this could be used with the same result as @nest/& from your example:
@with (#example .foo .bar) {
:this {color: blue; }
@with (.baz :this) {
:this {text-decoration: underline; }
}
}
or with implicit :this:
@with (#example .foo .bar) {
{color: blue; }
@with (.baz :this) {
{text-decoration: underline; }
}
}
Received on Monday, 9 January 2012 22:37:24 UTC