Mon, 10 Sep 2012 13:22:43 -0700
[css3-conditional] fix broken links
1 <!DOCTYPE html public '-//W3C//DTD HTML 4.01//EN'
2 'http://www.w3.org/TR/html4/strict.dtd'>
3 <html lang="en">
4 <head profile="http://www.w3.org/2006/03/hcard">
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
6 <title>CSS Conditional Rules Module Level 3</title>
7 <link rel="stylesheet" type="text/css" href="../default.css">
8 <link rel="stylesheet" type="text/css"
9 href="http://www.w3.org/StyleSheets/TR/W3C-[STATUS].css">
10 </head>
12 <div class="head">
13 <!--logo-->
15 <h1>CSS Conditional Rules Module Level 3</h1>
17 <h2 class="no-num no-toc">[LONGSTATUS] [DATE]</h2>
18 <dl>
19 <dt>This version:
20 <dd><a href="[VERSION]">
21 http://www.w3.org/TR/[YEAR]/WD-css3-conditional-[CDATE]/</a>
23 <dt>Latest version:
24 <dd><a href="http://www.w3.org/TR/[SHORTNAME]/">http://www.w3.org/TR/[SHORTNAME]/</a>
26 <dt>Editor's draft:
27 <dd><a href="http://dev.w3.org/csswg/[SHORTNAME]/">http://dev.w3.org/csswg/[SHORTNAME]/</a>
29 <dt>Previous version:
30 <dd><a href="http://www.w3.org/TR/2011/WD-css3-conditional-20110901/">http://www.w3.org/TR/2011/WD-css3-conditional-20110901/</a></dd>
32 <dt>Editors:
33 <dd class=vcard><a class=fn href="http://dbaron.org/">L. David Baron</a>,
34 <a class=org href="http://www.mozilla.org/">Mozilla</a>
36 <dt>Issues list:
37 <dd>Maintained in document (only editor's draft is current)
39 <dt>Feedback:
41 <dd><a
42 href="http://lists.w3.org/Archives/Public/www-style/">www-style@w3.org</a>
43 with subject line “<kbd>[css3-conditional] <var>… message topic
44 …</var></kbd>”
46 <dt>Test suite:
47 <dd><a href="https://test.csswg.org/shepherd/search/spec/css3-conditional/">submitted tests</a>; no built test suite yet
49 </dl>
51 <!--copyright-->
53 <hr title="Separator for header">
54 </div>
56 <h2 class="no-num no-toc" id="abstract">Abstract</h2>
58 <p>CSS is a language for describing the rendering of structured documents
59 (such as HTML and XML) on screen, on paper, in speech, etc. This module
60 contains the features of CSS for conditional processing of parts of
61 style sheets, conditioned on capabilities of the processor or the
62 document the style sheet is being applied to.
63 It includes and extends the functionality of CSS level 2 [[!CSS21]],
64 which builds on CSS level 1 [[CSS1]].
65 The main extensions compared to level 2 are
66 allowing nesting of certain at-rules inside '@media',
67 the addition of the '@supports' and '@document'
68 rules for conditional processing.
70 <h2 class="no-num no-toc" id="status">Status of this document</h2>
72 <!--status-->
74 <p>The following features are at risk:
75 <ul>
76 <li>The inclusion of '@font-face' rules and
77 '@keyframes' rules as allowed within all of the @-rules in
78 this specification is at risk, though only because of the relative
79 rates of advancement of specifications. If this specification is able
80 to advance faster than one or both of the specifications defining
81 those rules, then the inclusion of those rules will move from this
82 specification to the specification defining those rules.</li>
84 <li>The addition of support for @-rules inside of conditional grouping
85 rules is at risk; if interoperable implementations are not found, it
86 may be removed to advance the other features in this specification to
87 Proposed Recommendation.</li>
89 <li>The '@supports' rule is at risk; if interoperable
90 implementations are not found, it may be removed to advance the other
91 features in this specification to Proposed Recommendation.</li>
93 <li>The '@document' rule is at risk; if interoperable
94 implementations are not found, it may be removed to advance the other
95 features in this specification to Proposed Recommendation.</li>
97 </ul>
99 <h2 class="no-num no-toc" id="contents">Table of contents</h2>
101 <!--toc-->
103 <h2 id="introduction">Introduction</h2>
105 <h3 id="context">Background</h3>
107 <p><em>This section is not normative.</em>
109 <p>[[!CSS21]] defines one type of conditional group rule, the
110 '@media' rule, and allows only rulesets (not other @-rules)
111 inside of it. The '@media' rule provides the ability to
112 have media-specific style sheets, which is also provided by style
113 sheet linking features such as '@import' and
114 <code class="html"><link></code>. The restrictions on the contents of
115 '@media' rules made them less useful; they have forced authors
116 using CSS features involving @-rules in media-specific style sheets to
117 use separate style sheets for each medium.</p>
119 <p>This specification extends the rules for the contents of
120 conditional group rules to allow other @-rules, which enables authors
121 to combine CSS features involving @-rules with media specific style
122 sheets within a single style sheet.</p>
124 <p>This specification also defines additional types of conditional
125 group rules, '@supports' and '@document', to
126 address author and user requirements.</p>
128 <p>The '@supports' rule allows CSS to be conditioned on
129 implementation support for CSS properties and values. This rule makes
130 it much easier for authors to use new CSS features and provide good
131 fallback for implementations that do not support those features. This
132 is particularly important for CSS features that provide new layout
133 mechanisms, and for other cases where a set of related styles needs to
134 be conditioned on property support.</p>
136 <p>The '@document' rule allows CSS to be conditioned on the
137 page to which the style sheet is being applied. This allows users to
138 apply styles to a particular page or group of pages, which greatly
139 increases the power of user style sheets.</p>
141 <h3 id="placement">Module Interactions</h3>
143 <p>This module replaces and extends the '@media' rule
144 feature defined in [[!CSS21]] section <var>7.2.1</var> and
145 incorporates the modifications previously made non-normatively by
146 [[!MEDIAQ]] section <var>1</var>.</p>
148 <p>Its current definition depends on @-rules defined in [[!CSS3-FONTS]]
149 and [[!CSS3-ANIMATIONS]], but that dependency is only on the
150 assumption that those modules will advance ahead of this one. If this
151 module advances faster, then the dependency will be reversed.</p>
153 <h3 id="conventions">Document Conventions</h3>
155 <p>Conformance requirements are expressed with a combination of
156 descriptive assertions and RFC 2119 terminology. The key words “MUST”,
157 “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”,
158 “RECOMMENDED”, “MAY”, and “OPTIONAL” in the normative parts of this
159 document are to be interpreted as described in RFC 2119.
160 However, for readability, these words do not appear in all uppercase
161 letters in this specification.
163 <p>All of the text of this specification is normative except sections
164 explicitly marked as non-normative, examples, and notes. [[!RFC2119]]</p>
166 <p>Examples in this specification are introduced with the words “for example”
167 or are set apart from the normative text with
168 <code class="html">class="example"</code>, like this:
170 <div class="example">
171 <p>This is an example of an informative example.</p>
172 </div>
174 <p>Informative notes begin with the word “Note” and are set apart from the
175 normative text with <code class="html">class="note"</code>, like this:
177 <p class="note">Note, this is an informative note.</p>
179 <h2 id="processing">Processing of conditional group rules</h2>
181 <p>This specification defines some CSS @-rules, called <dfn>conditional
182 group rules</dfn>, that associate a condition with a group of other
183 CSS rules. These different rules allow testing different types of
184 conditions, but share common behavior for how their contents are used
185 when the condition is true and when the condition is false.</p>
187 <div class="example">
188 <p>For example, this rule:</p>
189 <pre>@media print {
190 #navigation { display: none }
191 }</pre>
192 <p>causes a particular CSS rule (making elements with ID "navigation" be
193 display:none) apply only when the style sheet is used for a print
194 medium. Likewise, this CSS rule:</p>
195 <pre>@document url("http://www.example.com/") {
196 #example1 { display: none }
197 }</pre>
198 <p>does the same type of conditional application, but using a different
199 condition: whether the style sheet is being applied to the page
200 <code>http://www.example.com/</code>.</p>
201 </div>
203 <p>Each conditional group rule has a condition, which at any time
204 evaluates to true or false. When the condition is true, CSS processors
205 <strong>must</strong> apply the rules inside the group rule as though
206 they were at the group rule's location; when the condition is false, CSS
207 processors <strong>must not</strong> apply any of rules inside the group
208 rule. The current state of the condition does not affect the CSS object
209 model, in which the contents of the group rule always remain within the
210 group rule.</p>
212 <p>This means that when multiple conditional group rules are nested,
213 a rule inside of both of them applies only when all of the rules'
214 conditions are true.</p>
216 <div class="example">For example, with this set of nested rules:
217 <pre>@media print { // rule (1)
218 #navigation { display: none }
219 @media (max-width: 12cm) { // rule (2)
220 .note { float: none }
221 }
222 }</pre>
223 the condition of the rule marked (1) is true for print media, and the
224 condition of the rule marked (2) is true when the width of the display
225 area (which for print media is the page box) is less than or equal to
226 12cm. Thus the rule ''#navigation { display: none }'' applies
227 whenever this style sheet is applied to print media, and the rule
228 ''.note { float: none }'' is applied only when the style sheet
229 is applied to print media <em>and</em> the width of the page box is less
230 than or equal to 12 centimeters.</div>
232 <p>When the condition for a conditional group rule changes, CSS
233 processors <strong>must</strong> reflect that the rules now apply or no
234 longer apply, except for properties whose definitions define effects of
235 computed values that persist past the lifetime of that value (such as
236 for some properties in [[CSS3-TRANSITIONS]] and
237 [[!CSS3-ANIMATIONS]]).</p>
239 <h2 id="contents-of">Contents of conditional group rules</h2>
241 <p class="issue">There is also likely demand for using these
242 conditions with '@import'. We should see if we can
243 come up with sensible syntax for that, perhaps functional notation
244 at the end of the '@import' rule.</p>
246 <p>The syntax of each conditional group rule consists of some syntax
247 specific to the type of rule followed by a <dfn>group rule body</dfn>,
248 which is a block (pair of braces) containing a sequence of rules.</p>
250 <p>A group rule body is allowed to contain rulesets and any @-rules that
251 are allowed at the top level of a style sheet before and after a
252 ruleset. This means that @-rules that must occur at the beginning of
253 the style sheet (such as '@charset', '@import',
254 and '@namespace' rules) are not allowed inside of conditional group
255 rules. Conditional group rules can be nested.</p>
257 <p>In terms of the grammar, this specification defines the following
258 productions for use in the grammar of conditional group rules:</p>
260 <pre>nested_statement
261 : ruleset | media | page | font_face_rule | keyframes_rule |
262 supports_rule | document_rule
263 ;
265 group_rule_body
266 : '{' S* nested_statement* '}' S*
267 ;</pre>
268 <p>
269 in which all the productions are defined in that grammar with the
270 exception of <code>font_face_rule</code> <span class="issue">not</span>
271 defined in [[!CSS3-FONTS]], <code>keyframes_rule</code> defined in
272 [[!CSS3-ANIMATIONS]], and <code>media</code>, <code>supports_rule</code>
273 and <code>document_rule</code> defined in this specification.</p>
275 <p>In general, future CSS specifications that add new @-rules that are
276 not forbidden to occur after some other types of rules should modify
277 this <code>nested_statement</code> production to keep the grammar
278 accurate.</p>
280 <p>Style sheets <strong>must not</strong> use rules other than the allowed ones inside
281 conditional group rules.</p>
283 <p>CSS processors <strong>must</strong> ignore rules that are not
284 allowed within a group rule, and <strong>must</strong> handle invalid
285 rules inside of group rules as described in <a
286 href="http://www.w3.org/TR/CSS21/syndata.html#parsing-errors">section
287 4.2 (Rules for handling parsing errors)</a>, <a
288 href="http://www.w3.org/TR/CSS21/syndata.html#at-rules">section 4.1.5
289 (At-rules)</a>, and <a
290 href="http://www.w3.org/TR/CSS21/syndata.html#rule-sets">section 4.1.7
291 (Rule sets, declaration blocks, and selectors)</a> of [[!CSS21]].</p>
293 <h2 id="use">Placement of conditional group rules</h2>
295 <p>Conditional group rules are allowed at the top-level of a style
296 sheet, and inside other conditional group rules. CSS processors
297 <strong>must</strong> process such rules as <a
298 href="#processing">described above</a>.</p>
300 <p>Any rules that are not allowed after a ruleset (e.g., ''@charset'',
301 ''@import'', or ''@namespace'' rules) are also not allowed after a
302 conditional group rule. Therefore, style sheets <strong>must
303 not</strong> place such rules after a conditional group rules, and CSS
304 processors <strong>must</strong> ignore such rules.</p>
306 <h2 id="at-media">Media-specific style sheets: the '@media' rule</h2>
308 <p>The <dfn>'@media' rule</dfn> is a conditional group rule whose
309 condition is a media query. It consists of the at-keyword
310 '@media' followed by a (possibly empty) media query (as
311 defined in [[!MEDIAQ]]), followed by a group rule body. The condition
312 of the rule is the result of the media query.</p>
314 <div class="example">
315 <p>This '@media' rule:</p>
316 <pre>@media print, (max-width: 600px) {
317 #extra_navigation { display: none }
318 }</pre>
319 <p>has the condition ''print, (max-width: 600px)'', which is
320 true for print media and for devices whose width is at most 600px. When
321 either of these is true, the condition of the rule is true, and the rule
322 ''#extra_navigation { display: none }'' is applied.
323 </div>
325 <p>In terms of the grammar, this specification extends the
326 <code>media</code> production in the
327 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
328 ([[!CSS21]], Appendix G) into:
329 <pre>media
330 : MEDIA_SYM S* media_query_list group_rule_body
331 ;</pre>
332 <p>where the <code>group_rule_body</code> production is defined in this
333 specification, the <code>media_query_list</code> production is defined
334 in [[!MEDIAQ]], and the others are defined in the <a
335 href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
336 ([[!CSS21]], Appendix G).
338 <h2 id="at-supports">Feature queries: the '@supports' rule</h2>
340 <p>The <dfn>'@supports' rule</dfn> is a conditional group
341 rule whose condition tests whether the user agent supports CSS
342 property:value pairs. Authors can use it to write style sheets that use
343 new features when available but degrade gracefully when those features
344 are not supported. CSS has existing mechanisms for graceful
345 degradation, such as ignoring unsupported properties or values, but
346 these are not always sufficient when large groups of styles need to be
347 tied to the support for certain features, as is the case for use of new
348 layout system features.</p>
350 <p>The syntax of the condition in the '@supports' rule is
351 slightly more complicated than for the other conditional group rules
352 (though has some similarities to media queries) since:</p>
353 <ul>
354 <li>negation is needed so that the new-feature styles and the fallback
355 styles can be separated (within the forward-compatible grammar's rules
356 for the syntax of @-rules), and not required to override each other</li>
357 <li>conjunction (and) is needed so that multiple required features can
358 be tested</li>
359 <li>disjunction (or) is needed when there are multiple alternative
360 features for a set of styles, particularly when some of those
361 alternatives are vendor-prefixed properties or values</li>
362 </ul>
364 <p>Therefore, the syntax of the '@supports' rule allows
365 testing for property:value pairs, and arbitrary conjunctions (and),
366 disjunctions (or), and negations (not) of them.</p>
368 <p>This extends the lexical scanner in the
369 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
370 ([[!CSS21]], Appendix G) by adding:
371 <pre>@{S}{U}{P}{P}{O}{R}{T}{S} {return SUPPORTS_SYM;}</pre>
372 <p>and the grammar by adding</p>
373 <pre><dfn>supports_rule</dfn>
374 : SUPPORTS_SYM S+ supports_condition group_rule_body
375 ;
377 <dfn>supports_condition</dfn>
378 : supports_negation | supports_conjunction | supports_disjunction |
379 supports_condition_in_parens
380 ;
382 <dfn>supports_condition_in_parens</dfn>
383 : ( '(' S* supports_condition ')' S* ) | supports_declaration_condition
384 ;
386 <dfn>supports_negation</dfn>
387 : 'not' S* supports_condition_in_parens
388 ;
390 <dfn>supports_conjunction</dfn>
391 : supports_condition_in_parens ( 'and' S* supports_condition_in_parens )+
392 ;
394 <dfn>supports_disjunction</dfn>
395 : supports_condition_in_parens ( 'or' S* supports_condition_in_parens )+
396 ;
398 <dfn>supports_declaration_condition</dfn>
399 : '(' S* core_declaration ')' S*
400 ;</pre>
401 <p>in which <code>core_declaration</code> is the production
402 <code>declaration</code> in the core syntax of CSS defined in <a
403 href="http://www.w3.org/TR/CSS21/syndata.html#tokenization">section
404 4.1.1 (Tokenization)</a> of [[!CSS21]].</p>
406 <p>Any ''@supports'' rule that does not parse according to the grammar
407 above is invalid. Style sheets <strong>must not</strong> use such a
408 rule and processors <strong>must</strong> ignore such a rule.</p>
410 <p class="note">Note that this means that declarations that meet the
411 forward-compatible syntax for declarations are permitted (and support
412 for them is then tested by the ''@supports'' rule), but declarations
413 that do not meet the forward-compatible syntax for declarations cause
414 the entire ''@supports'' rule to be ignored.</p>
416 <p class="issue">Is any further allowance for forward-compatible parsing
417 needed, for example, to allow additional features (such as, say,
418 selector tests) to be added to the ''@supports'' rule? Or are these
419 forward-compatible parsing rules the best solution for such future
420 expansion anyway?</p>
422 <p>Each of these grammar terms is associated with a boolean result, as
423 follows:</p>
424 <dl>
425 <dt>supports_condition</dt>
426 <dd>
427 The result is the result of the single child term.
428 </dd>
430 <dt>supports_condition_in_parens</dt>
431 <dd>
432 The result is the result of the single <code>supports_condition</code>
433 or <code>supports_declaration_condition</code> child term.
434 </dd>
436 <dt>supports_negation</dt>
437 <dd>
438 The result is the <em>negation</em> of the result of the
439 <code>supports_condition_in_parens</code> child term.
440 </dd>
442 <dt>supports_conjunction</dt>
443 <dd>
444 The result is true if the result of <em>all</em> of the
445 <code>supports_condition_in_parens</code> child terms is true;
446 otherwise it is false.
447 </dd>
449 <dt>supports_disjunction</dt>
450 <dd>
451 The result is true if the result of <em>any</em> of the
452 <code>supports_condition_in_parens</code> child terms is true;
453 otherwise it is false.
454 </dd>
456 <dt>supports_declaration_condition</dt>
457 <dd>
458 The result is whether the CSS processor <a
459 href="#support-definition">supports</a> the declaration.
460 </dd>
461 </dl>
463 <p>The condition of the '@supports' rule is the result of the
464 <code>supports_condition</code> term that is a child of the
465 <code>supports_rule</code> term.</p>
467 <div class="example">
468 <p>For example, the following rule</p>
469 <pre>@supports ( display: flexbox ) {
470 body, #navigation, #content { display: flexbox; }
471 #navigation { background: blue; color: white; }
472 #article { background: white; color: black; }
473 }</pre>
474 <p>applies the rules inside the '@supports' rule only when
475 ''display: flexbox'' is supported.</p>
476 </div>
478 <div class="example">
479 <p>The following example shows an additional '@supports' rule that can
480 be used to provide an alternative for when ''display: flexbox'' is not
481 supported:</p>
482 <pre>@supports not ( display: flexbox ) {
483 body { width: 100%; height: 100%; background: white; color: black; }
484 #navigation { width: 25%; }
485 #article { width: 75%; }
486 }</pre>
487 <p>Note that the 'width' declarations may be harmful to the
488 flexbox-based layout, so it is important that they be present only in
489 the non-flexbox styles.</p>
490 </div>
492 <div class="example">
493 <p>The following example checks for support for the 'box-shadow'
494 property, including checking for support for vendor-prefixed versions of
495 it. When the support is present, it specifies both 'box-shadow' (with
496 the prefixed versions) and 'color' in a way what would cause the text to
497 become invisible were 'box-shadow' not supported.</p>
498 <pre>@supports ( box-shadow: 2px 2px 2px black ) or
499 ( -moz-box-shadow: 2px 2px 2px black ) or
500 ( -webkit-box-shadow: 2px 2px 2px black ) or
501 ( -o-box-shadow: 2px 2px 2px black ) {
502 .outline {
503 color: white;
504 -moz-box-shadow: 2px 2px 2px black;
505 -webkit-box-shadow: 2px 2px 2px black;
506 -o-box-shadow: 2px 2px 2px black;
507 box-shadow: 2px 2px 2px black; /* unprefixed last */
508 }
509 }</pre></div>
511 <p>To avoid confusion between ''and'' and ''or'', the syntax requires
512 that both ''and'' and ''or'' be specified explicitly (rather than, say,
513 using commas or spaces for one of them). Likewise, to avoid confusion
514 caused by precedence rules, the syntax does not allow ''and'', ''or'',
515 and ''not'' operators to be mixed without a layer of parentheses.</p>
517 <div class="example">
518 <p>For example, the following rule is not valid:
519 <pre class="illegal">@supports (transition-property: color) or
520 (animation-name: foo) and
521 (transform: rotate(10deg)) {
522 // ...
523 }</pre>
524 <p>Instead, authors must write one of the following:</p>
525 <pre>@supports ((transition-property: color) or
526 (animation-name: foo)) and
527 (transform: rotate(10deg)) {
528 // ...
529 }</pre>
530 <pre>@supports (transition-property: color) or
531 ((animation-name: foo) and
532 (transform: rotate(10deg))) {
533 // ...
534 }</pre>
535 </div>
537 <p>The declaration being tested must always occur within parentheses,
538 when it is the only thing in the expression.<p>
540 <div class="example">
541 <p>For example, the following rule is not valid:
542 <pre class="illegal">@supports display: flexbox {
543 // ...
544 }</pre>
545 <p>Instead, authors must write:</p>
546 <pre>@supports (display: flexbox) {
547 // ...
548 }</pre>
549 </div>
551 <p>The syntax allows extra parentheses when they are not needed. This
552 flexibility is sometimes useful for authors (for example, when
553 commenting out parts of an expression) and may also be useful for
554 authoring tools.</p>
556 <div class="example">
557 <p>For example, authors may write:</p>
558 <pre>@supports ((display: flexbox)) {
559 // ...
560 }</pre>
561 </div>
563 <p class="issue">Add an example involving <code>!important</code>.</p>
565 <h3 id="support-definition">Definition of support</h3>
567 <p>A CSS processor is considered to <dfn id="dfn-support">support</dfn>
568 a declaration (consisting of a property and value) if it implements the
569 given value of the given property.</p>
571 <h3 id="partial-implementations">Partial implementations</h3>
573 <p>For forward-compatibility, <a
574 href="http://www.w3.org/TR/CSS21/syndata.html#declaration">section 4.1.8
575 (Declarations and properties)</a> of [[!CSS21]] defines rules for
576 handling invalid properties and values. CSS processors that partially
577 implement a specification <strong>must</strong> treat any part of a
578 value that they:</p>
579 <ul>
580 <li>do not implement, or</li>
581 <li>do not have a usable level of support for,</li>
582 </ul>
583 <p>as invalid according to this rule
584 for handling invalid properties and values,
585 and <strong>must not</strong>
586 accept or support a declaration containing such a value. This allows
587 authors to use fallback (either in the [[CSS1]] sense of declarations
588 that are overridden by later declarations or with the new capabilities
589 provided by the ''@supports'' rule in this specification) that works
590 correctly for the features implemented. This applies especially to
591 compound values; implementations must implement all parts of the value
592 in order to consider the declaration supported, either inside a ruleset
593 or in the declaration condition of an ''@supports'' rule.</p>
595 <h2 id="at-document">Document queries: the '@document' rule</h2>
597 <p>The <dfn>'@document' rule</dfn> is a conditional group
598 rule whose condition depends on the
599 <a href="#url-of-doc">URL of the document being styled</a>.
600 This allows style sheets, particularly user style sheets, to have styles
601 that only apply to a set of pages rather than to all pages using the
602 style sheet.</p>
604 <p class="issue">Given that this @-rule is intended primarily for user
605 style sheets, what should this specification say about its use in author
606 style sheets? Should it be forbidden? Should use instead be
607 discouraged? Or should this specification remain neutral on the
608 topic, since there are valid uses in author style sheets?</p>
610 <p id="url-of-doc">The <dfn>URL of the document being styled</dfn> is
611 the URI at which the document is located, excluding any fragment
612 identifiers. (This means, for example, that HTTP redirects have been
613 followed.) If the styles are being applied inside a complete document
614 embedded into the presentation of another (e.g., [[HTML5]]'s <code
615 class="html">iframe</code>, <code class="html">object</code>, or <code
616 class="html">img</code> elements), the relevant URI is that of the
617 frame, not of its container. However, if content from other documents
618 is mixed in via mechanisms that mix content from one document into
619 another (e.g., [[SVG11]]'s <code>use</code> element), then the
620 address of the container document is used.</p>
622 <p class="note">Note: In [[HTML5]], this is the
623 <a href="http://dev.w3.org/html5/spec/dom.html#documents">document's address</a>
624 of a document in a
625 <a href="http://dev.w3.org/html5/spec/browsers.html#browsing-context">browsing context</a>.</p>
627 <div class="issue">What form of normalization is done on URLs and domains
628 before matching? In particular, this specification needs to describe:
629 <ul>
630 <li>what form is used for the <a href="#url-of-doc">URL of the document
631 being styled</a> (and what has been normalized in that form)</li>
632 <li>what normalization (if any) happens to the argument of each of the match
633 functions before the comparison that they describe and</li>
634 <li>whether the
635 comparison algorithm used is string comparison or some other URL
636 comparison algorithm.</li></ul></div>
638 <p>The '@document' rule's condition is written as a
639 comma-separated list of <dfn>URL matching functions</dfn>, and the
640 condition evaluates to true whenever any one of those functions
641 evaluates to true. The following URL matching functions are
642 permitted:</p>
644 <dl>
645 <dt><dfn id="url-exact" title="url()|URL matching functions::exact"><url></dfn></dt>
647 <dd>
648 <p>The 'url()' function is the <dfn>exact url matching
649 function</dfn>. It evaluates to true whenever the <a
650 href="#url-of-doc">URL of the document being styled</a> is exactly
651 the URL given.</p>
653 <p class="Note">The 'url()' function, since it is a core syntax
654 element in CSS, is allowed (subject to different character
655 limitations and thus escaping requirements) to contain an unquoted
656 value (in addition to the string values that are allowed as
657 arguments for all four functions).</p>
659 <div class="example">
660 <p>For example, this rule:</p>
661 <pre>@document url("http://www.w3.org/Style/CSS/") {
662 #summary { background: yellow; color: black}
663 }</pre>
664 <p>styles the <code class="html">summary</code> element on the page
665 <code>http://www.w3.org/Style/CSS/</code>, but not on any other
666 pages.</p>
667 </div>
668 </dd>
670 <dt><dfn id="url-prefix" title="url-prefix()|URL matching functions::prefix">url-prefix(<string>)</dfn></dt>
672 <dd>
673 <p>The 'url-prefix()' function is the <dfn>url prefix
674 matching function</dfn>. It evaluates to true whenever the
675 <a href="#url-of-doc">URL of the document being styled</a>
676 has the argument to the function as an
677 initial substring (which is true when the two strings are equal).
678 When the argument is the empty string, it evaluates to true for all
679 documents.</p>
680 <div class="example">
681 <p>For example, this rule:</p>
682 <pre>@document url-prefix("http://www.w3.org/Style/CSS/") {
683 #summary { background: yellow; color: black}
684 }</pre>
685 <p>styles the <code class="html">summary</code> element on the page
686 <code>http://www.w3.org/Style/CSS/</code> and on the page
687 <code>http://www.w3.org/Style/CSS/Test</code>, but it does not
688 affect the page <code>http://www.w3.org/</code> or the page
689 <code>http://www.example.com/Style/CSS/</code>.</p>
690 </div>
691 </dd>
693 <dt><dfn id="url-domain" title="domain()|URL matching functions::domain">domain(<string>)</dfn></dt>
695 <dd>
696 <p>The 'domain()' function is the <dfn>domain
697 matching function</dfn>. It evaluates to true whenever
698 the <a href="#url-of-doc">URL of the document being styled</a>
699 has a host subcomponent (as defined in [[!URI]])
700 and that host subcomponent is exactly the argument to the
701 'domain()' function or a final substring of the host
702 component is a period (U+002E) immediately followed by the argument
703 to the 'domain()' function.</p>
704 <div class="example">
705 <p>For example, this rule:</p>
706 <pre>@document domain("w3.org") {
707 body { font-size: 16px ! important }
708 }</pre>
709 <p>changes the font size of the body element for pages such as
710 <code>http://www.w3.org/Style/CSS/</code> and
711 <code>http://w3.org/Style/CSS/</code> and
712 <code>http://lists.w3.org/Archives/Public/www-style/</code>
713 but it does not affect the page
714 <code>http://www.example.com/Style/CSS/</code>.</p>
715 </div>
716 </dd>
718 <dt><dfn id="url-regexp" title="regexp()|URL matching functions::regular expression">regexp(<string>)</dfn></dt>
720 <dd>
721 <p>The contents of the <string> argument <strong>must</strong>
722 match the JavaScript <code>Pattern</code> production
723 ([[!ECMA-262-5.1]], section 15.10.1). However,
724 failing to do so is not a CSS syntax error and does not trigger any
725 error handling for CSS syntax errors.</p>
727 <p>The ''regexp()'' function evaluates to true whenever the string
728 argument compiled as a JavaScript regular expression with the
729 <code>global</code>, <code>ignoreCase</code> and
730 <code>multiline</code> flags <em>disabled</em>
731 (see [[!ECMA-262-5.1]], sections 15.10.7.2 through 15.10.7.4)
732 compiles successfully and the resulting regular expression matches
733 the entirety of the
734 <a href="#url-of-doc">URL of the document being styled</a>.</p>
736 <p class="note">Note that regular expression must match the entire
737 URL, not just a part of it.</p>
739 <p class="note">Note that this definition intentionally matches the
740 behavior of the <a
741 href="http://dev.w3.org/html5/spec/common-input-element-attributes.html#attr-input-pattern"><code class="html">pattern</code>
742 attribute</a> on the <code class="html">input</code> element
743 in [[HTML5]].</p>
745 <div class="example">
746 <p>For example, this rule:</p>
747 <pre>@document regexp("http://www.w3.org/TR/\\d{4}/[^/]*-CSS2-\\d{8}/") {
748 body { font-size: 20px ! important }
749 }</pre>
750 <p>changes the font size of the body element for pages such as
751 <code>http://www.w3.org/TR/2011/PR-CSS2-20110412/</code>.</p>
752 <p class="note">Note that the backslashes in the regular
753 expression require CSS escaping as ''\\''.</p>
754 </div>
755 </dd>
757 </dl>
759 <p>Implementations <strong>must</strong> treat any unknown URL matching
760 functions as a syntax error, and thus ignore the '@document' rule.
761 <span class="issue">Should we instead have more complicated error
762 handling rules to make forward-compatibility work differently, or is
763 this rule the best solution for such future expansion anyway?</span></p>
765 <div class="issue">This syntax doesn't offer any ability to do negations,
766 which has been requested in <a
767 href="https://bugzilla.mozilla.org/show_bug.cgi?id=349813">Mozilla bug
768 349813</a>. Use cases that people have wanted negations for
769 include:
770 <ul>
771 <li>User style sheets that want a particular rule in general, but know
772 that that rule does more harm than good on specific sites.</li>
773 <li>Authors who have a rule that they want to apply to most of their
774 pages, but wish to make a few exceptions for.</li>
775 </ul>
776 </div>
778 <p>This extends the lexical scanner in the
779 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
780 ([[!CSS21]], Appendix G) by adding:
781 <pre>@{D}{O}{C}{U}{M}{E}{N}{T} {return DOCUMENT_SYM;}</pre>
782 <p>and the grammar by adding</p>
783 <pre>document_rule
784 : DOCUMENT_SYM S+ url_match_fn ( "," S* url_match_fn )* group_rule_body
785 ;
787 url_match_fn
788 : (URI | FUNCTION) S*
789 ;</pre>
791 <h2 id="apis">APIs</h2>
793 <h3 id='extentions-to-cssrule-interface'>
794 Extensions to the <code>CSSRule</code> interface</h3>
796 <p>The <code>CSSRule</code> interface is extended as follows:
798 <pre class='idl'>partial interface CSSRule {
799 const unsigned short SUPPORTS_RULE = 12;
800 const unsigned short DOCUMENT_RULE = 13;
801 }</pre>
804 <h3 id='the-cssgroupingrule-interface'>
805 The <code>CSSGroupingRule</code> interface</h3>
807 <p>The <dfn><code>CSSGroupingRule</code></dfn> interface represents an at-rule that contains other rules nested inside itself.
809 <pre class='idl'>interface CSSGroupingRule : CSSRule {
810 readonly attribute CSSRuleList cssRules;
811 unsigned long insertRule (DOMString rule, unsigned long index);
812 void deleteRule (unsigned long index);
813 }</pre>
815 <dl class='idl-attributes'>
816 <dt><code>cssRules</code> of type <code>CSSRuleList</code>, readonly
817 <dd>The <code>cssRules</code> attribute must return a <code>CSSRuleList</code>
818 object for the list of CSS rules nested inside the grouping rule.
819 </dl>
821 <dl class='idl-methods'>
822 <dt><code>insertRule(DOMString rule, unsigned long index)</code>, returns
823 <code>unsigned long</code>
824 <dd>The <code>insertRule</code> operation must insert a CSS rule <var>rule</var>
825 into the CSS rule list returned by <code>cssRules</code> at <var>index</var>.
827 <dt><code>deleteRule (unsigned long index)</code>, return <code>void</code>
828 <dd>The <code>deleteRule</code> operation must remove a CSS rule from the
829 CSS rule list returned by <code>cssRules</code> at <var>index</var>.
830 </dl>
833 <h3 id="the-cssconditionrule-interface">
834 The <code>CSSConditionRule</code> interface</h3>
836 <p>The <dfn><code>CSSConditionRule</code></dfn> interface represents all the "conditional" at-rules,
837 which consist of a condition and a statement block.
839 <pre class='idl'>interface CSSConditionRule : CSSGroupingRule {
840 attribute DOMString conditionText;
841 }</pre>
843 <dl class='idl-attributes'>
844 <dt><code>conditionText</code> of type <code>DOMString</code>
845 <dd>The <code>conditionText</code> attribute, on getting, must return
846 the result of serializing the associated condition.
848 <p>On setting the <code>conditionText</code> attribute these steps
849 must be run:
851 <ol>
852 <li>Trim the given value of white space.
853 <li>If the given value matches the grammar of the
854 appropriate condition production for the given rule,
855 replace the associated CSS condition with the given value.
856 <li>Otherwise, do nothing.
857 </ol>
858 </dl>
861 <h3 id="the-cssmediarule-interface">
862 The <code>CSSMediaRule</code> interface</h3>
864 <p>The <dfn><code>CSSMediaRule</code></dfn> interface represents a ''@media'' rule:
866 <pre class='idl'>interface CSSMediaRule : CSSConditionRule {
867 readonly attribute MediaList media;
868 }</pre>
870 <dl class='idl-attributes'>
871 <dt><code>media</code> of type <code>MediaList</code>, readonly
872 <dd>The <code>media</code> attribute must return a <code>MediaList</code> object
873 for the list of media queries specified with the ''@media'' rule.
875 <dt><code>conditionText</code> of type <code>DOMString</code>
876 <dd>The <code>conditionText</code> attribute (defined on the <code>CSSConditionRule</code> parent rule),
877 on getting, must return the value of <code>media.mediaText</code> on the rule.
879 <p>Setting the <code>conditionText</code> attribute
880 must set the <code>media.mediaText</code> attribute on the rule.
881 </dl>
884 <h3 id="the-csssupportsrule-interface">
885 The <code>CSSSupportsRule</code> interface</h3>
887 <p>The <dfn><code>CSSSupportsRule</code></dfn> interface represents a ''@supports'' rule.</p>
889 <pre class='idl'>interface CSSSupportsRule : CSSConditionRule {
890 }</pre>
893 <h3 id="the-cssdocumentrule-interface">
894 The <code>CSSDocumentRule</code> interface</h3>
896 <p>The <dfn><code>CSSDocumentRule</code></dfn> interface represents a ''@document'' rule.</p>
898 <pre class='idl'>interface CSSDocumentRule : CSSConditionRule {
899 }</pre>
902 <h3 id='the-css-interface'>
903 The <code>CSS</code> interface, and the <code title=''>supports()</code> function</h3>
905 <p>The <dfn id='CSS-interface'><code>CSS</code></dfn> interface holds useful CSS-related functions that do not belong elsewhere.
907 <pre class='idl'>interface CSS {
908 boolean supports(DOMString property, DOMString value);
909 boolean supports(DOMString declaration);
910 }</pre>
912 <dl class='idl-methods'>
913 <dt><code>supports(DOMString property, DOMString value)</code>,
914 returns <code>boolean</code>
915 <dt><code>supports(DOMString conditionText)</code>,
916 returns <code>boolean</code>
917 <dd>
918 When the <code title=''>supports()</code> method is invoked with two arguments <var>property</var> and <var>value</var>,
919 it must return <code>true</code> if <var>property</var> is a literal match for the name of a CSS property that the UA supports,
920 and <var>value</var> would be successfully parsed as a supported value for that property.
921 Otherwise, it must return <code>false</code>.
923 <p>
924 When invoked with a single <var>conditionText</var> argument,
925 it must return <code>true</code> if <var>conditionText</var>,
926 when parsed and evaluated as a <code>supports_condition</code>,
927 would return true.
928 Otherwise, it must return <code>false</code>.
929 </dl>
932 <h2 id="conformance">Conformance</h2>
934 <h3 id="base-modules">Base Modules</h3>
936 <p>This specification defines conformance in terms of base modules,
937 which are modules that this specification builds on top of. The base
938 modules of this module are:</p>
940 <ul>
941 <li>[[!CSS21]]</li>
942 </ul>
944 <p>All of the conformance requirements of all base modules are
945 incorporated as conformance requirements of this module, except where
946 overridden by this module.</p>
948 <p>Additionally, all conformance requirements related to validity of
949 syntax in this module and all of its base modules are to be interpreted
950 as though all syntax in all of those modules is valid.</p>
952 <div class="example"><p>For example, this means that grammar presented
953 in modules other than [[!CSS21]] must obey the requirements that
954 [[!CSS21]] defines for the parsing of properties, and that requirements
955 for handling invalid syntax in [[!CSS21]] do not treat syntax added by
956 other modules as invalid.</p></div>
958 <p>Additionally, the set of valid syntax can be increased by the
959 conformance of a style sheet or processor to additional modules; use of
960 such syntax does not make a style sheet nonconformant and failure to
961 treat such syntax as invalid does not make a processor
962 nonconformant.</p>
964 <h3 id="conformance-classes">Conformance Classes</h3>
966 <p>Conformance to the CSS Conditional Rules Module is defined for three
967 conformance classes:
968 <dl>
969 <dt><dfn title="conformance::style sheet" id="conform-style-sheet">style sheet</dfn>
970 <dd>A <a href="http://www.w3.org/TR/CSS21/conform.html#style-sheet">CSS
971 style sheet</a>.</dd>
972 <dt><dfn title="conformance::processor" id="conform-processor">processor</dfn></dt>
973 <dd>A tool that reads CSS style sheets: it may be a renderer or
974 <a
975 href="http://www.w3.org/TR/CSS21/conform.html#user-agent">user-agent</a>
976 that interprets the semantics of a style sheet and renders
977 documents that use style sheets, or it may be a validator that
978 checks style sheets.</dd>
979 <dt><dfn title="conformance::authoring tool" id="conform-authoring-tool">authoring tool</dfn></dt>
980 <dd>A tool that writes a style sheet.</dd>
981 </dl>
983 <p>A style sheet is conformant to the CSS Conditional Rules Module
984 if it meets all of the conformance requirements in the module that are
985 described as requirements of style sheets.</p>
987 <p>A processor is conformant to the CSS Conditional Rules Module if it
988 meets all applicable conformance requirements in the module that are
989 described as requirements of processors. In general, all requirements
990 are applicable to renderers. Requirements concerning a part of CSS
991 not performed by a processor are not applicable, e.g., requirements
992 related to rendering are not applicable to a validator. The inability
993 of a processor to correctly render a document due to limitations of
994 the device does not make it non-conformant. (For example, a renderer
995 is not required to render color on a monochrome monitor.)</p>
997 <p>An authoring tool is conformant to the CSS Conditional Rules Module
998 if it writes style sheets that conform to the module and (if it reads
999 CSS) it is a conformant processor.</p>
1001 <h3 id="partial">
1002 Partial Implementations</h3>
1004 <p>So that authors can exploit the forward-compatible parsing rules to
1005 assign fallback values, CSS renderers <strong>must</strong>
1006 treat as invalid (and <a href="http://www.w3.org/TR/CSS21/conform.html#ignore">ignore
1007 as appropriate</a>) any at-rules, properties, property values, keywords,
1008 and other syntactic constructs for which they have no usable level of
1009 support. In particular, user agents <strong>must not</strong> selectively
1010 ignore unsupported component values and honor supported values in a single
1011 multi-value property declaration: if any value is considered invalid
1012 (as unsupported values must be), CSS requires that the entire declaration
1013 be ignored.</p>
1015 <h3 id="experimental">Experimental Implementations</h3>
1017 <p>To avoid clashes with future CSS features, the CSS specifications
1018 reserve a <a href="http://www.w3.org/TR/CSS21/syndata.html#vendor-keywords">prefixed
1019 syntax</a> for proprietary property and value extensions to CSS. The CSS
1020 Working Group recommends that experimental implementations of features in
1021 CSS Working Drafts also use vendor-prefixed property or value names. This
1022 avoids any incompatibilities with future changes in the draft. Once a
1023 specification reaches the Candidate Recommendation stage, implementors
1024 should implement the non-prefixed syntax for any feature they consider to
1025 be correctly implemented according to spec.</p>
1027 <h3 id="cr-exit-criteria">CR Exit Criteria</h3>
1029 <p>For this specification to be advanced to Proposed Recommendation,
1030 there must be at least two independent, interoperable implementations
1031 of each feature. Each feature may be implemented by a different set of
1032 products, there is no requirement that all features be implemented by
1033 a single product. For the purposes of this criterion, we define the
1034 following terms:
1036 <dl>
1037 <dt>independent <dd>each implementation must be developed by a
1038 different party and cannot share, reuse, or derive from code
1039 used by another qualifying implementation. Sections of code that
1040 have no bearing on the implementation of this specification are
1041 exempt from this requirement.
1043 <dt>interoperable <dd>passing the respective test case(s) in the
1044 official CSS test suite, or, if the implementation is not a Web
1045 browser, an equivalent test. Every relevant test in the test
1046 suite should have an equivalent test created if such a user
1047 agent (UA) is to be used to claim interoperability. In addition
1048 if such a UA is to be used to claim interoperability, then there
1049 must one or more additional UAs which can also pass those
1050 equivalent tests in the same way for the purpose of
1051 interoperability. The equivalent tests must be made publicly
1052 available for the purposes of peer review.
1054 <dt>implementation <dd>a user agent which:
1056 <ol class=inline>
1057 <li>implements the specification.
1059 <li>is available to the general public. The implementation may
1060 be a shipping product or other publicly available version
1061 (i.e., beta version, preview release, or “nightly build”).
1062 Non-shipping product releases must have implemented the
1063 feature(s) for a period of at least one month in order to
1064 demonstrate stability.
1066 <li>is not experimental (i.e., a version specifically designed
1067 to pass the test suite and is not intended for normal usage
1068 going forward).
1069 </ol>
1070 </dl>
1072 <p>The specification will remain Candidate Recommendation for at least
1073 six months.
1075 <h2 class=no-num id="grammar">Grammar</h2>
1077 <p>In order to allow these new @-rules in CSS style sheets, this
1078 specification modifies the <code>stylesheet</code> production in the <a
1079 href="http://www.w3.org/TR/CSS21/grammar.html">Appendix G</a> grammar of
1080 [[!CSS21]] by replacing the <code>media</code> production defined in
1081 [[!CSS21]] with the <code>media</code> production defined in this one,
1082 and additionally inserting <code>| supports_rule | document_rule</code>
1083 alongside <code>ruleset | media | page</code>.</p>
1085 <h2 class=no-num id="acknowledgments">Acknowledgments</h2>
1087 <p>
1088 Thanks to the ideas and feedback from
1089 Tab Atkins,
1090 <span lang="tr">Tantek Çelik</span>,
1091 Alex Danilo,
1092 Elika Etemad,
1093 Pascal Germroth,
1094 <span lang="de">Björn Höhrmann</span>,
1095 Paul Irish,
1096 Vitor Menezes,
1097 Alex Mogilevsky,
1098 Chris Moschini,
1099 Ben Ward,
1100 Zack Weinberg,
1101 Estelle Weyl,
1102 Boris Zbarsky,
1103 and all the rest of the <a href="http://lists.w3.org/Archives/Public/www-style/">www-style</a> community.
1105 </p>
1107 <h2 class=no-num id="references">References</h2>
1110 <h3 class="no-num" id="normative-references">Normative references</h3>
1111 <!--normative-->
1113 <h3 class="no-num" id="other-references">Other references</h3>
1114 <!--informative-->
1116 <h2 class="no-num" id="index">Index</h2>
1117 <!--index-->
1119 </body>
1120 </html>
1121 <!-- Keep this comment at the end of the file
1122 Local variables:
1123 mode: sgml
1124 sgml-declaration:"~/SGML/HTML4.decl"
1125 sgml-default-doctype-name:"html"
1126 sgml-minimize-attributes:t
1127 sgml-nofill-elements:("pre" "style" "br")
1128 sgml-live-element-indicator:t
1129 sgml-omittag:nil
1130 sgml-shorttag:nil
1131 sgml-namecase-general:t
1132 sgml-general-insert-case:lower
1133 sgml-always-quote-attributes:t
1134 sgml-indent-step:nil
1135 sgml-indent-data:t
1136 sgml-parent-document:nil
1137 sgml-exposed-tags:nil
1138 sgml-local-catalogs:nil
1139 sgml-local-ecat-files:nil
1140 End:
1141 -->