Invert Colours With One CSS Filter
CSS can invert an element’s colours with one declaration:
.invert {
filter: invert(100%);
}
Apply the class to any element that needs the effect:
<div class="invert">This element's colours will be inverted.</div>
invert(100%) maps each colour to its opposite. Black becomes white, white becomes black, and images inside the element are inverted too. That last part makes this a visual effect rather than a reliable way to build dark mode.
Inverting the whole page
The filter can be applied to body if you really want everything on the page to change:
body {
filter: invert(100%);
}
This also affects photographs, videos, shadows, and brand colours. Technically it works, but I would not use it as a substitute for choosing proper theme colours.
The function accepts values from 0% to 100%:
.invert {
filter: invert(50%);
}
At 50%, colours move towards neutral grey. It is not a gentler full inversion, which is an easy detail to miss.
Fallbacks for older browsers
When this article was written, older browser support could be handled with @supports:
@supports (filter: invert(100%)) {
.invert {
filter: invert(100%);
}
}
Older Safari versions used the prefixed property:
.invert {
-webkit-filter: invert(100%);
filter: invert(100%);
}
For a deliberate visual treatment, invert() is pleasantly small. For interface themes, use explicit colours and leave the photos alone.