CSS

The CSS currentColor keyword lets you reuse an element’s text color for borders, outlines, shadows, and SVG paints—making UI theming simpler and more consistent.

currentColor

currentColor は「その要素の color(文字色)と同じ色」を、他の色指定にも使い回すためのキーワードです。

このページでできるようになること

まずは直感:currentColor って何?

ざっくり言うと、currentColor は「この要素の文字色(color)を、そのまま“共通の色”として使うスイッチ」です。

正確な定義(仕様に沿った説明)

何のために存在するか

currentColor は、要素の color プロパティの値を、他の“色を受け取るプロパティ”にも使い回すためのキーワードです。つまり、color を“基準色(前景色)”として扱い、枠線や影、装飾、SVGの塗りなどに同じ色を流し込めます。

何に適用されるか(対象)

currentColor は「値(キーワード)」なので、色を受け取れる場所なら基本的に使えます。例:border-coloroutline-colorbackground-colorbox-shadow の色、SVGの fill/stroke など。

できること / できないこと(制約)

できること
  • 同一要素内で「文字・枠線・アイコン」などを同じ色に揃える
  • 親の color を変えるだけで、子要素の装飾色(枠線など)もまとめて変える
  • SVGアイコンを color で着色する(fill="currentColor" など)
できないこと(重要)
  • currentColor 自体で“色を決める”こと(色の元は常に color
  • color が意図通りでないのに「currentColor だけ直せば解決」すること(まず color を疑う)
  • 画像(PNG/JPG)そのものを“自動で着色”すること(SVGやCSSで描かれた形なら可能)

影響範囲(レイアウト/描画/ユーザー操作/アクセシビリティ)

レイアウト
currentColor は色の値なので、基本的に レイアウト(幅・高さ・配置)には影響しません。ただし、色が変わることで“見え方”が変わり、境界が目立つ/目立たないは起きます。
描画
色が変わるだけなので描画コストは小さめです。とはいえ、box-shadow を濃く大きくすると重くなる、などは別問題として起きます。
ユーザー操作
色が変わってもクリック領域は増えません。タップしやすさは padding やサイズで確保します。
アクセシビリティ
フォーカスリングやエラー強調の色を揃えやすい一方で、色だけで状態を伝えない(形/文言/アイコンも併用)判断が必要です。

基本の書き方(最短の型)

最小サンプル(コピペ用)

CSS

.btn {
    color: #1d4ed8;
    border: 2px solid currentColor;
}

border の色を currentColor にすると、color を変えたときに枠線も一緒に変わります。「色を変える入口」を color 1つに寄せられます。

よく使う値/典型パターン

枠線(境界)を揃える
border-color: currentColor; / border: 2px solid currentColor;
フォーカスリング(強調)に使う
:focus-visible { box-shadow: 0 0 0 4px currentColor; } のように「外側に広げるリング」を作る
SVGアイコンを文字色に合わせる
fill="currentColor" / stroke="currentColor" を使い、親の color でまとめて着色する
薄い色(半透明)にしたい
currentColor 自体に透明度は足せないので、color-mix() などを使うか(対応状況に注意)、別の色指定に分ける

どこに書くか(外部CSS/ページ内style/インライン)

基本:外部CSS(推奨)
色のルールはサイト全体のトーンに直結します。実務では、コンポーネントやユーティリティとして外部CSSにまとめ、差分管理しやすくします。
ページ内 <style>
学習用デモや、単独ページで完結させたい場合に便利です(このページのデモもそうしています)。
インライン(例外)
style="color: ..." は検証には便利ですが、運用では保守が難しくなりやすいので最後の手段に寄せます。

コピペで動く最小デモ(このページ内で表示)

デモは「悪い例 → 良い例」で、差が一目で分かるようにします。

悪い例:同じ色を何度も直書き

OK

色変更のたびに複数箇所を直すことになり、漏れやすい。

良い例:color に集約 → currentColor で追従

OK

色を変える入口は color だけ。枠線・アイコンがまとめて追従。

テーマ切替のイメージ:親の color を変える

青テーマ:このブロックの color が基準

アイコンも同じ色

オレンジテーマ:親の color を変えただけ

アイコンも同じ色

“色の入口”を親に寄せると、部品の使い回しが楽になります。

フォーカス例:キーボード移動でフォーカスが当たるときだけ、currentColor でリングを出します(:focus-visible)。

ホバー例:動きは控えめに。動きを減らす設定の人にはアニメを切ります。

落とし穴の予告:currentColor が“意図しない色”になるのは、だいたい color が想定と違うのが原因です(次の章で整理)。

HTML

<button class="btn">Button</button>

<svg viewBox="0 0 24 24">
    <path fill="currentColor" d="..."></path>
</svg>

CSS

.btn {
    color: #1d4ed8;
    border: 2px solid currentColor;
}

.btn:focus-visible {
    outline: 2px solid transparent;
    box-shadow: 0 0 0 4px currentColor;
}

仕様として押さえるポイント(初心者が事故りやすい所)

継承する?(inheritance)
currentColor はプロパティではなく「値」なので、“currentColor が継承する”というより、color が継承すると考えます。親の color を子が継承していれば、子の currentColor も同じ色になります。
初期値は?(initial)
currentColor の元になる color の初期値は、仕様上はシステム色(例:CanvasText)として定義されます。つまり「既定の文字色」が基準になり、環境(UA/テーマ)で見え方が変わり得ます。
適用対象は?(applies to)
色を受け取るプロパティで使えます。代表例は border-color / outline-color / text-decoration-color / box-shadow の色 / background-color / SVGの fill / stroke などです。
%の基準は?(percentages)
currentColor 自体は色なので、% の基準のような話は基本的に関係しません(長さやレイアウトの計算とは別の話です)。
算出値/使用値の考え方(computed/used value)
currentColor の“実際の色”は、最終的に決まった color(算出された値)に置き換えられます。DevTools の Computedcolor を確認し、その色が border-color などに反映されているかを見ると切り分けが速いです。
省略時の扱い、無効値の扱い
border: 2px solid; のように色を省略すると、既定で currentColor 相当になるケースがあります(仕様や実装の範囲で)。「省略で揃う」場面もありますが、意図を明確にするなら currentColor と書く方が安全です。
アニメーション可能?(animatable)
currentColor 自体をアニメーションするのではなく、対象プロパティが色としてアニメ可能なら、color を変えたときに連動して見た目が変わります。フォーカスやホバーで color を変える設計は分かりやすい一方、動きは控えめにします。
特別扱い:color: currentColor
currentColorcolor 自体に指定すると、color: inherit と同じ扱いになります。「自分の color を参照して無限ループ」になるのを避けるための仕様です。

よくある勘違い・混同ポイント

currentColorinherit

inherit は「そのプロパティの値を親から引き継ぐ」という指定です。一方 currentColor は「その要素の color と同じ色にする」という指定です。

  • border-color: inherit; → 親要素の border-color を引き継ぐ
  • border-color: currentColor; → 自分の color と同じ色にする
currentColor とカスタムプロパティ(var(--x)

カスタムプロパティは「自分で作る変数」です。currentColor は「すでにある color の最終値」を参照するキーワードです。

  • デザインシステム的に“色の名前”で管理したい → カスタムプロパティが得意
  • コンポーネント内で「文字色と装飾色を揃えたい」 → currentColor が得意
「動くけど危ない書き方」

リンクの既定色(UAスタイル)に頼って currentColor を使うと、親の color や状態(未訪問/訪問済み)で意図せず色が変わります。部品として再利用するなら、color の入口を明示しておく方が安全です。

実務でよくある使用例(制作会社の現場を想定)

ボタン・バッジ:文字色と枠線を揃えて、デザイン変更に強くする

color を部品のテーマ色として持ち、枠線やアイコンは currentColor にして追従させます。デザイン変更で「テーマ色が変わる」場合も、直す箇所が減ります。

アイコン:SVGを currentColor で染める

SVGの pathfill="currentColor" を入れておくと、アイコンの色が文字色に追従します。ナビのアイコン、ボタンのアイコン、アラートのアイコンなどで使い回しやすいです。

注意:SVG側に固定色(fill="#000" など)が書かれていると、CSSで変えにくくなります。

フォーム:フォーカスリングを“部品の色”に揃える

:focus-visible のリング色を currentColor にすると、「危険(赤)」「安全(青)」など部品のテーマに合わせてフォーカス表現を揃えられます。ただし視認性は必ず確認します。

実務で起きがちな事故と回避策

「意図しない色になる」

原因候補:color が想定と違う
まず DevTools の Computed で対象要素の color を確認します。親からの継承、リンクの既定色、状態(:visited など)、テーマクラスの付け忘れを疑います。
原因候補:SVGに固定色が残っている
SVGの fill/stroke#... のままだと、currentColor に置き換えない限り色が変わりません。DevTools でSVG要素の属性とスタイルを確認します。

「効いてないように見える」

原因候補:背景と同化している
枠線やリングが背景と近い色だと、あるのに見えません。コントラストを上げる(色を濃くする、太くする、outline を併用する)方向で調整します。
原因候補:上書きされている
DevTools の Stylesborder-colorbox-shadow が打ち消されていないか確認します。特にリセットCSSやコンポーネントの状態クラスで border: none 等が当たっているケースがあります。

「フォーカスリングが見えない」

currentColor を使うとリング色が部品に追従しますが、部品の色が薄いとリングも薄くなります。リングは“見えないと意味がない”ので、必要ならリングだけ別色にする/太くする/二重にするなどで調整します。

アクセシビリティ/UX観点での注意(必要な範囲で)

関連プロパティ・関連セレクタとの組み合わせ・相互作用

color
currentColor の“元”です。どの要素で color を決めるか(親で決める/部品で決める)が設計の肝になります。
border / outline / box-shadow
境界やフォーカス表現に使う代表例です。outline はフォーカスの王道で、box-shadow は馴染ませやすい一方、薄いと見落とされやすいです。
:hover / :focus-visible
状態変化で color を変えると、currentColor が連動します。状態による“色の意味”があるUIでは、連動の強さがメリットにも事故の原因にもなります。
SVGの fill / stroke
アイコンの着色に強い組み合わせです。SVG側に固定色があると効かないので、currentColor 化(またはCSSで上書き)を検討します。
カスタムプロパティ(--themeColor など)
「サイト全体の色設計」を扱うならカスタムプロパティ、部品内の統一は currentColor、という使い分けが実務では分かりやすいです。

試験(Webクリエイター能力認定試験)で得点できる整理

用語ミニ辞典

currentColor
要素の color プロパティの値を表すキーワード。枠線や影など、色を受け取る場所で使える。
inherit
そのプロパティの値を、親要素から引き継ぐ指定。
computed value(算出値)
カスケードと継承を経て、ブラウザが“最終的に決めた値”。DevTools の Computed で確認できる。
:focus-visible
キーボード操作など「見える形で必要なときだけ」フォーカス表示を出せる疑似クラス。

ひっかけポイント(短く)

「問われ方」っぽいミニ確認(解説付き)

  1. 問題:.card { border-color: currentColor; } と書いた。枠線の色はどの値で決まる?

    解説:その要素の color(文字色)で決まります。まず color の最終値を確認します。

  2. 問題:border-color: inherit;border-color: currentColor; の違いを一言で。

    解説:inherit は親の border-color を引き継ぐ、currentColor は自分の color と同じ色にする、です。

  3. 問題:color: currentColor; は何と同じ扱いになる?

    解説:color: inherit; と同じ扱いになります(自分自身参照のループを避けるため)。

  4. 問題:SVGアイコンが currentColor で着色できない。まず疑うべきポイントは?

    解説:SVGの fill/stroke が固定色になっていないか、対象要素の color が想定通りか、を DevTools で確認します。

  5. 問題:フォーカスリングを box-shadow: 0 0 0 4px currentColor; で作った。見えないときの対処は?

    解説:背景と同化している可能性が高いです。リングを太く/濃くする、outline を併用する、リングだけ別色にする、などで視認性を上げます。

よくある質問(FAQ)

currentColor はどのプロパティで使えますか?
色を受け取れるプロパティなら使えます。代表例は border-coloroutline-colorbackground-colorbox-shadow の色、SVGの fill/stroke などです。
currentColor を使ったのに、枠線が想定の色になりません
まず対象要素の color を DevTools の Computed で確認してください。currentColor は必ず color に連動します。
SVGアイコンが currentColor になりません
SVG側の pathfill="#..." のような固定色が残っていると効きません。fill="currentColor" にするか、CSSで上書きできる構造になっているか確認します。
リンク(<a>)に使うと色が勝手に変わります
リンクは未訪問/訪問済みなどで既定色が変わることがあります。部品として再利用するなら、親か部品自身で color の入口を明示しておくと安全です。
currentColor で半透明の枠線にできますか?
currentColor 自体に透明度を足すことはできません。半透明が必要なら、別の色指定(例:rgba())にするか、対応状況を確認した上で color-mix() などを検討します。

よくあるエラー/症状 早見表

症状:枠線が黒っぽい/環境で色が違う
原因候補:color を指定しておらず既定色(システム色)が基準になっている
最短の確認:DevTools の Computedcolor の最終値を見る
解決の方向性:親または部品で color を明示する
症状:currentColor を書いたのに“効いてない”
原因候補:上書き(border: none など)/ 背景と同化して見えない
最短の確認:DevTools の StylesComputed で最終値を確認
解決の方向性:勝っているルールを直す、太さ/色/併用(outline)を調整する
症状:SVGの色が変わらない
原因候補:SVG側が固定色(fill="#..."/stroke="#..."
最短の確認:DevTools でSVG要素の属性(fill/stroke)を見る
解決の方向性:currentColor 化する、またはCSSで上書きできる構造にする
症状:フォーカスリングが見えない
原因候補:部品の color が薄い / 背景と同化 / outline を消した
最短の確認:Tab移動で確認、DevTools で :focus-visible を強制
解決の方向性:リングを太く/濃く、outline を戻す、リングだけ別色にする

まとめ:迷ったときの判断軸(短いチェックリスト)