1.
Introduction
The value definition field of each CSS property can contain keywords,
data types (which appear between
and
),
and information on how they can be combined.
Generic data types (

being the most widely used)
that can be used by many properties are described in this specification,
while more specific data types (e.g.,

are described in the corresponding modules.
1.1.
Module Interactions
This module replaces and extends the data type definitions in
[CSS2]
sections
1.4.2.1
4.3
and
A.2
2.
Value Definition Syntax
The
value definition syntax
described here
is used to define the set of valid values for CSS properties
(and the valid syntax of many other parts of CSS).
A value so described can have one or more components.
2.1.
Component Value Types
Component value types are designated in several ways:
Keyword
values (such as
auto
disc
, etc.),
which appear literally, without quotes (e.g.
auto
).
Basic data types,
which appear between
and
(e.g.,


, etc.).
For
numeric data types
this type notation can annotate any range restrictions
using the
bracketed range notation
described below.
Property value ranges,
which represent the same pattern of values as a property bearing the same name.
These are written as the property name,
surrounded by single quotes,
between
and
e.g.,
<'border-width'>
<'background-attachment'>
, etc.
These types
do not
include
CSS-wide keywords
such as
inherit
Additionally,
if the property’s value grammar
is a
comma-separated repetition
the corresponding type
does not include the top-level
comma-separated list multiplier
(E.g. if a property named
pairing
is defined as


? ]#
then
<'pairing'>
is equivalent to


? ]
not


? ]#
.)\
Why remove the multiplier?
The top-level multiplier is ripped out of these value types
because top-level comma-separated repetitions are mostly used for
coordinating list properties
and when a shorthand combines several such properties,
it needs the unmultiplied grammar
so it can construct its
own
comma-separated repetition.
Without this special treatment,
every such longhand would have to be defined
with an ad-hoc production just for the inner value,
which makes the grammars harder to understand overall.
Functional notations and their arguments.
These are written as the function’s name,
followed by an empty parentheses pair,
between
and
e.g.

and references the correspondingly-named
functional notation
Other non-terminals.
These are written as the name of the non-terminal
between
and
as in

Notice the distinction between

and
<'border-width'>
the latter represents the grammar of the
border-width
property,
the former requires an explicit expansion elsewhere.
The definition of a non-terminal is typically located near its first appearance in the specification.
Some property value definitions also include the slash (/),
the comma (,),
and/or parentheses as literals.
These represent their corresponding tokens.
Other non-keyword literal characters that may appear in a component value,
such as “+”,
must be written enclosed in single quotes.
Commas
specified in the grammar are implicitly omissible
in some circumstances,
when used to separate optional terms in the grammar.
Within a top-level list in a property or other CSS value,
or a function’s argument list,
a comma specified in the grammar must be omitted if:
all items preceding the comma have been omitted
all items following the comma have been omitted
multiple commas would be adjacent (ignoring
white space
/comments),
due to the items between the commas being omitted.
For example, if a function can accept three arguments in order,
but all of them are optional,
the grammar can be written like:
example
first
second
third
Given this grammar,
writing
example(first, second, third)
is valid,
as is
example(first, second)
or
example(first, third)
or
example(second)
However,
example(first, , third)
is invalid, as one of those commas are no longer separating two options;
similarly,
example(,second)
and
example(first,)
are invalid.
example(first second)
is also invalid,
as commas are still required to actually separate the options.
If commas were not implicitly omittable,
the grammar would have to be much more complicated
to properly express the ways that the arguments can be omitted,
greatly obscuring the simplicity of the feature.
All CSS properties also accept the
CSS-wide keyword values
as the sole component of their property value.
For readability these are not listed explicitly in the property value syntax definitions.
For example, the full value definition of
border-color
under
CSS Cascading and Inheritance Level 3
is

| inherit | initial | unset
(even though it is listed as

).
Note:
This implies that, in general,
combining these keywords with other component values in the same declaration
results in an invalid declaration.
For example,
background: url(corner.png) no-repeat, inherit;
is invalid.
2.2.
Component Value Combinators
Component values can be arranged into property values as follows:
Juxtaposing components means that
all of them must occur, in the given order.
A double ampersand (
&&
) separates two or more components,
all of which must occur, in any order.
A double bar (
||
) separates two or more options:
one or more of them must occur, in any order.
A bar (
) separates two or more alternatives:
exactly one of them must occur.
Brackets ([ ]) are for grouping.
Juxtaposition is stronger than the double ampersand, the double
ampersand is stronger than the double bar, and the double bar
is stronger than the bar. Thus, the following lines are equivalent:
a b | c || d && e f
a b
c ||
d &&
e f
]]]
For reorderable combinators (||, &&),
ordering of the grammar does not matter:
components in the same grouping may be interleaved in any order.
Thus, the following lines are equivalent:
a || b || c
b || a || c
Note:
Combinators are
not
associative, so grouping is significant.
For example,
a || b || c
and
a || [ b || c ]
are distinct grammars:
the first allows a value like
b a c
, but the second does not.
2.3.
Component Value Multipliers
Every type, keyword, or bracketed group may be followed by one of
the following modifiers:
An asterisk (
indicates that the preceding type, word, or group
occurs zero or more times.
A plus (
indicates that the preceding type, word, or group
occurs one or more times.
A question mark (
indicates that the preceding type, word, or group
is optional (occurs zero or one times).
A single number in curly braces (
indicates that the preceding type, word, or group
occurs
times.
A comma-separated pair of numbers in curly braces (
indicates that the preceding type, word, or group
occurs at least
and at most
times.
The
may be omitted ({
,})
to indicate that there must be at least
repetitions,
with no upper bound on the number of repetitions.
A hash mark (
indicates that the preceding type, word, or group
occurs one or more times, separated by comma tokens
(which may optionally be surrounded by
white space
and/or comments).
It may optionally be followed by the curly brace forms, above,
to indicate precisely how many times the repetition occurs,
like
#{1,4}
An exclamation point (
) after a group
indicates that the group is required
and must produce at least one value;
even if the grammar of the items within the group
would otherwise allow the entire contents to be omitted,
at least one component value must not be omitted.
The
and
multipliers may be stacked as
+#
similarly, the
and
multipliers may be stacked as
#?
These stacks each represent the later multiplier
applied to the result of the earlier multiplier.
(These same stacks can be represented using grouping,
but in complex grammars this can push the number of brackets beyond readability.)
For repeated component values (indicated by
, or
),
UAs
must support at least 20 repetitions of the component.
If a property value contains more than the supported number of repetitions,
the declaration must be ignored as if it were invalid.
2.4.
Combinator and Multiplier Patterns
There are a small set of common ways to combine multiple independent
component values
in particular numbers and orders.
In particular, it’s common to want to express that,
from a set of component value,
the author must select zero or more, one or more, or all of them,
and in either the order specified in the grammar or in any order.
All of these can be easily expressed using simple patterns of
combinators
and
multipliers
in order
any order
zero or more
A? B? C?
A? || B? || C?
one or more
A? B? C?
A || B || C
all
A B C
A && B && C
Note that all of the "any order" possibilities are expressed using combinators,
while the "in order" possibilities are all variants on juxtaposition.
2.5.
Component Values and White Space
Unless otherwise specified,
white space
and/or comments may appear before, after, and/or between
components combined using the above
combinators
and
multipliers
Note:
In many cases, spaces will in fact be
required
between components
in order to distinguish them from each other.
For example, the value
1em2em
would be parsed as a single

with the number
and the identifier
em2em
which is an invalid unit.
In this case, a space would be required before the
to get this parsed as the two lengths
1em
and
2em
2.6.
Property Value Examples
Below are some examples of properties with their corresponding value
definition fields
Property
Value definition field
Example value
orphans

text-align
left | right | center | justify
center
padding-top
|
5%
outline-color
| invert
#fefefe
text-decoration
none | underline || overline || line-through || blink
overline underline
font-family
[ | ]#
"Gill Sans", Futura, sans-serif
border-width
[ | thick | medium | thin ]{1,4}
2px medium 4px
box-shadow
[ inset? && {2,4} && ? ]# | none
3px 3px rgba(50%, 50%, 50%, 50%), lemonchiffon 0 0 4px inset
3.
Textual Data Types
The
textual data types
include
various keywords and identifiers
as well as strings (

) and URLs (

).
CSS
identifiers
generically denoted by

consist of a sequence of characters conforming to the

grammar.
[CSS-SYNTAX-3]
Identifiers cannot be quoted;
otherwise they would be interpreted as strings.
CSS properties accept two classes of
identifiers
pre-defined keywords
and
author-defined identifiers
Note:
The

production is not meant for property value definitions—​

should be used instead.
It is provided as a convenience for defining other syntactic constructs.
3.1.
Pre-defined Keywords
In the value definition fields,
keywords
with a pre-defined meaning appear literally.
Keywords are
identifiers
and are interpreted
ASCII case-insensitively
(i.e., [a-z] and [A-Z] are equivalent).
For example, here is the value definition for the
border-collapse
property:
Value
collapse | separate
And here is an example of its use:
table
border-collapse
separate
As defined
above
all properties accept the
CSS-wide keywords
which represent value computations common to all CSS properties.
These keywords are normatively defined in
the
CSS Cascading and Inheritance Module
Tests
Other CSS specifications can define additional CSS-wide keywords.
3.2.
Author-defined Identifiers: the

type
Some properties accept arbitrary author-defined identifiers as a component value.
This generic data type is denoted by

and represents any valid
CSS identifier
that would not be misinterpreted as a pre-defined keyword in that property’s value definition.
Such identifiers are fully case-sensitive,
even in the ASCII range
(e.g.
example
and
EXAMPLE
are two different, unrelated user-defined identifiers).
The
CSS-wide keywords
are not valid

s.
The
default
keyword is reserved
and is also not a valid

Specifications using

must specify clearly
what other keywords are excluded from

, if any—​for example by saying that any pre-defined keywords in that property’s value definition are excluded.
Excluded keywords are excluded in all
ASCII case permutations
When parsing positionally-ambiguous keywords in a property value,

production can only claim the keyword if no other unfulfilled production can claim it.
Note:
When designing grammars with

the

should always be “positionally unambiguous”,
so that it’s impossible to conflict with any keyword values in the property.
3.3.
Quoted Strings: the

type
Strings
are denoted by

When written literally,
they consist of a sequence of characters delimited by double quotes or single quotes,
corresponding to the

production
in the
CSS Syntax Module
[CSS-SYNTAX-3]
Double quotes cannot occur inside double quotes, unless
escaped
(as
"\"
or as
"\22"
).
Analogously for single quotes (
'\'
or
'\27'
).
content
"this is a 'string'."
content
"this is a \"
string\
"."
content
'this is a "string".'
content
'this is a \'
string\
'.'
It is possible to break strings over several lines, for aesthetic or
other reasons, but in such a case the newline itself has to be escaped
with a backslash (\). The newline is subsequently removed from the
string. For instance, the following two selectors are exactly the
same:
Example(s):
title=
"a not s\
o very long title"
/*...*/
title=
"a not so very long title"
/*...*/
Since a string cannot directly represent a newline, to include a
newline in a string, use the escape "\A". (Hexadecimal A is the line
feed character in Unicode (U+000A), but represents the generic notion
of "newline" in CSS.)
3.4.
Resource Locators: the

type
The
url()
functional notation
denoted by

represents a
URL
which is a pointer to a resource.
The typical syntax of a

is:

url


This example shows a URL being used as a background image:
body
background
url
"http://www.example.com/pinkish.gif"
url()
can alternatively be written be written without quotation marks around the URL value,
in which case it is
specially-parsed
as a

; see
CSS Syntax 3
§ 4.3.6 Consume a url token
[CSS-SYNTAX-3]
For example, the following declarations are identical:
background
url
"http://www.example.com/pinkish.gif"
);
background
url
);
Note:
The unquoted
url()
syntax cannot accept a

argument
and has extra escaping requirements:
parentheses,
whitespace
characters,
single quotes (') and double quotes (") appearing in a URL
must be escaped with a backslash,
e.g.
url(open\(parens)
url(close\)parens)
(In quoted

url()
s,
only newlines and the character used to quote the string need to be escaped.)
Depending on the type of URL,
it might also be possible to write these characters as URL-escapes
(e.g.
url(open%28parens)
or
url(close%29parens)
as described in
[URL]
Some CSS contexts (such as
@import
) also allow a

to be represented by a bare

, without the function wrapper.
In such cases the string behaves identically to a
url()
function containing that string.
For example, the following statements act identically:
@import
url
"base-theme.css"
);
@import
"base-theme.css"
3.4.1.
Relative URLs
In order to create modular style sheets that are not dependent on
the absolute location of a resource, authors should use relative URLs.
Relative URLs (as defined in
[URL]
) are resolved to full URLs
using a base URL. RFC 3986, section 3, defines the normative
algorithm for this process.
For CSS style sheets, the base URL is that of the style sheet itself,
not that of the styled source document.
Style sheets embedded within a document have
the base URL associated with their container.
Note:
For HTML documents,
the
base URL is mutable
When a

appears in the computed value of a property,
it is resolved to an absolute URL,
as described in the preceding paragraph.
The computed value of a URL that the
UA
cannot resolve to an absolute URL is the specified value.
For example, suppose the following rule:
body
background
url
"tile.png"
is located in a style sheet designated by the URL:
http
//www.example.org/style/basic.css
The background of the source document’s

will be tiled with whatever image is described by the resource designated by the URL:
http
//www.example.org/style/tile.png
The same image will be used regardless of the URL of the source document containing the

3.4.1.1.
Fragment URLs
To work around some common eccentricities in browser URL handling,
CSS has special behavior for fragment-only urls.
If a
url()
’s value starts with a U+0023 NUMBER SIGN (
) character,
parse it as per normal for URLs,
but additionally set the
local url flag
of the
url()
When matching a
url()
with the
local url flag
set,
ignore everything but the URL’s fragment,
and resolve that fragment against the current document that relative URLs are resolved against.
This reference must always be treated as same-document
(rather than cross-document).
When
serializing
url()
with the
local url flag
set,
it must serialize as just the fragment.
What “browser eccentricities”?
Theoretically, browsers should re-resolve any relative URLs,
including fragment-only URLs,
whenever the document’s base URL changes
(such as through mutation of the
base
element,
or calling
pushState()
).
In many cases they don’t, however,
and so without special handling,
fragment-only URLs will suddenly become cross-document references
(pointing at the previous base URL)
and break in many of the places they’re used.
Since fragment-only URLs express a clear semantic
of wanting to refer to the current document
regardless of what its current URL is,
this hack preserves the expected behavior at least in these cases.
3.4.2.
Empty URLs
If the value of the

is the empty string
(like
url("")
or
url()
),
the url must resolve to an invalid resource
(similar to what the url
about:invalid
does).
Its computed value is
url("")
and it must serialize as such.
Tests
Note:
This matches the behavior of empty urls for embedded resources elsewhere in the web platform,
and avoids excess traffic re-requesting the stylesheet or host document
due to editing mistakes leaving the
url()
value empty,
which are almost certain to be invalid resources for whatever the
url()
shows up in.
Linking on the web platform
does
allow empty urls,
so if/when CSS gains some functionality to control hyperlinks,
this restriction can be relaxed in those contexts.
3.4.3.
URL Modifiers
The
url()
function supports specifying additional

s,
which change the meaning or the interpretation of the URL somehow.

is either an

or a
functional notation
This specification does not define any

s,
but other specs may do so.
Note:

that is either unquoted or not wrapped in
url()
notation
cannot accept any

s.
4.
Numeric Data Types
Numeric data types are used to represent
quantities, indexes, positions, and other such values.
Although many syntactic variations can exist
in expressing the quantity (numeric aspect) in a given numeric value,
the
specified
and
computed value
do not distinguish these variations:
they represent the value’s abstract quantity,
not its syntactic representation.
The
numeric data types
include



and various
dimensions
including