September 18, 2018
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
October 26, 2019
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-----