Using CSS properties

This is an experimental technologyBecause this technology's specification has not stabilized, check the compatibility table for usage in various browsers. Also note that the syntax and behavior of an experimental technology is subject to change in future versions of browsers as the specification changes.

CSS Properties are entities defined by CSS authors which contain specific values to be reused throughout a document. They are set using custom property notation (e.g. --main-color: black;) and are accessed using the var() function (e.g. color: var(--main-color);) .

Complex websites have very large amounts of CSS, often with a lot of repeated values. For example, the same colour might be used in hundreds of different places, requiring global search and replace if that colour needs to change. CSS properties allow a value to be stored in one place, then referenced in multiple other places. An additional benefit is semantic identifiers. For example --main-text-color is easier to understand than #00ff00, especially if this same color is also used in another context.

CSS Properties are subject to the cascade, and inherit their value from their parent.

Basic usage

Declaring a property:

element {
--main-bg-color: brown;
}

Using the property:

element {
background-color: var(--main-bg-color);
}

Note: The custom property prefix was var- in the earlier spec, but later changed to --. Firefox 31 and above follow the new spec. (bug 985838)

First steps with CSS Properties

Let's start with this simple CSS that colors elements of different classes with the same color:

Notice the repetition in the CSS. The background color is set to brown in several places. For some CSS declarations, it is possible to declare this higher in the cascade and let CSS inheritance solve this problem naturally. For non-trivial projects, this is not always possible. By declaring a property on the :root pseudo-class, a CSS author can halt some instances of repetition by using the property.

for the class="one" element: invalid value, which is the default value of any custom property.

Validity and values

The classical CSS concept of validity, tied to each property, is not very useful in regard to custom properties. When the values of the custom properties are parsed, the browser doesn't know where they will be used, so must therefore consider nearly all values as valid.

Unfortunately, these valid values can be used, via the var() functional notation, in a context where they might not make sense. Properties and custom properties can lead to invalid CSS statements, leading to the new concept of valid at computed time.

[1] Chrome initially implemented this feature using a different syntax, which required to prefix custom property names with -webkit-var- to define them. They could then be used unprefixed within a -webkit-var() function. Additionally, the implementation was hidden behind the Enable experimental WebKit features flag under chrome://flags, later renamed to Enable experimental Web Platform features.

[2] Chrome 34.0 removed this feature due to performance issues.

[3] This feature is implemented behind the preference layout.css.properties.enabled, defaulting to false and using the old var-propertyname syntax in Gecko 29. Starting from Gecko 31 the preference is enabled by default and the new --propertname syntax is used.