Skip to content

Commit df214d1

Browse files
committed
[css-nesting-1] Define that declarations have to come before nested rules.
1 parent 20ff396 commit df214d1

File tree

1 file changed

+74
-67
lines changed

1 file changed

+74
-67
lines changed

css-nesting-1/Overview.bs

+74-67
Original file line numberDiff line numberDiff line change
@@ -561,94 +561,101 @@ Nesting Conditional Rules {#conditionals}
561561
Mixing Nesting Rules and Declarations {#mixing}
562562
-----------------------------------------------
563563

564-
A style rule can have any number of <a>nested style rules</a> inside of it,
565-
of either type,
566-
intermixed with any number of declarations,
567-
in any order.
564+
A style rule can have any number of declarations inside of it,
565+
followed by any number of rules.
566+
Declarations occuring <em>after</em> a nested rule
567+
are invalid.
568568

569-
The relative ordering of <a>nested style rules</a>, <a>nested conditional rules</a> and
570-
other declarations <strong>is</strong> important;
571-
it's possible for a given style rule and a <a>nested style rule</a> within it to match the same element,
572-
and if the specificity of the two rules is otherwise equivalent,
573-
the relative order in the stylesheet of the applicable declarations
574-
determines which declaration "wins" the <a>cascade</a>.
575-
576-
<div class="example">
577-
For example, consider the following where the specificity is the same and the
578-
cascade is used for value resolution:
569+
<div class=example>
570+
For example,
571+
in the following code:
579572

580-
<pre class="lang-css">
573+
<pre highlight=css>
581574
article {
582-
& .blue { color: blue; } /* (0,1,1) */
583-
& .red { color: red; } /* (0,1,1) */
575+
color: green;
576+
& { color: blue; }
577+
color: red;
584578
}
585-
586-
/* equivalent to
587-
article .blue { color: blue; }
588-
article .red { color: red; }
589-
*/
590-
</pre>
591-
592-
<pre class="lang-html">
593-
&#60;article&#62;
594-
&#60;div class="red blue"&#62;&#60;/div&#62;
595-
&#60;/article&#62;
596-
597-
&#60;!-- div text color is red --&#62;
598579
</pre>
599580

600-
The specificity of ''article .blue'' and ''article .red'' is (0,1,1).
581+
The ''color: red'' declaration is invalid and ignored,
582+
since it occurs after the [=nested style rule=].
601583

602-
Now consider this follow up which adds an ID selector:
584+
However, further nested rules are still valid,
585+
as in this example:
603586

604-
<pre class="lang-css">
587+
<pre highlight=css>
605588
article {
606-
& .blue, & #gotcha { color: blue; } /* (1,1,1) */
607-
& .red { color: red; } /* (0,1,1) */
589+
color: green;
590+
& { color: blue; }
591+
color: red;
592+
&.foo { color: yellow; } /* valid! */
608593
}
609-
610-
/* equivalent to
611-
article :is(.blue, #gotcha) { color: blue; }
612-
article .red { color: red; }
613-
*/
614594
</pre>
595+
</div>
615596

616-
<pre class="lang-html">
617-
&#60;article&#62;
618-
&#60;div class="red blue"&#62;&#60;/div&#62;
619-
&#60;/article&#62;
597+
The relative ordering of <a>nested style rules</a> and <a>nested conditional rules</a>
598+
<strong>is</strong> important;
599+
it's possible for a given style rule and a <a>nested style rule</a> within it to match the same element,
600+
and if the specificity of the two rules is otherwise equivalent,
601+
the relative order in the stylesheet of the applicable declarations
602+
determines which declaration "wins" the <a>cascade</a>.
603+
For this purpose,
604+
a nested rule is considered to come <em>after</em> its parent rule.
620605

621-
&#60;!-- div text color is blue --&#62;
622-
</pre>
606+
<div class="example">
607+
For example, consider the following where the specificity is the same and the
608+
cascade is used for value resolution:
623609

624-
''article :is(.blue, #gotcha)'' now has a specificity score of (1,1,1).
625-
Nesting uses '':is()'' which assumes the specificity of it's highest selector.
610+
<xmp class="lang-css">
611+
article {
612+
& .blue { color: blue; } /* (0,1,1) */
613+
& .red { color: red; } /* (0,1,1) */
614+
}
626615

616+
/* equivalent to
617+
article .blue { color: blue; }
618+
article .red { color: red; }
619+
*/
620+
</xmp>
627621

628-
To work around it, the following could be written instead:
622+
<xmp class="lang-html">
623+
<article>
624+
<div class="red blue"></div>
625+
</article>
629626

630-
<pre class="lang-css">
631-
article {
632-
& .blue { color: blue; } /* (0,1,1) */
633-
& .red { color: red; } /* (0,1,1) */
634-
& #gotcha { color: blue; } /* (1,0,1) */
635-
}
627+
<!-- div text color is red -->
628+
</xmp>
636629

637-
/* equivalent to
638-
article .blue { color: blue; }
639-
article .red { color: red; }
640-
article #gotcha { color: blue; }
641-
*/
642-
</pre>
630+
The specificity of ''article .blue'' and ''article .red'' are both (0,1,1).
631+
</div>
643632

644-
<pre class="lang-html">
645-
&#60;article&#62;
646-
&#60;div class="red blue"&#62;&#60;/div&#62;
647-
&#60;/article&#62;
633+
<div>
634+
In this example:
648635

649-
&#60;!-- div text color is red --&#62;
650-
</pre>
636+
<xmp highlight=css>
637+
article {
638+
color: blue;
639+
& { color: red; }
640+
}
641+
</xmp>
642+
643+
Both declarations have the same specificity (0,0,1),
644+
but the nested rule is considered to come <em>after</em> its parent rule,
645+
so the ''color: red'' declarations wins.
646+
647+
On the other hand, in this example:
648+
649+
<xmp highlight=css>
650+
article {
651+
color: blue;
652+
:where(&) { color: red; }
653+
}
654+
</xmp>
651655

656+
The '':where()'' pseudoclass reduces the specificity of the [=nesting selector=] to 0,
657+
so the ''color: red'' declaration now has a specificity of (0,0,0),
658+
and loses to the ''color: blue'' declaration.
652659
</div>
653660

654661

0 commit comments

Comments
 (0)