[PR] 記事内に広告が含まれています

クラスの内で定義したCSS変数はどこまで効く?親子関係を含め詳しく解説

サイト制作

クラスの内で定義したCSS変数はどこまで効く?親子関係を含め詳しく解説

CSSを書いていると、次のようにクラスの内でCSS変数を定義することがあります。

.point {
  --point-color: #f28c00;
}

このような書き方はとても便利ですが、初心者のうちは「このCSS変数はどこまで効くの?」「同じようなクラス名なら使えるの?」と迷いやすいです。

実際、見た目は合っていても、仕組みをなんとなくで使っていると、後から修正するときに混乱しやすくなります。

この記事では、クラスの内で定義したCSS変数がどこまで効くのかを、親子関係も含めてわかりやすく解説します。あわせて、初心者が勘違いしやすいポイントも整理していきます。

CSS変数とは?

まず、CSS変数はCSSの中で使い回せる値のことです。次のように、–で始まる名前で定義します。

.point {
  --point-color: #f28c00;
}

そして、使うときはvar()を使います。

.point__title {
  color: var(--point-color);
}

つまり、

  • –point-color: #f28c00;で値を用意する
  • var(–point-color)でその値を呼び出す

という流れです。

JavaScriptの変数とまったく同じではありませんが、初心者の方はまず「名前をつけて使い回せる値」と考えるとわかりやすいです。

 

なぜ–が付いているのか

–point-colorのように、先頭に–が付いているのはCSSのルールです。

CSS変数は正式にはカスタムプロパティと呼ばれます。このカスタムプロパティは、必ず–で始める必要があります。

たとえば、これは正しい書き方です。

--point-color: #f28c00;

一方で、これはCSS変数としては扱われません。

point-color: #f28c00;

見た目は少ししか違いませんが、意味はかなり違います。–が付いているからこそ、「これはCSS変数ですよ」とブラウザに伝わります。

 

クラスの内で定義したCSS変数をその場所に書く理由

たとえば、次のようなコードがあったとします。

.point {
  --point-color: #f28c00;
  --point-bg-image: url("images/point01.svg");
}

これは、.pointというパーツの中で共通して使いたい値を、親側にまとめて置いているという考え方です。

たとえば同じ.pointの中で、

  • 見出しの強調色
  • 波線の色
  • ボタンの枠線の色
  • ボタンの丸い矢印の背景色

を同じ色にしたいことがあります。

そのときに、毎回#f28c00と書くよりも、親で1回だけ定義して、子側で使った方がかなり管理しやすいです。

.point__title {
  color: var(--point-color);
}

.point__line {
  color: var(--point-color);
}

.point__button {
  border-color: var(--point-color);
  color: var(--point-color);
}

こうしておけば、色を変えたいときは–point-colorだけ直せば済みます。見た目の統一もしやすく、修正も楽です。

 

クラスの内で定義したCSS変数はどこまで効くのか

ここがいちばん大事です。

クラスの内で定義したCSS変数は、そのクラスの中にある子要素や子孫要素で使えます。

たとえば、次のHTMLを見てください。

<div class="point">
  <h2 class="point__title">見出し</h2>
</div>

この場合、h2.point__titleは.pointの中にあります。なので、.pointで定義したCSS変数を使えます。

.point {
  --point-color: #f28c00;
}

.point__title {
  color: var(--point-color);
}

このとき、見出しはオレンジになります。

 

外に出た要素では使えない

では、次のようなHTMLならどうでしょうか。

<div class="point">
  <div>test</div>
</div>

<h2 class="point__title">見出し</h2>

この場合、h2.point__titleは.pointの外にあります。クラス名は似ていますが、HTMLの構造上は別の場所です。

そのため、.pointで定義したCSS変数は届きません。

.point {
  --point-color: #f28c00;
}

.point__title {
  color: var(--point-color);
}

このvar(–point-color)は、値が見つからないので無効になります。

ここで大事なのは、同じようなクラス名かどうかではなく、HTMLの中に入っているかどうかです。

 

__でつながっていると子要素扱いになるのか

これはかなりよくある勘違いです。

結論からいうと、なりません。

たとえば、.point__titleというクラス名は、CSSから見るとただのクラス名です。__に特別な意味はありません。

これはBEMっぽい命名ルールで、人間が見たときに「pointという部品の中のtitleなんだな」とわかりやすくするための名前です。

つまり、

  • __があるから子要素になる
  • HTMLの入れ子構造がそうなっているから子要素になる

という違いがあります。

ここを混同すると、クラスの中で定義したCSS変数の効く範囲も分かりにくくなります。

 

子要素と子孫要素の違い

次のHTMLを見てみます。

<div class="point">
  <h2 class="point__title">見出し</h2>
</div>

この場合、h2は.pointの子要素です。しかも、直下の子要素です。

一方で、次のように間に別の要素が入ると、

<div class="point">
  <div>
    <h2 class="point__title">見出し</h2>
  </div>
</div>

このh2は、.pointの子孫要素です。中にはいますが、直下ではありません。

この違いはCSSセレクタにも関係します。

.point .point__title

これは、.pointの中にある.point__titleすべてに効きます。

.point > .point__title

これは、.pointの直下にある.point__titleにしか効きません。

初心者の方は、この2つを一緒に考えがちですが、意味はけっこう違います。

 

クラスの中で定義したCSS変数が効かないときの原因

「クラスの中で定義したCSS変数を書いたのに効かない」というときは、だいたい次のどれかです。

  • HTML上で、その要素が親の中に入っていない
  • 変数名のスペルが違う
  • 変数が未定義のまま使われている
  • 別のCSSで上書きされている

初心者のうちは、「変数が壊れている」のではなく、「HTML構造が原因だった」というケースがとても多いです。

 

fallbackを書いておくと安心

CSS変数が見つからないときに備えて、予備の値を書いておくこともできます。

.point__title {
  color: var(--point-color, #666);
}

この意味は、

  • –point-colorがあればそれを使う
  • なければ#666を使う

です。

初心者の方が練習するときは、この書き方を覚えておくと安心です。「変数がないせいで全部崩れる」という状態を避けやすくなります。

 

実務ではどう使うと便利か

実務では、同じパーツで色だけ変えるときに、クラスの内で定義したCSS変数がとても便利です。

たとえば、POINT1、POINT2、POINT3で、形は同じなのに色だけ変えたい場合です。

.point {
  --point-color: #f28c00;
}

.point--blue {
  --point-color: #14b5ff;
}

.point--pink {
  --point-color: #ff5fa2;
}

そして共通部分では、全部var(–point-color)を使います。

.point__label {
  color: var(--point-color);
}

.point__title {
  color: var(--point-color);
}

.point__line {
  color: var(--point-color);
}

.point__button {
  border-color: var(--point-color);
  color: var(--point-color);
}

こうしておくと、色を変えたい場所が散らばりません。あとで見直したときも、どこを触ればよいか分かりやすいです。

これは見た目だけの話ではなく、保守のしやすさにも効いてきます。

 

まとめ

クラスの内で定義したCSS変数は、そのクラスの中にある要素に対して効きます。逆に、HTMLの外に出た要素には届きません。

ここで大事なのは、クラス名の似た見た目ではなく、親子関係を含むHTML構造そのものです。

また、.point__titleのように__でつながっていても、それだけで子要素扱いになるわけではありません。これはあくまで命名ルールです。

初心者のうちは、「クラスの中で定義したCSS変数だから、この名前なら使えるはず」と思ってしまいがちです。

でも実際には、「その要素がHTML上で親の中にいるか」がいちばん重要です。

この考え方が分かると、CSS変数の使い方だけでなく、CSS全体の見通しもかなりよくなります。似たパーツの色違いを作るときも、修正の手間がぐっと減ります。

タイトルとURLをコピーしました