The CSS invert() function inverts an element’s color pixels into their opposite (or negative) value. It is used with the filter and backdrop-filter properties, which allow us to apply varying visual effects, like blur(), grayscale(), sepia(), and yes, invert().
.element {
filter: invert();
}
The CSS invert() function is listed in the Filter Effects Module Level 1 specification.
Syntax
The invert() function has the next syntax, which says how much you wish to invert the image.
invert(amount)
Officially, it is:
<invert()> = invert( [ <number> | <percentage> ]? )
Arguments
/* fully inverted */
filter: invert();
filter: invert(1);
filter: invert(100%);
/* partially inverted */
filter: invert(0.2); /* 80% inverted */
filter: invert(0.7); /* 30% inverted */
filter: invert(50%); /* 50% inverted. demo shows as full gray */
/* Normal */
filter: invert(0);
filter: invert(0%);
amount: Theinvert()function takes an optional amount argument, which can be a number or a percentage value, ranging from0to1and0%to100%, respectively.0(or0%) are the lowest values, so they leave the image unchanged, while1(or100%) are the highest values, completely inverting the image. You can increase the amount beyond1(or100%), but they will max out at that point and will not invert the element’s colors any further.
Without an argument, the invert() function uses 1 as its default. In the case of an interpolation, say an animation or transition, the initial value is 0.
.element-1 {
filter: invert(); /* default is 1 */
}
.element-2 {
transition: filter 1s; /* default is 0 */
&:hover {
filter: invert(1);
}
}
Flipping icon colors
Flipping icon colors without requiring a new file is a regular use of the invert() function. In web applications, you often use SVG/PNG icons (like logos, social icons, or status icons). If you only have a dark version of an icon, instead of creating a separate light version in a new image file, you can use the invert() function to flip, or reverse, the color so it appears light instead of dark.
.flipped {
filter: invert(100%);
}
Switching to dark mode with invert()
We can technically use the invert() function as an alternative approach to toggling a design from light mode to dark mode. We apply the invert() function to the <body> element when the user prefers a dark color scheme, and again on images, videos, and iframes to make sure they are not inverted at the same time:
/* Dark mode */
@media (prefers-color-scheme: dark) {
body {
filter: invert(100%) hue-rotate(180deg);
background: black;
}
/* Re-invert images/videos/iframes so they appear normal */
img,
video,
iframe {
filter: invert(100%) hue-rotate(180deg);
}
}
Switch your browser’s theme to dark to check it out. It’s really nice.
Specification
The CSS invert() function is listed in the Filter Effects Module Level 1 specification, amongst other filter functions.
Browser support
The invert() function is fully supported across all modern browsers.
Related
backdrop-filter
.element { backdrop-filter: blur(10px); }
filter
.element { filter: blur(3px); }
blur()
.element { filter: blur(5px); }
brightness()
.element { filter: brightness(1.5); }
drop-shadow()
.element { filter: drop-shadow(#301934 20px 10px 4px); }
grayscale()
.element { filter: grayscale(100%); }
hue-rotate()
.element { filter: hue-rotate(160deg); }
opacity()
.element { filter: opacity(50%); }
invert()
.element { filter: invert(0.8); }
url()
.element { background-image: url("https://example.com/image.png"); }