Getting Started with CSS @property Rule

The CSS @property is a powerful feature that brings more control and flexibility to custom properties, also known as CSS variables.

It is introduced as part of the CSS Houdini project, which is designed to provide developers with deeper access to the browser’s rendering engine. The @property rule allows you to define custom properties with specific types, default values, and even the capability to animate CSS properties.

In this article, we’ll explore what the @property rule is, why it’s useful, and how you can leverage it in your web projects.

What is @property for?

CSS custom properties, also known as CSS variables, have made styles more reusable. It allows you to define a value once and use it throughout your stylesheet.

However, one limitation has been the inability to specify a property’s type or set default values directly in CSS. This means any value can be assigned to a custom property, which can lead to unexpected results and make it harder to maintain your styles in some situations.

This is where the @property rule comes in. It allows you to set a default value, provides a fallback value that will be used if the custom property is not explicitly set, enables custom property animation, and defines a type for a custom property.

This ensures that a variable can only accept a specific data type, such as a length, color, or number.

The type of the property is defined with the syntax property. It accepts a string value defining the CSS type value, as follows:

Type Description
<length> Any valid <length> values e.g., 10px, 2em, 50%, 3rem
<number> Any valid <number> values e.g., 1, 0.5, -3, 100
<percentage> Any valid <percentage> values e.g., 50%, 100%, 25%
<length-percentage> Any valid <length-percentage> values e.g., 10px, 50%, 2em, 75%
<color> Any valid <color> values e.g., #ff0000, rgb(255, 0, 0), rgba(255, 0, 0, 0.5), blue
<image> Any valid <image> values e.g., url(image.jpg), linear-gradient(to right, red, blue)
<url> Any valid url() values e.g., url(‘https://example.com/image.jpg’)
<integer> Any valid <integer> values e.g., 1, -10, 42
<angle> Any valid <angle> values e.g., 45deg, 0.5turn, 1rad
<time> Any valid <time> values e.g., 1s, 500ms, 0.75s
<resolution> Any valid <resolution> values e.g., 300dpi, 2dppx
<transform-function> Any valid <transform-function> values e.g., rotate(45deg), scale(1.5), translateX(100px)
<custom-ident> Any valid <custom-ident> values e.g., –my-variable, custom-identifier
<transform-list> A list of valid <transform-function> values e.g., rotate(45deg) scale(1.5) translateX(100px)

Example

Let’s say we have a button component. We’d like to define some defaults on this component. Traditionally, we could use custom properties to define the background color and border radius of the button component, like so:

.button {
  background-color: #fff;
  border-radius: 8px;
}

Or, use CSS variables to define the values once and reuse them throughout the stylesheet:

:root {
  --button-bg: #fff;
  --button-rounded: 8px;
}

But, what if we want to ensure that the background color is always a valid color value, and the border radius is always a valid length value?

We can use the @property rule to define the type of these custom properties and set default values.

To do so, we could create a couple of custom properties defined with the following options in the @property rule:

@property --button-bg {
  syntax: '<color>';
  initial-value: #0D74CE;
  inherits: false;
}
@property --button-rounded {
  syntax: '<length>';
  initial-value: 8px;
  inherits: false;
}

In this example, we have two custom properties defining the background color and border radius of the button component.

We use the syntax property to define the type of the custom property, while the initial-value property sets the default value.

We also use the inherits property to specify whether the custom property inherits its value from its parent element, in which case we set them all to false to avoid inheritance.

Once they are set, we can now use these custom properties in our styles, like so:

.button {
  background-color: var(--button-bg);
  border-radius: var(--button-rounded);
}

See the Pen CSS @property by HONGKIAT (@hkdc) on CodePen.

Wrapping up

The CSS @property rule brings a significant step forward to CSS custom properties, or CSS variables. All major and latest browsers already support the CSS @property rule.

Browser Desktop Version Mobile Version
Google Chrome 85 and later 85 and later
Mozilla Firefox 128 and later Not supported
Safari 15.4 and later 15.4 and later (iOS)
Microsoft Edge 85 and later 85 and later
Opera 71 and later 71 and later
Samsung Internet 14.0 and later 14.0 and later

To sum up, the CSS @property rule is a powerful feature and a great addition to the CSS language that can help you write more maintainable and type-safe stylesheets. If you haven’t already, give it a try in your next project!

WebsiteFacebookTwitterInstagramPinterestLinkedInGoogle+YoutubeRedditDribbbleBehanceGithubCodePenWhatsappEmail