Stylesheet Switching

I spent the last couple of days playing around with stylesheet switching (theming) and also implementing prefers-color-scheme on the default theme in order to a dark mode.

I also added in a couple of fonts recently released by GitHub: Mona Sans and Hubo Sans

So far I have managed to have no JavaScript on this site. Unfortunately implementing theming on a static site is simply not possible without JavaScript. My aim therefore was to keep JavaScript to a minimum. I managed it with about 10 lines of code, including using local storage to remember the user's prefered theme.

    function swapStyleSheet(sheet){
        var styles = document.querySelectorAll('link[rel~="stylesheet"]');
        var i;
        for (i = 0; i < styles.length; ++i) {
            if( !styles[i].href.endsWith("structure.css") && 
                !styles[i].href.endsWith("style.css") && 
                !styles[i].href.endsWith("fonts.css")) {
                if(styles[i].href.endsWith(sheet)) {
                    styles[i].rel = "stylesheet";
                }
                else {
                    styles[i].rel = "alternate stylesheet";
                }
            }
        }
        localStorage.setItem("sheet",sheet);
    }
    if(localStorage.getItem('sheet')) {
        swapStyleSheet(localStorage.getItem('sheet'));
    }

With thanks to info I found on these links:

Currenty themes are switched using the buttons under the header, as you can see above. I need to style them a bit better, but the basic button code is:

<button type="button" onClick="swapStyleSheet('/assets/css/default.css')">Default</button>

I also wrote a gist about the switcher on GitHub, in case others find this useful. Probably it can be simplified and generalised further.

Tagged: