Result
ダークモードにも使えるテーマスイッチです。サンプルは簡単なものですがスタイルはCSSで制御しているので応用は効くと思います。
JavaScriptは切り替えとlocalStorageへの保存に利用されています。
javascript
//デフォルト設定 const pressedButtonSelector = '[data-theme][aria-pressed="true"]'; const defaultTheme = 'green'; //buttonにセットしたカスタムデータ属性に準じてテーマ切り替え const applyTheme = (theme) => { const target = document.querySelector(`[data-theme="${theme}"]`); document.documentElement.setAttribute("data-selected-theme", theme); document.querySelector(pressedButtonSelector).setAttribute('aria-pressed', 'false'); target.setAttribute('aria-pressed', 'true'); }; const handleThemeSelection = (event) => { const target = event.target; const isPressed = target.getAttribute('aria-pressed'); const theme = target.getAttribute('data-theme'); if(isPressed !== "true") { applyTheme(theme); localStorage.setItem('selected-theme', theme); } } //テーマに変更があるかチェックし、変更があればlocalStorageに保存 const setInitialTheme = () => { const savedTheme = localStorage.getItem('selected-theme'); if(savedTheme && savedTheme !== defaultTheme) { applyTheme(savedTheme); } }; setInitialTheme(); const themeSwitcher = document.querySelector('.theme-switcher'); const buttons = themeSwitcher.querySelectorAll('button'); buttons.forEach((button) => { button.addEventListener('click', handleThemeSelection); });
css
:root, [data-selected-theme="green"] { --color-background: #A4F3A2; --color-text: #034435; --color-accent: #00CC66; } [data-selected-theme="blue"] { --color-background: #55dde0; --color-text: #2B4150; --color-accent: #00D4E7; } [data-selected-theme="pink"] { --color-background: #DFB2F4; --color-text: #463546; --color-accent: #F06EFC; } [data-selected-theme="orange"] { --color-background: #FA7D61; --color-text: #1E1E24; --color-accent: #F3601C; }
設定されたdata-selected-theme
属性はhtmlタグに追加されるので、テーマのカスタマイズもしやすいかと思います。
html
<div class="container"> <h1>テーマ選択</h1> <div class="theme-switcher"> <button data-theme="green" aria-pressed="true">緑</button> <button data-theme="blue" aria-pressed="false">青</button> <button data-theme="pink" aria-pressed="false">ピンク</button> <button data-theme="orange" aria-pressed="false">オレンジ</button> </div>
切り替えのスイッチです。
via
以下で詳しく解説されています。
Building an accessible theme picker with HTML, CSS and JavaScript.