Dark-mode theme switcher

The HTML:

<html data-theme="light">
<!-- ... -->
<a href="#" id="toggle_darkmode">toggle dark-mode</a>


The CSS:

html {
    --background-color-hue: 0;
    --background-color: hsl(var(--background-color-hue), 0%, 100%);
    --text-color-hue: 0;
    --text-color: hsl(var(--text-color-hue), 0%, 15%);
    --link-color-hue: 220;
    --link-color: hsl(var(--link-color-hue), 50%, 50%);
}
/* dark-mode colors */
html[data-theme="dark"] {
    --background-color: hsl(var(--background-color-hue), 0%, 10%);
    --text-color: hsl(var(--text-color-hue), 0%, 75%);
    --link-color: hsl(var(--link-color-hue), 50%, 60%);
}
/* invert images in dark-mode when they are compatible (eg. charts, but not photos) */
html[data-theme="dark"] img.darkmode_compatible {
    filter: invert(100%) hue-rotate(180deg);
    mix-blend-mode: screen;
}
/* transition when switching between the light and dark theme */
html.theme_change_transition, html.theme_change_transition * {
    transition: all 750ms !important;
    transition-delay: 0 !important;
}
body {
    background-color: var(--background-color);
    color: var(--text-color);
}
a:link, a:visited, a:hover, a:active {
    color: var(--link-color);
}

Special usage of CSS variables and HSL (hue, saturation, lightness) color representation



The JavaScript:

$(document).ready(function(){
    $('#toggle_darkmode').click(function(){
        $('html').addClass('theme_change_transition');
        if($('html').attr('data-theme') == 'light'){
            $('html').attr('data-theme','dark');
        }
        else {
            $('html').attr('data-theme','light');
        }
        setTimeout(function(){ 
            $('html').removeClass('theme_change_transition');    
        }, 3000);
        return false;
    });
});

Dependencies: jQuery


Try it!


Update

The above theme switcher became obsolete once Apple's iOS 13 introduced a native dark mode for all users. It is now possible to set styles based on the system theme (light or dark).

@media (prefers-color-scheme: dark){ 
    /*in here you can place all your CSS you want to use when the dark mode is set*/
    /*eg. dark background color and light font color*/
}



Tags: html, css, javascript, ui


« back

010100100110000101101110011001000110111101101101010000110110100101110000011010000110010101110010

About the author

human, software engineer, tech enthusiast, security researcher

E-Mail: blog@cipher.digital

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: OpenPGP (RSA-2048)

xsBNBFjAYL4BCACsmBS6zE+0b7mZVtQhmfnRn3+IIQfT6WlE6izM39Q42yxj
Hf2GOZU15Xc1x5RM9ZZx7HnMyTQWJMkwCzEba4Ju8dbn8gbFzLFp+mXAWQVJ
NOhsLvt58X/k1nQ3HYaYAbJPFE4k89zlFUjBG+a1Qs0kNg5RkaSTcE4iV6L4
749LYRba1VFK1p3eIFmIh1zQnzwFY1WYJjvXHURZel8MA0BJTkmfOW4MRHZL
lz8mjmTeWoRyxismRDprEtGynK7oIb3qUKAIr5MtoyESHBhVR+EpWHP0+06T
IfOsrsp8maNztXRQRKZxHzNZj/ayGpxBGO19e0/6jNpWGI5Nflwo/oHbABEB
AAHNI0RpZ2l0YWxDaXBoZXIgPGJsb2dAY2lwaGVyLmRpZ2l0YWw+wsByBBAB
CAAmBQJYwGDQBgsJCAcDAgkQMsB3T2XG/XYEFQgCCgMWAgECGwMCHgEAAOzo
B/4obbCU7u4f8kXQiaqAhSCjjyR5ZzdApPCh9i9XJ0qGTULTUuBrin1JDXSj
HoiByL2mYh92+I8S+YMWLMiTQzl9O4wx+A0eDnfwbs5jKJSQt5Pc8NMlwWKU
pG+R7escZ7le/qJYMgGPUWzFhgaKi8jueMW/NJSmPu/Tu4V9nhyxG9oaV3oP
rF+W0bekP84tDJ477clRSSK9ZzjMbLL1PWuNmCd8Gsnd3fyP1WcadIMDrnBB
sb+7AQ9eTywJ4Yzogh+cWjwy+TkkfEyCJ0X2n5WPURWc0YOFVqhcV4TYDR4v
CHSbh+r7OVKIjqdQKDJwAUCYeSkePbxJYmzRoaTd2+RgzsBNBFjAYL4BCADE
i8WrXxZWn42DlKDpnwTFBo/8asY4SJ22Zagkoj3cVvkechDWqQnWD753y5Xo
gymfPnNjoQGmClDaQoZ29kC4kHTmBPICHCCLvV/7YVCZC4WPpSnpklbllmk7
S8WTnyEm09gniGyLVy5st6MYmFDB4VnfXpzVYtpyEOyIfGV+JmuT90L872xc
+rI1/UuZA15k8M+ViD2xDlBMz3fbWxbt/KEUvbGoh2RW6SBJl1/z33ainQmO
oqygZtHhoFybqf/OUAHzASPcy+E4byWBIqwDDumKWfsd1YYkUgPMIxEvNaU3
2Olh5+2HX1y8WAf5cIfXUDfmZ88HmWVVXAK9JjztABEBAAHCwF8EGAEIABMF
AljAYNEJEDLAd09lxv12AhsMAACSqQf/Tz5KsfN3Yr82jXeO7jEWqI8yUaV2
vfK2JNfQXMIYDezIPxZU/sOOz9QF5gzHaLzt6moDQzHTZy9IE6q4l5gH1Wcm
1rX2b2b4ST3ThRzuDcfSCDZvUIAQ0WEBlXJZbCMwV8Rs5vsvv/CeXaT19zMb
CGD+23A1dKDSDmnlycCSDlTK0dc4flc8qqsMAXXtV7F370L3r76GQGj/ap57
k8K5l8VOqNCU2E8PJ1nU3Kf0fpaPJCpmDp51iZB6Ndx7ujb3qCzt5ND0Nqpz
8wuA9uuzf7LdYsz6MdDo3u8cBYeT2KA2pOA6W1SJgSx62Z4hFZxS5nseW3al
tfhqcXA+Ox3+gw==
=GS1N
-----END PGP PUBLIC KEY BLOCK-----