The standard advice for making a product “pop” seems to be turning the colors up until the user’s eyes hurt. CSS saturate() takes most of that abuse, and it costs you both accessibility and balance. The more common version of the mistake is chaining filters without knowing how the browser paints them.
After 14 years on WordPress themes, the design work I am happiest with is the work nobody notices. CSS saturate() is a correction tool, not a volume knob, and 200% on every image is not a style. Filters dropped onto <img> tags with no plan behind them buy you a performance bottleneck, a broken stacking context, or both.
How CSS saturate() works
The function itself is simple. It takes one argument, a number or a percentage, and adjusts color intensity. 0 or 0% gives you a fully grayscale element, 1 or 100% leaves the element alone, and anything higher pushes the colors toward pure hue.
/* Subtle boost for product cards */
.product-card img {
filter: saturate(1.2); /* 120% saturation */
}
/* Grayscale effect for inactive elements */
.is-disabled {
filter: saturate(0);
}
Chaining is where it gets interesting and where it usually goes wrong. On one project the developer had chained saturate(), contrast() and sepia() without knowing that browsers apply filters in the order they are declared. The images came out looking like a 2012 Instagram mistake. For the readability side of the same problem, I wrote a guide on improving theme readability with the CSS contrast() filter.
The backdrop-filter trap
CSS saturate() is not tied to the filter property. With backdrop-filter you saturate whatever sits behind an element, which is how the glassmorphism look in modern dashboards is built. A blurred, saturated navigation bar needs no pre-processed image at all.
.glass-header {
background: rgba(255, 255, 255, 0.3);
backdrop-filter: blur(10px) saturate(180%);
-webkit-backdrop-filter: blur(10px) saturate(180%);
}
The catch is that backdrop-filter creates a new stacking context. On a layout with layered z-index values, adding the filter can hide a dropdown or swallow a tooltip, and nothing in the CSS you just wrote tells you why.
Performance notes
The W3C Filter Effects Module defines saturation as a color matrix multiplication, which the browser runs pixel by pixel. Put a heavy CSS saturate() filter on a large hero image that also animates on scroll and you will drop frames.
- Animation: keep saturation filters off animated elements on mobile wherever you can.
- Hardware acceleration: reach for
will-change: filter;only when you have no other option. - Support: check MDN before you rely on it, though coverage in current browsers is broad.
If CSS saturate() is eating your dev hours, I can take it off your plate. I have been working on WordPress since the 4.x days.
What to do with it
Saturation will not rescue bad photography. Use CSS saturate() to harmonize a UI, to pull user-generated images closer to your palette, or to give a glass effect some depth. In practice 120% covers nearly all of it, and past that you are just adding noise.