Skip to content

CSS 変数とテーマの管理

CSS 変数(カスタムプロパティ)は、CSS のスタイルを動的に変更できる強力な手法です。Web Components と組み合わせることで、テーマの切り替えやダークモードの実装が容易になります。

🔹 CSS 変数の基本

CSS 変数は -- をプレフィックスとして宣言し、var() 関数を使って参照します。

css
/* 変数の定義 */
:root {
  --primary-color: #007bff;
  --secondary-color: #6c757d;
  --font-size: 16px;
}

/* 変数の使用 */
.button {
  background-color: var(--primary-color);
  font-size: var(--font-size);
}

.button--secondary {
  background-color: var(--secondary-color);
}

🔹 テーマの管理

CSS 変数を活用することで、簡単にテーマの切り替えが可能です。

css
/* デフォルトテーマ */
:root {
  --background-color: #ffffff;
  --text-color: #333333;
}

/* ダークテーマ */
body.dark-mode {
  --background-color: #1e1e1e;
  --text-color: #ffffff;
}

/* 適用 */
body {
  background-color: var(--background-color);
  color: var(--text-color);
}

ボタンのクリックでテーマを切り替える例。

html
<button onclick="toggleTheme()">テーマ切り替え</button>

<script>
  function toggleTheme() {
    document.body.classList.toggle('dark-mode');
  }
</script>

🔹 Web Components と CSS 変数

Web Components の Shadow DOM 内でも CSS 変数は有効です。
<custom-button> の例を見てみましょう。

typescript
class CustomButton extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({ mode: 'open' });
    shadow.innerHTML = `
      <style>
        button {
          background-color: var(--button-bg, #007bff);
          color: var(--button-color, white);
          padding: 10px 20px;
          border: none;
          border-radius: 4px;
          font-size: var(--button-font-size, 16px);
        }
      </style>
      <button>クリック</button>
    `;
  }
}

customElements.define('custom-button', CustomButton);

グローバルでテーマを切り替えると、Web Component 内部も自動的に更新されます。

html
<custom-button></custom-button>

<button onclick="document.documentElement.style.setProperty('--button-bg', '#28a745')">
  ボタンの色を変更
</button>

🔹 グローバルテーマの定義

--theme-dark--theme-light を定義しておくことで、どの Web Component でもテーマ変更が反映されます。

css
:root {
  --theme-primary: #007bff;
  --theme-secondary: #6c757d;
  --theme-background: #ffffff;
  --theme-text: #333333;
}

body.dark-mode {
  --theme-primary: #1e88e5;
  --theme-secondary: #424242;
  --theme-background: #121212;
  --theme-text: #e0e0e0;
}

🔹 Web Components 内でのテーマ適用

Web Components 内では、:host を使ってホスト要素全体のスタイルを適用できます。

typescript
class ThemedCard extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({ mode: 'open' });

    shadow.innerHTML = `
      <style>
        :host {
          display: block;
          background-color: var(--theme-background);
          color: var(--theme-text);
          border: 1px solid var(--theme-primary);
          padding: 16px;
          border-radius: 8px;
        }
      </style>
      <div>
        <h3>タイトル</h3>
        <p>これはテーマ対応のカードです。</p>
      </div>
    `;
  }
}

customElements.define('themed-card', ThemedCard);

🔹 動的なテーマ切り替え

Web Components 内でも動的なテーマの変更が可能です。

html
<themed-card></themed-card>
<button onclick="toggleTheme()">テーマ切り替え</button>

<script>
  function toggleTheme() {
    document.body.classList.toggle('dark-mode');
  }
</script>

🔹 まとめ

  • CSS 変数はテーマの管理を簡単にし、Web Components の Shadow DOM 内でも有効
  • グローバル変数を使うことで、全体のテーマ統一が可能
  • :host を使うことで Web Components 内でも外部のテーマを反映
  • テーマの切り替えは JavaScript から動的に可能

Released under the CC-BY-4.0 license.