CSS @support
The @supports
rule in CSS to be a powerful tool for feature detection. This rule allows you to write conditional CSS that will only be applied if the browser supports a particular property or value, making it easier to implement progressive enhancement and graceful degradation strategies.
Syntax
The basic syntax of @supports
is as follows:
@supports (CSS feature) {
/* CSS rules for browsers that support the feature */
}
You can also use logical operators like and
, or
, and not
to test multiple features:
@supports (display: grid) and (grid-template-areas: none) {
/* CSS rules for browsers that support both features */
}
Examples
Using
@supports
for Grid Layout@supports (display: grid) {
.container {
display: grid;
grid-template-columns: 1fr 1fr;
}
}Using
@supports
with Logical Operators@supports (display: flex) or (display: grid) {
/* CSS rules for browsers that support either flexbox or grid */
}Using
@supports
withnot
Operator@supports not (display: table-cell) {
/* CSS rules for browsers that do not support display: table-cell */
}
Best Practices
Progressive Enhancement: Use
@supports
to provide an enhanced experience for browsers that support newer CSS features, while offering a basic experience for others.Avoid Redundancy: Don't repeat the same styles inside and outside of the
@supports
rule. Only include the styles that are specific to the feature you're testing.Testing Multiple Features: If you need to test for the support of multiple features, use logical operators to combine multiple conditions.
Browser Support: While
@supports
is widely supported, some older browsers may not recognize it. In such cases, the contained styles will simply be ignored, so make sure to provide sensible defaults.Feature Queries and JavaScript: You can also use JavaScript to test for CSS support using
CSS.supports()
method, which can be useful for more complex logic that can't be expressed in CSS alone.
if (window.CSS && CSS.supports("display", "grid")) {
// Do something
}