title: Create a Theme Switch date: 2021 Dec 08 updated: 2024 Feb 03 This is a simple tutorial on how to make a simple theme switcher. First step is to create the themes you'll want on your site. You may just want a light and dark mode, however, you may also want other themes. As an example: a clown theme that makes the page absurdly colorful, like a GeoCities site in the early 2000s. For these themes, you can use CSS variables set on the `html` parent tag(all other elements are considered children of `html`). Variables can be set in CSS using double hyphens followed by a sequence of text that can use numbers(but not at the start), letters(capital or lowercase), underscores, and hyphens; these variables can then be accessed within your text using the `var()` function with the name of the variable(including the starting hyphens). You can change out the CSS variables using different selectors on the `html` tag within the CSS, for me: I'm using the `[data-theme]` attribute; however, you can use classes if you want. Here is the CSS I wrote: ```css html[data-theme=light] { background: #fff; color: #000; --buttonBackground: #fefefe; --buttonBorder: #ccc; --buttonColor: #001; } html[data-theme=dark] { background: #000; color: #fff; --buttonBackground: #101010; --buttonBorder: #333; --buttonColor: #fff; } html[data-theme=clown] { background: #f00; color: #00f; --buttonBackground: #050; --buttonBorder: #0a0; --buttonColor: #0f0; } button { background: var(--buttonBackground); border: var(--buttonBorder) solid 3px; color: var(--buttonColor); } ``` Now we need to create a button that we will use to change the `[data-theme]` attribute. You (probably) already know what buttons are, so I won't go in depth about then. However: you will need to add an `[id]` to the button, this will come in play shortly. ```html ``` Now, it is time to write the JavaScript. First, you'll want to make a constant with the themes you filled into your CSS, for me, that was `dark`, `light`, and `clown`. I'll name this `themes`. ```javascript const themes = ["light", "dark", "clown"]; ``` We now need to query the DOM for our theme switch button. This can be done in 2 ways: `document.querySelector` or `document.getElementById`; personally, I prefer `querySelector`, as it allows you to write a CSS selector to get an element from the DOM, allowing for shorter, more digestible, code. We have to add a click event to the button. This can be done in 2 ways within JavaScript: `addEventListener("click", ...)` and `onclick`. I personally like `addEventListener` more, so I'll use that. Within the `addEventListener` function, you need to put a function. This function will control the logic of our theme switch. I'll call this function `SwitchTheme`, to reflect it's functionality. ```javascript const ThemeSwitchButton = document.querySelector("#theme-switch"); ThemeSwitchButton.addEventListener("click", SwitchTheme()); function SwitchTheme() {} ``` Explaining each part of this function as it's written out would take awhile, so instead, I'll add comments to the ends of each line giving a short explanation. Also, for the sake of shortness, I've placed `document.documentElement` inside the constant `HTML`, giving us access to the root element in the DOM(`html`). ```javascript let CurrentTheme = themes.indexOf(HTML.dataset.theme); // Gets how far in the current theme is into the "themes" constant. if (CurrentTheme + 1 >= themes.length) { // Checks if it's at the end of the array, HTML.dataset.theme = themes[0]; // If so, reset at the start. return; // Ends the function here, preventing next bit of code from running. } HTML.dataset.theme = themes[CurrentTheme + 1]; // Goes to the next theme. ``` Now we have a finished product. Here's the expected output: [See Code](/blog-files/theme-change-final.txt)