DEV Community

KAMAL KISHOR
KAMAL KISHOR

Posted on

Elevate Your CSS with Typed CSS Variables Using `@property`

Introduction

If you’ve been defining CSS variables inside the :root and faced challenges debugging them, it’s time to level up your game with @property. This powerful feature allows you to create typed CSS variables, providing implicit data validation, animation capabilities, and more.

In this blog post, we’ll explore how @property can redefine your CSS experience by making variables easier to debug, ensuring valid values, and enabling animations.

The Traditional Approach: :root

Traditionally, CSS variables are defined within the :root selector, like this:

:root {
  --color: #586de7;
  --size: 20px;
  --cols: 12;
}
Enter fullscreen mode Exit fullscreen mode

While this approach works, it has several limitations:

  1. Unclear Types: The types of variables are not explicit. Is --size a length, a number, or something else?
  2. No Validation: Invalid values can slip through unnoticed, causing rendering issues.
  3. Debugging Difficulties: Debugging variable issues in DevTools can be challenging as the browser provides limited assistance.

The Modern Approach: @property

Enter @property, a game-changer for defining CSS variables with explicit types and built-in validation. Here’s how it looks:

@property --color {
  syntax: '<color>';
  inherits: true;
  initial-value: #586de7; 
}
@property --size {
  syntax: '<length>';
  inherits: true;
  initial-value: 20px; 
}
@property --cols {
  syntax: '<integer>';
  inherits: true;
  initial-value: 12; 
}
Enter fullscreen mode Exit fullscreen mode

Benefits of Using @property

  1. Typed Variables: Clearly define the type of each variable, making your CSS more predictable and robust.
  2. Implicit Data Validation: The browser will automatically validate the values, falling back to the initial value if the provided value is invalid.
  3. Ease of Debugging: DevTools can now assist in debugging by highlighting invalid values and suggesting corrections.
  4. Animation Support: Typed variables can be animated if the type allows it, opening new possibilities for dynamic styling.

Example: Data Validation through DevTools

Imagine setting --color to an invalid value like darkpink. With @property, the browser will show a warning and use the initial-value as a fallback.

Without @property

:root {
  --color: darkpink; /* No way to know the issue here! */
}
Enter fullscreen mode Exit fullscreen mode

With @property

@property --color {
  syntax: '<color>';
  inherits: true;
  initial-value: #586de7; 
}
Enter fullscreen mode Exit fullscreen mode

In DevTools, you’ll see a warning for darkpink, and the browser will use #586de7 instead.

Real-World Example

Let’s see a practical example of using @property to define and animate a variable.

@property --rotate {
  syntax: '<angle>';
  inherits: false;
  initial-value: 0deg;
}

div {
  width: 100px;
  height: 100px;
  background-color: var(--color);
  transform: rotate(var(--rotate));
  transition: transform 1s;
}

div:hover {
  --rotate: 360deg;
}
Enter fullscreen mode Exit fullscreen mode

In this example, hovering over the div will animate its rotation from 0deg to 360deg.

Conclusion

Typed CSS variables with @property offer a robust, modern approach to defining CSS variables. They enhance your CSS by providing type safety, validation, and improved debugging capabilities, making your stylesheets more maintainable and reliable.

Start using @property today and experience a new level of control and confidence in your CSS development. Happy styling!


Top comments (0)