Wed, 13 Mar 2013 15:18:26 -0700
[css3-conditional] Fix previous version link and some other data in spec header.
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 href="../csslogo.ico" rel="shortcut icon" type="image/x-icon">
9 <link rel="stylesheet" type="text/css" href="http://www.w3.org/StyleSheets/TR/W3C-[STATUS].css">
10 <!--
11 <script src="http://test.csswg.org/harness/annotate.js#CSS3-CONDITIONAL_DEV"
12 type="text/javascript" defer></script
13 -->
14 </head>
15 <body class="h-entry">
17 <div class="head">
18 <!--logo-->
20 <h1 class="p-name">CSS Conditional Rules Module Level 3</h1>
22 <h2 class="no-num no-toc">[LONGSTATUS] <span class="dt-updated"><span class="value-title" title="[CDATE]">[DATE]</span></span></h2>
23 <dl>
24 <dt>This version:
25 <dd><a class="u-url" href="[VERSION]">
26 http://www.w3.org/TR/[YEAR]/ED-css3-conditional-[CDATE]/</a>
28 <dt>Latest version:
29 <dd><a href="http://www.w3.org/TR/[SHORTNAME]/">http://www.w3.org/TR/[SHORTNAME]/</a>
31 <dt>Editor's draft:
32 <dd><a href="http://dev.w3.org/csswg/[SHORTNAME]/">http://dev.w3.org/csswg/[SHORTNAME]/</a>
33 (<a href="https://dvcs.w3.org/hg/csswg/log/tip/[SHORTNAME]/Overview.src.html">change log</a>)
35 <dt>Previous version:
36 <dd><a rel="previous" href="http://www.w3.org/TR/2012/WD-css3-conditional-20121213/">http://www.w3.org/TR/2012/WD-css3-conditional-20121213/</a></dd>
38 <dt>Editors:
39 <dd class="p-author h-card vcard"><a class="p-name fn u-url url" rel="author" href="http://dbaron.org/">L. David Baron</a>,
40 <a class="p-org org h-org" href="http://www.mozilla.org/">Mozilla</a>
42 <dt>Issues list:
43 <dd>Maintained in document (only editor's draft is current)
45 <dt>Feedback:
47 <dd><a
48 href="http://lists.w3.org/Archives/Public/www-style/">www-style@w3.org</a>
49 with subject line “<kbd>[[SHORTNAME]] <var>… message topic
50 …</var></kbd>”
52 <dt>Test suite:
53 <dd><a href="https://test.csswg.org/shepherd/search/spec/css3-conditional/">submitted tests</a>,
54 <a href="https://test.csswg.org/harness/suite/CSS3-CONDITIONAL_DEV/">nightly test suite</a>
56 </dl>
58 <!--copyright-->
60 <hr title="Separator for header">
61 </div>
63 <h2 class="no-num no-toc" id="abstract">Abstract</h2>
65 <p>CSS is a language for describing the rendering of structured documents
66 (such as HTML and XML) on screen, on paper, in speech, etc.
67 <span class="p-summary">
68 This module
69 contains the features of CSS for conditional processing of parts of
70 style sheets, conditioned on capabilities of the processor or the
71 document the style sheet is being applied to.
72 It includes and extends the functionality of CSS level 2 [[!CSS21]],
73 which builds on CSS level 1 [[CSS1]].
74 The main extensions compared to level 2 are
75 allowing nesting of certain at-rules inside '@media',
76 and the addition of the '@supports'
77 rule for conditional processing.
78 </span>
80 <h2 class="no-num no-toc" id="status">Status of this document</h2>
82 <!--status-->
84 <p>The following features are at risk:
85 <ul>
86 <li>The inclusion of '@font-face' rules and
87 '@keyframes' rules as allowed within all of the @-rules in
88 this specification is at risk, though only because of the relative
89 rates of advancement of specifications. If this specification is able
90 to advance faster than one or both of the specifications defining
91 those rules, then the inclusion of those rules will move from this
92 specification to the specification defining those rules.</li>
94 <li>The addition of support for @-rules inside of conditional grouping
95 rules is at risk; if interoperable implementations are not found, it
96 may be removed to advance the other features in this specification to
97 Proposed Recommendation.</li>
99 <li>The '@supports' rule is at risk; if interoperable
100 implementations are not found, it may be removed to advance the other
101 features in this specification to Proposed Recommendation.</li>
102 </ul>
104 <p>This is a <strong>Last Call Working Draft</strong>.
105 The deadline for comments is <strong>10 January 2013</strong>.
107 <!--
109 Things to go in level 4:
111 * Create some way to put these new conditional things on an @import.
112 * The @document rule (commented out, down below).
114 -->
116 <h2 class="no-num no-toc" id="contents">Table of contents</h2>
118 <!--toc-->
120 <h2 id="introduction">Introduction</h2>
122 <h3 id="context">Background</h3>
124 <p><em>This section is not normative.</em>
126 <p>[[!CSS21]] defines one type of conditional group rule, the
127 '@media' rule, and allows only rulesets (not other @-rules)
128 inside of it. The '@media' rule provides the ability to
129 have media-specific style sheets, which is also provided by style
130 sheet linking features such as '@import' and
131 <code class="html"><link></code>. The restrictions on the contents of
132 '@media' rules made them less useful; they have forced authors
133 using CSS features involving @-rules in media-specific style sheets to
134 use separate style sheets for each medium.</p>
136 <p>This specification extends the rules for the contents of
137 conditional group rules to allow other @-rules, which enables authors
138 to combine CSS features involving @-rules with media specific style
139 sheets within a single style sheet.</p>
141 <p>This specification also defines an additional type of conditional
142 group rule, '@supports', to
143 address author and user requirements.</p>
145 <p>The '@supports' rule allows CSS to be conditioned on
146 implementation support for CSS properties and values. This rule makes
147 it much easier for authors to use new CSS features and provide good
148 fallback for implementations that do not support those features. This
149 is particularly important for CSS features that provide new layout
150 mechanisms, and for other cases where a set of related styles needs to
151 be conditioned on property support.</p>
153 <h3 id="placement">Module Interactions</h3>
155 <p>This module replaces and extends the '@media' rule
156 feature defined in [[!CSS21]] section <var>7.2.1</var> and
157 incorporates the modifications previously made non-normatively by
158 [[!MEDIAQ]] section <var>1</var>.</p>
160 <p>Its current definition depends on @-rules defined in [[!CSS3-FONTS]]
161 and [[!CSS3-ANIMATIONS]], but that dependency is only on the
162 assumption that those modules will advance ahead of this one. If this
163 module advances faster, then the dependency will be reversed.</p>
165 <h3 id="conventions">Document Conventions</h3>
167 <p>Conformance requirements are expressed with a combination of
168 descriptive assertions and RFC 2119 terminology. The key words “MUST”,
169 “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”,
170 “RECOMMENDED”, “MAY”, and “OPTIONAL” in the normative parts of this
171 document are to be interpreted as described in RFC 2119.
172 However, for readability, these words do not appear in all uppercase
173 letters in this specification.
175 <p>All of the text of this specification is normative except sections
176 explicitly marked as non-normative, examples, and notes. [[!RFC2119]]</p>
178 <p>Examples in this specification are introduced with the words “for example”
179 or are set apart from the normative text with
180 <code class="html">class="example"</code>, like this:
182 <div class="example">
183 <p>This is an example of an informative example.</p>
184 </div>
186 <p>Informative notes begin with the word “Note” and are set apart from the
187 normative text with <code class="html">class="note"</code>, like this:
189 <p class="note">Note, this is an informative note.</p>
191 <h2 id="processing">Processing of conditional group rules</h2>
193 <p>This specification defines some CSS @-rules, called <dfn>conditional
194 group rules</dfn>, that associate a condition with a group of other
195 CSS rules. These different rules allow testing different types of
196 conditions, but share common behavior for how their contents are used
197 when the condition is true and when the condition is false.</p>
199 <div class="example">
200 <p>For example, this rule:</p>
201 <pre>@media print {
202 /* hide navigation controls when printing */
203 #navigation { display: none }
204 }</pre>
205 <p>causes a particular CSS rule (making elements with ID "navigation" be
206 display:none) apply only when the style sheet is used for a print
207 medium.
208 </div>
210 <p>Each conditional group rule has a condition, which at any time
211 evaluates to true or false. When the condition is true, CSS processors
212 <strong>must</strong> apply the rules inside the group rule as though
213 they were at the group rule's location; when the condition is false, CSS
214 processors <strong>must not</strong> apply any of rules inside the group
215 rule. The current state of the condition does not affect the CSS object
216 model, in which the contents of the group rule always remain within the
217 group rule.</p>
219 <p>This means that when multiple conditional group rules are nested,
220 a rule inside of both of them applies only when all of the rules'
221 conditions are true.</p>
223 <div class="example">For example, with this set of nested rules:
224 <pre>@media print { // rule (1)
225 /* hide navigation controls when printing */
226 #navigation { display: none }
227 @media (max-width: 12cm) { // rule (2)
228 /* keep notes in flow when printing to narrow pages */
229 .note { float: none }
230 }
231 }</pre>
232 the condition of the rule marked (1) is true for print media, and the
233 condition of the rule marked (2) is true when the width of the display
234 area (which for print media is the page box) is less than or equal to
235 12cm. Thus the rule ''#navigation { display: none }'' applies
236 whenever this style sheet is applied to print media, and the rule
237 ''.note { float: none }'' is applied only when the style sheet
238 is applied to print media <em>and</em> the width of the page box is less
239 than or equal to 12 centimeters.</div>
241 <p>When the condition for a conditional group rule changes, CSS
242 processors <strong>must</strong> reflect that the rules now apply or no
243 longer apply, except for properties whose definitions define effects of
244 computed values that persist past the lifetime of that value (such as
245 for some properties in [[CSS3-TRANSITIONS]] and
246 [[!CSS3-ANIMATIONS]]).</p>
248 <h2 id="contents-of">Contents of conditional group rules</h2>
250 <p>The syntax of each conditional group rule consists of some syntax
251 specific to the type of rule followed by a <dfn>group rule body</dfn>,
252 which is a block (pair of braces) containing a sequence of rules.</p>
254 <p>A group rule body is allowed to contain rulesets and any @-rules that
255 are allowed at the top level of a style sheet before and after a
256 ruleset. This means that @-rules that must occur at the beginning of
257 the style sheet (such as '@charset', '@import',
258 and '@namespace' rules) are not allowed inside of conditional group
259 rules. Conditional group rules can be nested.</p>
261 <p>In terms of the grammar, this specification defines the following
262 productions for use in the grammar of conditional group rules:</p>
264 <pre><dfn>nested_statement</dfn>
265 : ruleset | <i>media</i> | page | font_face_rule | keyframes_rule |
266 <i>supports_rule</i>
267 ;
269 <dfn>group_rule_body</dfn>
270 : '{' S* <i>nested_statement</i>* '}' S*
271 ;</pre>
272 <p>
273 in which all the productions are defined in that grammar with the
274 exception of <code>font_face_rule</code>
275 defined in [[!CSS3-FONTS]], <code>keyframes_rule</code> defined in
276 [[!CSS3-ANIMATIONS]], and <code>media</code> and <code>supports_rule</code>
277 defined in this specification.</p>
279 <p>In general, future CSS specifications that add new @-rules that are
280 not forbidden to occur after some other types of rules should modify
281 this <code>nested_statement</code> production to keep the grammar
282 accurate.</p>
284 <p>Style sheets <strong>must not</strong> use rules other than the allowed ones inside
285 conditional group rules.</p>
287 <p>CSS processors <strong>must</strong> ignore rules that are not
288 allowed within a group rule, and <strong>must</strong> handle invalid
289 rules inside of group rules as described in <a
290 href="http://www.w3.org/TR/CSS21/syndata.html#parsing-errors">section
291 4.2 (Rules for handling parsing errors)</a>, <a
292 href="http://www.w3.org/TR/CSS21/syndata.html#at-rules">section 4.1.5
293 (At-rules)</a>, and <a
294 href="http://www.w3.org/TR/CSS21/syndata.html#rule-sets">section 4.1.7
295 (Rule sets, declaration blocks, and selectors)</a> of [[!CSS21]].</p>
297 <h2 id="use">Placement of conditional group rules</h2>
299 <p>Conditional group rules are allowed at the top-level of a style
300 sheet, and inside other conditional group rules. CSS processors
301 <strong>must</strong> process such rules as <a
302 href="#processing">described above</a>.</p>
304 <p>Any rules that are not allowed after a ruleset (e.g., ''@charset'',
305 ''@import'', or ''@namespace'' rules) are also not allowed after a
306 conditional group rule. Therefore, style sheets <strong>must
307 not</strong> place such rules after a conditional group rules, and CSS
308 processors <strong>must</strong> ignore such rules.</p>
310 <h2 id="at-media">Media-specific style sheets: the '@media' rule</h2>
312 <p>The <dfn>'@media' rule</dfn> is a conditional group rule whose
313 condition is a media query. It consists of the at-keyword
314 '@media' followed by a (possibly empty) media query list (as
315 defined in [[!MEDIAQ]]), followed by a group rule body. The condition
316 of the rule is the result of the media query.</p>
318 <div class="example">
319 <p>This '@media' rule:</p>
320 <pre>@media screen and (min-width: 35em),
321 print and (min-width: 40em) {
322 #section_navigation { float: left; width: 10em; }
323 }</pre>
324 <p>has the condition
325 ''screen and (min-width: 35em), print and (min-width: 40em)'',
326 which is true for screen displays
327 whose viewport is at least 35 times the initial font size
328 and for print displays
329 whose viewport is at least 40 times the initial font size.
330 When either of these is true,
331 the condition of the rule is true,
332 and the rule
333 ''#section_navigation { float: left; width: 10em; }''
334 is applied.</p>
335 </div>
337 <p>In terms of the grammar, this specification extends the
338 <code>media</code> production in the
339 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
340 ([[!CSS21]], Appendix G) into:
341 <pre><dfn>media</dfn>
342 : MEDIA_SYM S* media_query_list <i>group_rule_body</i>
343 ;</pre>
344 <p>where the <code>group_rule_body</code> production is defined in this
345 specification, the <code>media_query_list</code> production is defined
346 in [[!MEDIAQ]], and the others are defined in the <a
347 href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
348 ([[!CSS21]], Appendix G).
350 <h2 id="at-supports">Feature queries: the '@supports' rule</h2>
352 <p>The <dfn>'@supports' rule</dfn> is a conditional group
353 rule whose condition tests whether the user agent supports CSS
354 property:value pairs. Authors can use it to write style sheets that use
355 new features when available but degrade gracefully when those features
356 are not supported. CSS has existing mechanisms for graceful
357 degradation, such as ignoring unsupported properties or values, but
358 these are not always sufficient when large groups of styles need to be
359 tied to the support for certain features, as is the case for use of new
360 layout system features.</p>
362 <p>The syntax of the condition in the '@supports' rule is
363 slightly more complicated than for the other conditional group rules
364 (though has some similarities to media queries) since:</p>
365 <ul>
366 <li>negation is needed so that the new-feature styles and the fallback
367 styles can be separated (within the forward-compatible grammar's rules
368 for the syntax of @-rules), and not required to override each other</li>
369 <li>conjunction (and) is needed so that multiple required features can
370 be tested</li>
371 <li>disjunction (or) is needed when there are multiple alternative
372 features for a set of styles, particularly when some of those
373 alternatives are vendor-prefixed properties or values</li>
374 </ul>
376 <p>Therefore, the syntax of the '@supports' rule allows
377 testing for property:value pairs, and arbitrary conjunctions (and),
378 disjunctions (or), and negations (not) of them.</p>
380 <p>This extends the lexical scanner in the
381 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
382 ([[!CSS21]], Appendix G) by adding:
383 <pre>
384 @{S}{U}{P}{P}{O}{R}{T}{S} {return <dfn>SUPPORTS_SYM</dfn>;}
385 {O}{R} {return <dfn>OR</dfn>;}
386 </pre>
388 <p>This then extends the grammar in the
389 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>,
390 using the lexical scanner there, with the additions of
391 <code><a href="http://www.w3.org/TR/css3-mediaqueries/#syntax">AND</a></code> and
392 <code><a href="http://www.w3.org/TR/css3-mediaqueries/#syntax">NOT</a></code>
393 tokens defined in the Media Queries specification [[!MEDIAQ]]
394 and the <code>OR</code> and <code>SUPPORTS_SYM</code> tokens defined above,
395 and with
396 <code><a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization">declaration</a></code>,
397 <code><a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization">any</a></code>,
398 and <code><a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization">unused</a></code>
399 productions
400 and the <code><a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization">FUNCTION</a></code> token
401 taken from the core syntax of CSS defined in
402 <a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization">section 4.1.1 (Tokenization)</a> of [[!CSS21]],
403 by adding:</p>
405 <pre><dfn>supports_rule</dfn>
406 : <i>SUPPORTS_SYM</i> <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>* <i>supports_condition</i> <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>* <i>group_rule_body</i>
407 ;
409 <dfn>supports_condition</dfn>
410 : <i>supports_negation</i> | <i>supports_conjunction</i> | <i>supports_disjunction</i> |
411 <i>supports_condition_in_parens</i>
412 ;
414 <dfn>supports_condition_in_parens</dfn>
415 : ( '(' <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>* <i>supports_condition</i> <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>* ')' ) | <i>supports_declaration_condition</i> |
416 <i>general_enclosed</i>
417 ;
419 <dfn>supports_negation</dfn>
420 : <a href="http://www.w3.org/TR/css3-mediaqueries/#syntax"><i>NOT</i></a> <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>+ <i>supports_condition_in_parens</i>
421 ;
423 <dfn>supports_conjunction</dfn>
424 : <i>supports_condition_in_parens</i> ( <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>+ <a href="http://www.w3.org/TR/css3-mediaqueries/#syntax"><i>AND</i></a> <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>+ <i>supports_condition_in_parens</i> )+
425 ;
427 <dfn>supports_disjunction</dfn>
428 : <i>supports_condition_in_parens</i> ( <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>+ <i>OR</i> <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>+ <i>supports_condition_in_parens</i> )+
429 ;
431 <dfn>supports_declaration_condition</dfn>
432 : '(' <a href="http://www.w3.org/TR/CSS21/grammar.html#scanner"><i>S</i></a>* <a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization"><i>declaration</i></a> ')'
433 ;
435 <dfn>general_enclosed</dfn>
436 : ( <a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization"><i>FUNCTION</i></a> | '(' ) ( <a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization"><i>any</i></a> | <a href="http://www.w3.org/TR/CSS21/syndata.html#tokenization"><i>unused</i></a> )* ')'
437 ;
438 </pre>
440 <p>
441 Implementations <strong>must</strong> parse ''@supports'' rules
442 based on the above grammar,
443 and when interpreting the above grammar,
444 <strong>must</strong> match the production before an <code>|</code> operator
445 in preference to the one after it.
446 </p>
448 <p>
449 The above grammar is purposely very loose for forwards-compatibility reasons,
450 since the <code>general_enclosed</code> production
451 allows for substantial future extensibility.
452 Any ''@supports'' rule that does not parse according to the grammar above
453 (that is, a rule that does not match this loose grammar
454 which includes the <code>general_enclosed</code> production)
455 is invalid.
456 Style sheets <strong>must not</strong> use such a rule and
457 processors <strong>must</strong> ignore such a rule (including all of its contents).
459 <p>Each of these grammar terms is associated with a boolean result, as
460 follows:</p>
461 <dl>
462 <dt>supports_condition</dt>
463 <dd>
464 The result is the result of the single child term.
465 </dd>
467 <dt>supports_condition_in_parens</dt>
468 <dd>
469 The result is the result of the single <code>supports_condition</code>
470 or <code>supports_declaration_condition</code> child term.
471 </dd>
473 <dt>supports_negation</dt>
474 <dd>
475 The result is the <em>negation</em> of the result of the
476 <code>supports_condition_in_parens</code> child term.
477 </dd>
479 <dt>supports_conjunction</dt>
480 <dd>
481 The result is true if the result of <em>all</em> of the
482 <code>supports_condition_in_parens</code> child terms is true;
483 otherwise it is false.
484 </dd>
486 <dt>supports_disjunction</dt>
487 <dd>
488 The result is true if the result of <em>any</em> of the
489 <code>supports_condition_in_parens</code> child terms is true;
490 otherwise it is false.
491 </dd>
493 <dt>supports_declaration_condition</dt>
494 <dd>
495 The result is whether the CSS processor <a href="#support-definition">supports</a> the declaration
496 within the parentheses.
497 </dd>
499 <dt>general_enclosed</dt>
500 <dd>
501 The result is always false.
502 Additionally, style sheets <strong>must not</strong>
503 write ''@supports'' rules
504 that match this grammar production.
505 (In other words, this production exists only for future extensibility,
506 and is not part of the description of a valid style sheet
507 in this level of the specification.)
508 <span class="note">Note that future levels may define functions
509 or other parenthesized expressions that can evaluate to true.</span>
510 </dd>
511 </dl>
513 <p>The condition of the '@supports' rule is the result of the
514 <code>supports_condition</code> term that is a child of the
515 <code>supports_rule</code> term.</p>
517 <div class="example">
518 <p>For example, the following rule</p>
519 <pre>@supports ( display: flexbox ) {
520 body, #navigation, #content { display: flexbox; }
521 #navigation { background: blue; color: white; }
522 #article { background: white; color: black; }
523 }</pre>
524 <p>applies the rules inside the '@supports' rule only when
525 ''display: flexbox'' is supported.</p>
526 </div>
528 <div class="example">
529 <p>The following example shows an additional '@supports' rule that can
530 be used to provide an alternative for when ''display: flexbox'' is not
531 supported:</p>
532 <pre>@supports not ( display: flexbox ) {
533 body { width: 100%; height: 100%; background: white; color: black; }
534 #navigation { width: 25%; }
535 #article { width: 75%; }
536 }</pre>
537 <p>Note that the 'width' declarations may be harmful to the
538 flexbox-based layout, so it is important that they be present only in
539 the non-flexbox styles.</p>
540 </div>
542 <div class="example">
543 <p>The following example checks for support for the 'box-shadow'
544 property, including checking for support for vendor-prefixed versions of
545 it. When the support is present, it specifies both 'box-shadow' (with
546 the prefixed versions) and 'color' in a way what would cause the text to
547 become invisible were 'box-shadow' not supported.</p>
548 <pre>@supports ( box-shadow: 2px 2px 2px black ) or
549 ( -moz-box-shadow: 2px 2px 2px black ) or
550 ( -webkit-box-shadow: 2px 2px 2px black ) or
551 ( -o-box-shadow: 2px 2px 2px black ) {
552 .outline {
553 color: white;
554 -moz-box-shadow: 2px 2px 2px black;
555 -webkit-box-shadow: 2px 2px 2px black;
556 -o-box-shadow: 2px 2px 2px black;
557 box-shadow: 2px 2px 2px black; /* unprefixed last */
558 }
559 }</pre></div>
561 <p>To avoid confusion between ''and'' and ''or'', the syntax requires
562 that both ''and'' and ''or'' be specified explicitly (rather than, say,
563 using commas or spaces for one of them). Likewise, to avoid confusion
564 caused by precedence rules, the syntax does not allow ''and'', ''or'',
565 and ''not'' operators to be mixed without a layer of parentheses.</p>
567 <div class="example">
568 <p>For example, the following rule is not valid:
569 <pre class="illegal">@supports (transition-property: color) or
570 (animation-name: foo) and
571 (transform: rotate(10deg)) {
572 // ...
573 }</pre>
574 <p>Instead, authors must write one of the following:</p>
575 <pre>@supports ((transition-property: color) or
576 (animation-name: foo)) and
577 (transform: rotate(10deg)) {
578 // ...
579 }</pre>
580 <pre>@supports (transition-property: color) or
581 ((animation-name: foo) and
582 (transform: rotate(10deg))) {
583 // ...
584 }</pre>
585 </div>
587 <p>Furthermore, whitespace is required after a ''not'' and on both
588 sides of an ''and'' or ''or''.</p>
590 <p>The declaration being tested must always occur within parentheses,
591 when it is the only thing in the expression.<p>
593 <div class="example">
594 <p>For example, the following rule is not valid:
595 <pre class="illegal">@supports display: flexbox {
596 // ...
597 }</pre>
598 <p>Instead, authors must write:</p>
599 <pre>@supports (display: flexbox) {
600 // ...
601 }</pre>
602 </div>
604 <p>The syntax allows extra parentheses when they are not needed. This
605 flexibility is sometimes useful for authors (for example, when
606 commenting out parts of an expression) and may also be useful for
607 authoring tools.</p>
609 <div class="example">
610 <p>For example, authors may write:</p>
611 <pre>@supports ((display: flexbox)) {
612 // ...
613 }</pre>
614 </div>
616 <p>A trailing ''!important'' on a declaration being tested is allowed,
617 though it won't change the validity of the declaration.
619 <div class="example">
620 <p>For example, the following rule is valid:
621 <pre>@supports (display: flexbox !important) {
622 // ...
623 }</pre>
624 </div>
626 <h3 id="support-definition">Definition of support</h3>
628 <p>For forward-compatibility,
629 <a href="http://www.w3.org/TR/CSS21/syndata.html#declaration">section 4.1.8
630 (Declarations and properties)</a> of [[!CSS21]]
631 defines rules for handling invalid properties and values.
632 CSS processors that
633 do not implement or partially implement a specification
634 <strong>must</strong> treat any part of a value that they
635 do not implement, or
636 do not have a usable level of support for,
637 as invalid according to this rule
638 for handling invalid properties and values,
639 and therefore <strong>must</strong> discard the declaration as a parse error.</p>
641 <p>A CSS processor is considered to <dfn id="dfn-support">support</dfn>
642 a declaration (consisting of a property and value) if it accepts that
643 declaration (rather than discarding it as a parse error).
644 If a processor does not implement, with a usable level of support,
645 the value given,
646 then it <strong>must not</strong>
647 accept the declaration or claim support for it.</p>
649 <p class="note">Note that properties or values
650 whose support is effectively disabled by user preferences
651 are still considered as supported by this definition.
652 For example, if a user has enabled a high-contrast mode
653 that causes colors to be overridden,
654 the CSS processor is still considered to support the 'color' property
655 even though declarations of the 'color' property may have no effect.
656 On the other hand, a developer-facing preference
657 whose purpose is to enable or disable support for an experimental CSS feature
658 does affect this definition of support.</p>
660 <p>These rules (and the equivalence between them) allow
661 authors to use fallback (either in the [[CSS1]] sense of declarations
662 that are overridden by later declarations or with the new capabilities
663 provided by the ''@supports'' rule in this specification) that works
664 correctly for the features implemented. This applies especially to
665 compound values; implementations must implement all parts of the value
666 in order to consider the declaration supported, either inside a ruleset
667 or in the declaration condition of an ''@supports'' rule.</p>
669 <!--
670 <h2 id="at-document">Document queries: the '@document' rule</h2>
672 <p>The <dfn>'@document' rule</dfn> is a conditional group
673 rule whose condition depends on the
674 <a href="#url-of-doc">URL of the document being styled</a>.
675 This allows style sheets, particularly user style sheets, to have styles
676 that only apply to a set of pages rather than to all pages using the
677 style sheet.</p>
679 <p class="issue">Given that this @-rule is intended primarily for user
680 style sheets, what should this specification say about its use in author
681 style sheets? Should it be forbidden? Should use instead be
682 discouraged? Or should this specification remain neutral on the
683 topic, since there are valid uses in author style sheets?</p>
685 <p id="url-of-doc">The <dfn>URL of the document being styled</dfn> is
686 the URI at which the document is located, excluding any fragment
687 identifiers. (This means, for example, that HTTP redirects have been
688 followed.) If the styles are being applied inside a complete document
689 embedded into the presentation of another (e.g., [[HTML5]]'s <code
690 class="html">iframe</code>, <code class="html">object</code>, or <code
691 class="html">img</code> elements), the relevant URI is that of the
692 frame, not of its container. However, if content from other documents
693 is mixed in via mechanisms that mix content from one document into
694 another (e.g., [[SVG11]]'s <code>use</code> element), then the
695 address of the container document is used.</p>
697 <p class="note">Note: In [[HTML5]], this is the
698 <a href="http://dev.w3.org/html5/spec/dom.html#documents">document's address</a>
699 of a document in a
700 <a href="http://dev.w3.org/html5/spec/browsers.html#browsing-context">browsing context</a>.</p>
702 <div class="issue">What form of normalization is done on URLs and domains
703 before matching? In particular, this specification needs to describe:
704 <ul>
705 <li>what form is used for the <a href="#url-of-doc">URL of the document
706 being styled</a> (and what has been normalized in that form)</li>
707 <li>what normalization (if any) happens to the argument of each of the match
708 functions before the comparison that they describe and</li>
709 <li>whether the
710 comparison algorithm used is string comparison or some other URL
711 comparison algorithm.</li></ul></div>
713 <p>The '@document' rule's condition is written as a
714 comma-separated list of <dfn>URL matching functions</dfn>, and the
715 condition evaluates to true whenever any one of those functions
716 evaluates to true. The following URL matching functions are
717 permitted:</p>
719 <dl>
720 <dt><dfn id="url-exact" title="url()|URL matching functions::exact"><url></dfn></dt>
722 <dd>
723 <p>The 'url()' function is the <dfn>exact url matching
724 function</dfn>. It evaluates to true whenever the <a
725 href="#url-of-doc">URL of the document being styled</a> is exactly
726 the URL given.</p>
728 <p class="Note">The 'url()' function, since it is a core syntax
729 element in CSS, is allowed (subject to different character
730 limitations and thus escaping requirements) to contain an unquoted
731 value (in addition to the string values that are allowed as
732 arguments for all four functions).</p>
734 <div class="example">
735 <p>For example, this rule:</p>
736 <pre>@document url("http://www.w3.org/Style/CSS/") {
737 #summary { background: yellow; color: black}
738 }</pre>
739 <p>styles the <code class="html">summary</code> element on the page
740 <code>http://www.w3.org/Style/CSS/</code>, but not on any other
741 pages.</p>
742 </div>
743 </dd>
745 <dt><dfn id="url-prefix" title="url-prefix()|URL matching functions::prefix">url-prefix(<string>)</dfn></dt>
747 <dd>
748 <p>The 'url-prefix()' function is the <dfn>url prefix
749 matching function</dfn>. It evaluates to true whenever the
750 <a href="#url-of-doc">URL of the document being styled</a>
751 has the argument to the function as an
752 initial substring (which is true when the two strings are equal).
753 When the argument is the empty string, it evaluates to true for all
754 documents.</p>
755 <div class="example">
756 <p>For example, this rule:</p>
757 <pre>@document url-prefix("http://www.w3.org/Style/CSS/") {
758 #summary { background: yellow; color: black}
759 }</pre>
760 <p>styles the <code class="html">summary</code> element on the page
761 <code>http://www.w3.org/Style/CSS/</code> and on the page
762 <code>http://www.w3.org/Style/CSS/Test</code>, but it does not
763 affect the page <code>http://www.w3.org/</code> or the page
764 <code>http://www.example.com/Style/CSS/</code>.</p>
765 </div>
766 </dd>
768 <dt><dfn id="url-domain" title="domain()|URL matching functions::domain">domain(<string>)</dfn></dt>
770 <dd>
771 <p>The 'domain()' function is the <dfn>domain
772 matching function</dfn>. It evaluates to true whenever
773 the <a href="#url-of-doc">URL of the document being styled</a>
774 has a host subcomponent (as defined in [[!URI]])
775 and that host subcomponent is exactly the argument to the
776 'domain()' function or a final substring of the host
777 component is a period (U+002E) immediately followed by the argument
778 to the 'domain()' function.</p>
779 <div class="example">
780 <p>For example, this rule:</p>
781 <pre>@document domain("w3.org") {
782 body { font-size: 16px ! important }
783 }</pre>
784 <p>changes the font size of the body element for pages such as
785 <code>http://www.w3.org/Style/CSS/</code> and
786 <code>http://w3.org/Style/CSS/</code> and
787 <code>http://lists.w3.org/Archives/Public/www-style/</code>
788 but it does not affect the page
789 <code>http://www.example.com/Style/CSS/</code>.</p>
790 </div>
791 </dd>
793 <dt><dfn id="url-regexp" title="regexp()|URL matching functions::regular expression">regexp(<string>)</dfn></dt>
795 <dd>
796 <p>The contents of the <string> argument <strong>must</strong>
797 match the JavaScript <code>Pattern</code> production
798 ([[!ECMA-262-5.1]], section 15.10.1). However,
799 failing to do so is not a CSS syntax error and does not trigger any
800 error handling for CSS syntax errors.</p>
802 <p>The ''regexp()'' function evaluates to true whenever the string
803 argument compiled as a JavaScript regular expression with the
804 <code>global</code>, <code>ignoreCase</code> and
805 <code>multiline</code> flags <em>disabled</em>
806 (see [[!ECMA-262-5.1]], sections 15.10.7.2 through 15.10.7.4)
807 compiles successfully and the resulting regular expression matches
808 the entirety of the
809 <a href="#url-of-doc">URL of the document being styled</a>.</p>
811 <p class="note">Note that regular expression must match the entire
812 URL, not just a part of it.</p>
814 <p class="note">Note that this definition intentionally matches the
815 behavior of the <a
816 href="http://dev.w3.org/html5/spec/common-input-element-attributes.html#attr-input-pattern"><code class="html">pattern</code>
817 attribute</a> on the <code class="html">input</code> element
818 in [[HTML5]].</p>
820 <div class="example">
821 <p>For example, this rule:</p>
822 <pre>@document regexp("http://www.w3.org/TR/\\d{4}/[^/]*-CSS2-\\d{8}/") {
823 body { font-size: 20px ! important }
824 }</pre>
825 <p>changes the font size of the body element for pages such as
826 <code>http://www.w3.org/TR/2011/PR-CSS2-20110412/</code>.</p>
827 <p class="note">Note that the backslashes in the regular
828 expression require CSS escaping as ''\\''.</p>
829 </div>
830 </dd>
832 </dl>
834 <p>Implementations <strong>must</strong> treat any unknown URL matching
835 functions as a syntax error, and thus ignore the '@document' rule.
836 <span class="issue">Should we instead have more complicated error
837 handling rules to make forward-compatibility work differently, or is
838 this rule the best solution for such future expansion anyway?</span></p>
840 <div class="issue">This syntax doesn't offer any ability to do negations,
841 which has been requested in <a
842 href="https://bugzilla.mozilla.org/show_bug.cgi?id=349813">Mozilla bug
843 349813</a>. Use cases that people have wanted negations for
844 include:
845 <ul>
846 <li>User style sheets that want a particular rule in general, but know
847 that that rule does more harm than good on specific sites.</li>
848 <li>Authors who have a rule that they want to apply to most of their
849 pages, but wish to make a few exceptions for.</li>
850 </ul>
851 </div>
853 <p>This extends the lexical scanner in the
854 <a href="http://www.w3.org/TR/CSS21/grammar.html">Grammar of CSS 2.1</a>
855 ([[!CSS21]], Appendix G) by adding:
856 <pre>@{D}{O}{C}{U}{M}{E}{N}{T} {return DOCUMENT_SYM;}</pre>
857 <p>and the grammar by adding</p>
858 <pre><dfn>document_rule</dfn>
859 : DOCUMENT_SYM S+ <i>url_match_fn</i> ( "," S* <i>url_match_fn</i> )* <i>group_rule_body</i>
860 ;
862 <dfn>url_match_fn</dfn>
863 : (URI | FUNCTION S* STRING S* ')' ) S*
864 ;</pre>
865 -->
868 <h2 id="apis">APIs</h2>
870 <h3 id='extentions-to-cssrule-interface'>
871 Extensions to the <code>CSSRule</code> interface</h3>
873 <p>The <code>CSSRule</code> interface is extended as follows:
875 <pre class='idl'>partial interface CSSRule {
876 const unsigned short SUPPORTS_RULE = 12;
877 <!--
878 const unsigned short DOCUMENT_RULE = 13;
879 -->
880 }</pre>
883 <h3 id='the-cssgroupingrule-interface'>
884 The <code>CSSGroupingRule</code> interface</h3>
886 <p>The <dfn><code>CSSGroupingRule</code></dfn> interface represents an at-rule that contains other rules nested inside itself.
888 <pre class='idl'>interface CSSGroupingRule : CSSRule {
889 readonly attribute <a href="http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRuleList">CSSRuleList</a> cssRules;
890 unsigned long insertRule (DOMString rule, unsigned long index);
891 void deleteRule (unsigned long index);
892 }</pre>
894 <dl class='idl-attributes'>
895 <dt><code>cssRules</code> of type <code><a href="http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRuleList">CSSRuleList</a></code>, readonly
896 <dd>The <code>cssRules</code> attribute must return a <code>CSSRuleList</code>
897 object for the list of CSS rules nested inside the grouping rule.
898 </dl>
900 <dl class='idl-methods'>
901 <dt><code>insertRule(DOMString rule, unsigned long index)</code>, returns
902 <code>unsigned long</code>
903 <dd>
904 The <code>insertRule</code> operation must
905 insert a CSS rule <var>rule</var>
906 into the CSS rule list returned by <code>cssRules</code>,
907 such that the inserted rule will be at position <var>index</var>,
908 and any rules previously at <var>index</var> or higher
909 will increase their index by one.
910 It must throw INDEX_SIZE_ERR
911 if index is greater than <code>cssRules.length</code>.
912 It must throw SYNTAX_ERR
913 if the rule has a syntax error and is unparseable;
914 this does not include syntax errors handled by error handling rules
915 for constructs inside of the rule,
916 but this does include cases where the string given
917 does not parse into a single CSS rule (such as when the string is empty)
918 or where there is anything other than whitespace or comments
919 after that single CSS rule.
920 It must throw HIERARCHY_REQUEST_ERR
921 if the rule cannot be inserted at the location specified,
922 for example, if an ''@import'' rule is inserted inside a group rule.
924 <p>The return value is the <var>index</var> parameter.
926 <dt><code>deleteRule (unsigned long index)</code>, return <code>void</code>
927 <dd>
928 The <code>deleteRule</code> operation must
929 remove a CSS rule from
930 the CSS rule list returned by <code>cssRules</code> at <var>index</var>.
931 It must throw INDEX_SIZE_ERR
932 if index is greater than or equal to <code>cssRules.length</code>.
933 </dl>
936 <h3 id="the-cssconditionrule-interface">
937 The <code>CSSConditionRule</code> interface</h3>
939 <p>The <dfn><code>CSSConditionRule</code></dfn> interface represents all the "conditional" at-rules,
940 which consist of a condition and a statement block.
942 <pre class='idl'>interface CSSConditionRule : CSSGroupingRule {
943 attribute DOMString conditionText;
944 }</pre>
946 <dl class='idl-attributes'>
948 <dt><code>conditionText</code> of type <code>DOMString</code>
949 <dd>
950 <p>The <code>conditionText</code> attribute represents
951 the condition of the rule.
952 Since what this condition does
953 varies between the derived interfaces of <code>CSSConditionRule</code>,
954 those derived interfaces
955 may specify different behavior for this attribute
956 (see, for example, <code>CSSMediaRule</code> below).
957 In the absence of such rule-specific behavior,
958 the following rules apply:</p>
960 <p>The <code>conditionText</code> attribute, on getting, must return
961 the result of serializing the associated condition.
963 <p>On setting the <code>conditionText</code> attribute these steps
964 must be run:
966 <ol>
967 <li>Trim the given value of white space.
968 <li>If the given value matches the grammar of the
969 appropriate condition production for the given rule,
970 replace the associated CSS condition with the given value.
971 <li>Otherwise, do nothing.
972 </ol>
973 </dl>
976 <h3 id="the-cssmediarule-interface">
977 The <code>CSSMediaRule</code> interface</h3>
979 <p>The <dfn><code>CSSMediaRule</code></dfn> interface represents a ''@media'' rule:
981 <pre class='idl'>interface CSSMediaRule : CSSConditionRule {
982 readonly attribute <a href="http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-MediaList">MediaList</a> media;
983 }</pre>
985 <dl class='idl-attributes'>
986 <dt><code>media</code> of type <code><a href="http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-MediaList">MediaList</a></code>, readonly
987 <dd>The <code>media</code> attribute must return a <code>MediaList</code> object
988 for the list of media queries specified with the ''@media'' rule.
990 <dt><code>conditionText</code> of type <code>DOMString</code> (CSSMediaRule-specific definition for attribute on CSSConditionRule)
991 <dd>The <code>conditionText</code> attribute (defined on the <code>CSSConditionRule</code> parent rule),
992 on getting, must return the value of <code>media.mediaText</code> on the rule.
994 <p>Setting the <code>conditionText</code> attribute
995 must set the <code>media.mediaText</code> attribute on the rule.
996 </dl>
999 <h3 id="the-csssupportsrule-interface">
1000 The <code>CSSSupportsRule</code> interface</h3>
1002 <p>The <dfn><code>CSSSupportsRule</code></dfn> interface represents a ''@supports'' rule.</p>
1004 <pre class='idl'>interface CSSSupportsRule : CSSConditionRule {
1005 }</pre>
1007 <dl class='idl-attributes'>
1008 <dt><code>conditionText</code> of type <code>DOMString</code> (CSSSupportsRule-specific definition for attribute on CSSConditionRule)
1009 <dd>The <code>conditionText</code> attribute (defined on the <code>CSSConditionRule</code> parent rule),
1010 on getting, must return the condition that was specified,
1011 without any logical simplifications,
1012 so that the returned condition will evaluate to the same result
1013 as the specified condition
1014 in any conformant implementation of this specification
1015 (including implementations that implement future extensions
1016 allowed by the <i>general_enclosed</i> exensibility mechanism in this specification).
1017 In other words,
1018 token stream simplifications are allowed
1019 (such as reducing whitespace to a single space
1020 or omitting it in cases where it is known to be optional),
1021 but logical simplifications (such as removal of unneeded parentheses,
1022 or simplification based on evaluating results) are not allowed.
1024 </dl>
1026 <!--
1027 <h3 id="the-cssdocumentrule-interface">
1028 The <code>CSSDocumentRule</code> interface</h3>
1030 <p>The <dfn><code>CSSDocumentRule</code></dfn> interface represents a ''@document'' rule.</p>
1032 <pre class='idl'>interface CSSDocumentRule : CSSConditionRule {
1033 }</pre>
1034 -->
1037 <h3 id='the-css-interface'>
1038 The <code>CSS</code> interface, and the <code title=''>supports()</code> function</h3>
1040 <p>The <dfn id='CSS-interface'><code>CSS</code></dfn> interface holds useful CSS-related functions that do not belong elsewhere.
1042 <pre class='idl'>interface CSS {
1043 static boolean supports(DOMString property, DOMString value);
1044 static boolean supports(DOMString conditionText);
1045 }</pre>
1047 <dl class='idl-methods'>
1048 <dt><code>supports(DOMString property, DOMString value)</code>,
1049 returns <code>boolean</code>
1050 <dt><code>supports(DOMString conditionText)</code>,
1051 returns <code>boolean</code>
1052 <dd>
1053 When the <code title=''>supports()</code> method is invoked with two arguments <var>property</var> and <var>value</var>,
1054 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,
1055 and <var>value</var> would be successfully parsed as a supported value for that property.
1056 (Literal match means that no CSS escape processing is performed,
1057 and leading and trailing whitespace are not stripped,
1058 so any leading whitespace, trailing whitespace,
1059 or CSS escapes equivalent to the name of a property
1060 would cause the method to return <code>false</code>.)
1061 Otherwise, it must return <code>false</code>.
1063 <p>
1064 When invoked with a single <var>conditionText</var> argument,
1065 it must return <code>true</code> if <var>conditionText</var>,
1066 when parsed and evaluated as a <code>supports_condition</code>,
1067 would return true.
1068 Otherwise, it must return <code>false</code>.
1069 </dl>
1072 <h2 class=no-num id="grammar">Grammar</h2>
1074 <p>In order to allow these new @-rules in CSS style sheets, this
1075 specification modifies the <code>stylesheet</code> production in the <a
1076 href="http://www.w3.org/TR/CSS21/grammar.html">Appendix G</a> grammar of
1077 [[!CSS21]] by replacing the <code>media</code> production defined in
1078 [[!CSS21]] with the <code>media</code> production defined in this one,
1079 and additionally inserting <code>| supports_rule</code>
1080 alongside <code>ruleset | media | page</code>.</p>
1083 <h2 id="conformance">Conformance</h2>
1085 <h3 id="base-modules">Base Modules</h3>
1087 <p>This specification defines conformance in terms of base modules,
1088 which are modules that this specification builds on top of. The base
1089 modules of this module are:</p>
1091 <ul>
1092 <li>[[!CSS21]]</li>
1093 </ul>
1095 <p>All of the conformance requirements of all base modules are
1096 incorporated as conformance requirements of this module, except where
1097 overridden by this module.</p>
1099 <p>Additionally, all conformance requirements related to validity of
1100 syntax in this module and all of its base modules are to be interpreted
1101 as though all syntax in all of those modules is valid.</p>
1103 <div class="example"><p>For example, this means that grammar presented
1104 in modules other than [[!CSS21]] must obey the requirements that
1105 [[!CSS21]] defines for the parsing of properties, and that requirements
1106 for handling invalid syntax in [[!CSS21]] do not treat syntax added by
1107 other modules as invalid.</p></div>
1109 <p>Additionally, the set of valid syntax can be increased by the
1110 conformance of a style sheet or processor to additional modules; use of
1111 such syntax does not make a style sheet nonconformant and failure to
1112 treat such syntax as invalid does not make a processor
1113 nonconformant.</p>
1115 <h3 id="conformance-classes">Conformance Classes</h3>
1117 <p>Conformance to the CSS Conditional Rules Module is defined for three
1118 conformance classes:
1119 <dl>
1120 <dt><dfn title="conformance::style sheet" id="conform-style-sheet">style sheet</dfn>
1121 <dd>A <a href="http://www.w3.org/TR/CSS21/conform.html#style-sheet">CSS
1122 style sheet</a>.</dd>
1123 <dt><dfn title="conformance::processor" id="conform-processor">processor</dfn></dt>
1124 <dd>A tool that reads CSS style sheets: it may be a renderer or
1125 <a
1126 href="http://www.w3.org/TR/CSS21/conform.html#user-agent">user-agent</a>
1127 that interprets the semantics of a style sheet and renders
1128 documents that use style sheets, or it may be a validator that
1129 checks style sheets.</dd>
1130 <dt><dfn title="conformance::authoring tool" id="conform-authoring-tool">authoring tool</dfn></dt>
1131 <dd>A tool that writes a style sheet.</dd>
1132 </dl>
1134 <p>A style sheet is conformant to the CSS Conditional Rules Module
1135 if it meets all of the conformance requirements in the module that are
1136 described as requirements of style sheets.</p>
1138 <p>A processor is conformant to the CSS Conditional Rules Module if it
1139 meets all applicable conformance requirements in the module that are
1140 described as requirements of processors. In general, all requirements
1141 are applicable to renderers. Requirements concerning a part of CSS
1142 not performed by a processor are not applicable, e.g., requirements
1143 related to rendering are not applicable to a validator. The inability
1144 of a processor to correctly render a document due to limitations of
1145 the device does not make it non-conformant. (For example, a renderer
1146 is not required to render color on a monochrome monitor.)</p>
1148 <p>An authoring tool is conformant to the CSS Conditional Rules Module
1149 if it writes style sheets that conform to the module and (if it reads
1150 CSS) it is a conformant processor.</p>
1152 <h3 id="partial">
1153 Partial Implementations</h3>
1155 <p>So that authors can exploit the forward-compatible parsing rules to
1156 assign fallback values, CSS renderers <strong>must</strong>
1157 treat as invalid (and <a href="http://www.w3.org/TR/CSS21/conform.html#ignore">ignore
1158 as appropriate</a>) any at-rules, properties, property values, keywords,
1159 and other syntactic constructs for which they have no usable level of
1160 support. In particular, user agents <strong>must not</strong> selectively
1161 ignore unsupported component values and honor supported values in a single
1162 multi-value property declaration: if any value is considered invalid
1163 (as unsupported values must be), CSS requires that the entire declaration
1164 be ignored.</p>
1166 <h3 id="experimental">Experimental Implementations</h3>
1168 <p>To avoid clashes with future CSS features, the CSS specifications
1169 reserve a <a href="http://www.w3.org/TR/CSS21/syndata.html#vendor-keywords">prefixed
1170 syntax</a> for proprietary property and value extensions to CSS. The CSS
1171 Working Group recommends that experimental implementations of features in
1172 CSS Working Drafts also use vendor-prefixed property or value names. This
1173 avoids any incompatibilities with future changes in the draft. Once a
1174 specification reaches the Candidate Recommendation stage, implementors
1175 should implement the non-prefixed syntax for any feature they consider to
1176 be correctly implemented according to spec.</p>
1178 <h3 id="cr-exit-criteria">CR Exit Criteria</h3>
1180 <p>For this specification to be advanced to Proposed Recommendation,
1181 there must be at least two independent, interoperable implementations
1182 of each feature. Each feature may be implemented by a different set of
1183 products, there is no requirement that all features be implemented by
1184 a single product. For the purposes of this criterion, we define the
1185 following terms:
1187 <dl>
1188 <dt>independent <dd>each implementation must be developed by a
1189 different party and cannot share, reuse, or derive from code
1190 used by another qualifying implementation. Sections of code that
1191 have no bearing on the implementation of this specification are
1192 exempt from this requirement.
1194 <dt>interoperable <dd>passing the respective test case(s) in the
1195 official CSS test suite, or, if the implementation is not a Web
1196 browser, an equivalent test. Every relevant test in the test
1197 suite should have an equivalent test created if such a user
1198 agent (UA) is to be used to claim interoperability. In addition
1199 if such a UA is to be used to claim interoperability, then there
1200 must one or more additional UAs which can also pass those
1201 equivalent tests in the same way for the purpose of
1202 interoperability. The equivalent tests must be made publicly
1203 available for the purposes of peer review.
1205 <dt>implementation <dd>a user agent which:
1207 <ol class=inline>
1208 <li>implements the specification.
1210 <li>is available to the general public. The implementation may
1211 be a shipping product or other publicly available version
1212 (i.e., beta version, preview release, or “nightly build”).
1213 Non-shipping product releases must have implemented the
1214 feature(s) for a period of at least one month in order to
1215 demonstrate stability.
1217 <li>is not experimental (i.e., a version specifically designed
1218 to pass the test suite and is not intended for normal usage
1219 going forward).
1220 </ol>
1221 </dl>
1223 <p>The specification will remain Candidate Recommendation for at least
1224 six months.
1226 <h2 id="changes">
1227 Changes</h2>
1229 <p>The following (non-editorial) changes were made to this specification since the
1230 <a href="http://www.w3.org/TR/2012/WD-css3-conditional-20120911/">11 September 2012 Working Draft</a>:
1232 <ul>
1233 <li>Removed ''@document'' rule; it has been deferred to Level 4.
1234 <li>Allow functional notation in ''@supports'' queries to be valid (to allow for future extensions),
1235 but treat such notations as always being false.
1236 <li>Corrected the grammar as follows:
1237 <pre>
1238 - : SUPPORTS_SYM S+ supports_condition group_rule_body
1239 + : SUPPORTS_SYM S* supports_condition group_rule_body
1240 </pre>
1241 <pre>
1242 - : (URI | FUNCTION) S*
1243 + : (URI | FUNCTION S* STRING S* ')' ) S*
1244 </pre>
1245 <li>Switched "and", "or", and "not" keywords to use appropriate productions rather than literals.
1246 <li>Clarified definition of support used for interpreting ''@support'' rules
1247 and its relationship to CSS forwards-compatible parsing rules.
1248 </ul>
1250 <h2 class=no-num id="acknowledgments">Acknowledgments</h2>
1252 <p>
1253 Thanks to the ideas and feedback from
1254 Tab Atkins,
1255 Arthur Barstow,
1256 Ben Callahan,
1257 <span lang="tr">Tantek Çelik</span>,
1258 Alex Danilo,
1259 Elika Etemad,
1260 Pascal Germroth,
1261 <span lang="de">Björn Höhrmann</span>,
1262 Paul Irish,
1263 <span lang="nl">Anne van Kesteren</span>,
1264 Vitor Menezes,
1265 Alex Mogilevsky,
1266 Chris Moschini,
1267 James Nurthen,
1268 Simon Pieters,
1269 <span lang="fr">Florian Rivoal</span>,
1270 <span lang="fr">Simon Sapin</span>,
1271 Nicholas Shanks,
1272 Ben Ward,
1273 Zack Weinberg,
1274 Estelle Weyl,
1275 Boris Zbarsky,
1276 and all the rest of the <a href="http://lists.w3.org/Archives/Public/www-style/">www-style</a> community.
1278 </p>
1280 <h2 class=no-num id="references">References</h2>
1283 <h3 class="no-num" id="normative-references">Normative references</h3>
1284 <!--normative-->
1286 <h3 class="no-num" id="other-references">Other references</h3>
1287 <!--informative-->
1289 <h2 class="no-num" id="index">Index</h2>
1290 <!--index-->
1292 </body>
1293 </html>
1294 <!-- Keep this comment at the end of the file
1295 Local variables:
1296 mode: sgml
1297 sgml-declaration:"~/SGML/HTML4.decl"
1298 sgml-default-doctype-name:"html"
1299 sgml-minimize-attributes:t
1300 sgml-nofill-elements:("pre" "style" "br")
1301 sgml-live-element-indicator:t
1302 sgml-omittag:nil
1303 sgml-shorttag:nil
1304 sgml-namecase-general:t
1305 sgml-general-insert-case:lower
1306 sgml-always-quote-attributes:t
1307 sgml-indent-step:nil
1308 sgml-indent-data:t
1309 sgml-parent-document:nil
1310 sgml-exposed-tags:nil
1311 sgml-local-catalogs:nil
1312 sgml-local-ecat-files:nil
1313 End:
1314 -->