- From: Jochen Kühner via GitHub <noreply@w3.org>
- Date: Sat, 26 Jul 2025 13:28:27 +0000
- To: public-css-archive@w3.org
# Proposal: Support typed `attr()` in CSS `@if()` conditional rules
## Summary
Extend the CSS conditional `@if()` syntax to support attribute-based tests using the typed `attr()` function, consistent with the latest CSS Values and Units specification. This enables more expressive, type-safe conditional styling based on HTML attributes.
---
## Motivation
CSS currently lacks the ability to conditionally apply styles based on element attribute values inside `@if()` conditionals. While attribute selectors provide some capabilities, they don’t allow for complex logic, type casting, or fallback handling.
The new typed `attr()` syntax, defined in [CSS Values and Units Level 4](https://www.w3.org/TR/css-values-4/#attr-notation), supports specifying types (e.g., `number`, `length`, `color`) and fallback values, enabling CSS to interpret attribute values reliably.
Incorporating typed `attr()` into `@if()` would:
- Provide powerful, declarative conditions directly in CSS without requiring JavaScript.
- Enable numeric, boolean, and other typed comparisons on attribute values.
- Maintain consistency with existing `attr()` use in CSS (e.g., content generation).
- Simplify styling logic and improve maintainability.
---
## Example
```
@layer utilities {
.progress-bar {
width: 100px;
background: gray;
@if (attr(data-progress number, 0) > 50) {
background: green;
}
@if (attr(data-progress number, 0) <= 50) {
background: orange;
}
}
}
```
Here, the `data-progress` attribute is interpreted as a number with a fallback of 0. The bar's background color changes conditionally based on the attribute's numeric value.
---
## Proposed syntax and behavior
- Support `attr()` in `@if()` conditions with full typed syntax: `attr(<attr-name> <type>?, <fallback>?)`.
- Allow all comparison operators: `==`, `!=`, `<`, `<=`, `>`, `>=`.
- Evaluate the typed attribute value, falling back if missing or invalid.
- Use standard CSS parsing and typing rules consistent with `attr()` elsewhere.
---
## Additional considerations
- Scope: Conditions should apply per element context where the attribute exists.
- Performance: Typed attribute access should be optimized in CSS engines.
- Fallbacks: Fallback values provide safety if attributes are absent or malformed.
- Error handling: Invalid casts should use fallback or evaluate as false in conditions.
---
## Benefits
- Dramatically improved expressiveness for conditional CSS.
- Alignment with modern CSS features and specifications.
- Reduced dependency on JavaScript for styling logic.
- Better maintainability and readability of stylesheets.
---
Would love to hear thoughts or feedback on this proposal!
--
GitHub Notification of comment by jogibear9988
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/12519#issuecomment-3121846259 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Saturday, 26 July 2025 13:28:28 UTC