HTML&CSS

【3分で解決】SVGの色が変わらない!原因と直し方

svgの色を変える方法

SVGを色ごとに書き出すとファイルが増殖して管理が大変。できればCSSだけで色を差し替えたい——でも colorfill を指定しても色が変わらないことがある。
本記事はその「なぜ?」を解決します。XDから書き出したSVGがCSSで色を受け付けにくい理由(直書きfill/stroke問題)をまず整理。次に、単色=currentColor化、多色=CSS変数、そしてスプライト(<symbol><use>)まで、現場で詰まらない最短手順に絞って解説します。

1) なぜCSSで色が変わらない?

たとえば、こういうアイコンをXDからSVGとして書き出し、SVGをテキストファイルで開いたコードをHTMLファイルに貼り付けます。
このSVGにcolor:redを指定してみます。

<div class="svg-wrap">
    <svg xmlns="http://www.w3.org/2000/svg" width="17" height="17" viewBox="0 0 17 17">
        <g transform="translate(-4 -4)">
            <path d="M6-1A7,7,0,1,1-1,6,7.008,7.008,0,0,1,6-1ZM6,11A5,5,0,1,0,1,6,5.006,5.006,0,0,0,6,11Z" transform="translate(5 5)" fill="#758ce9" />
            <path d="M20,21a1,1,0,0,1-.707-.293l-4.2-4.2a1,1,0,1,1,1.414-1.414l4.2,4.2A1,1,0,0,1,20,21Z" fill="#758ce9" />
        </g>
    </svg>
</div>
.svg-wrap svg {
    color: red
}

しかし、色は変わらない。。。

それは、SVGに指定されているこの部分が原因です。

fill="#758ce9"
fill="#758ce9"

fill は SVG の「塗りつぶし色」を指定する属性/プロパティです。
パスや図形の内側を何色で塗るかを決めます(輪郭の色は stroke)。

XDは書き出し時に各要素へ fill="#xxxxxx" / stroke="#xxxxxx"要素属性として直書きします。
この直書きは親の colorfill の継承より優先度が高いため、CSS指定が負けるのが原因です。

2) 単色アイコンの正解:currentColor に置換(最短・安定)

やることは1つ。書き出し後の fill/strokecurrentColor に置換します。
以後は親の color だけで色変更が可能です。

<div class="svg-wrap">
    <svg xmlns="http://www.w3.org/2000/svg" width="17" height="17" viewBox="0 0 17 17">
        <g transform="translate(-4 -4)">
            <path d="M6-1A7,7,0,1,1-1,6,7.008,7.008,0,0,1,6-1ZM6,11A5,5,0,1,0,1,6,5.006,5.006,0,0,0,6,11Z" transform="translate(5 5)" fill="currentColor" />
            <path d="M20,21a1,1,0,0,1-.707-.293l-4.2-4.2a1,1,0,1,1,1.414-1.414l4.2,4.2A1,1,0,0,1,20,21Z" fill="currentColor" />
        </g>
    </svg>
</div>
.svg-wrap.svg-wrap--red {
    color: red
}

.svg-wrap.svg-wrap--green{
    color: green
}

.svg-wrap.svg-wrap--blue{
    color: blue
}

書き出し後の fill/strokecurrentColor に置換しよう。


3) 多色アイコンの正解:CSS変数でパーツ分離

次にこういう複数色のアイコンはどうでしょうか?

書き出し直後のSVGはこのようになっていました。

<svg xmlns="http://www.w3.org/2000/svg" width="28" height="18.5" viewBox="0 0 28 18.5">
  <g id="icon-car-multicolor_2_" data-name="icon-car-multicolor (2)" transform="translate(-2 -3)">
    <path id="パス_1" data-name="パス 1" d="M6,10.5,9.2,5.4A4,4,0,0,1,12.6,3h6.8a4,4,0,0,1,3.4,2.4L26,10.5h2a2,2,0,0,1,2,2V18a3,3,0,0,1-3,3H5a3,3,0,0,1-3-3V12.5a2,2,0,0,1,2-2Z" fill="#334155"/>
    <path id="パス_2" data-name="パス 2" d="M9.5,10.5l2-4a2,2,0,0,1,1.8-1.2h5.3a2,2,0,0,1,1.8,1.2l2,4Z" fill="#93c5fd"/>
    <circle id="楕円形_1" data-name="楕円形 1" cx="2" cy="2" r="2" transform="translate(8 17.5)" fill="#0f172a"/>
    <circle id="楕円形_2" data-name="楕円形 2" cx="2" cy="2" r="2" transform="translate(20 17.5)" fill="#0f172a"/>
    <rect id="長方形_1" data-name="長方形 1" width="2.2" height="1.8" rx="0.4" transform="translate(26.5 14)" fill="#fbbf24"/>
  </g>
</svg>

多色のSVGは各パーツにクラス名を付けて、色はCSS側で与えるやり方をご紹介します。
XD書き出し直後は fill="#xxxxxx" が直書きされていますが、今回はそちらをすべて、削除し、SVGにクラスを振って、CSSで色を当てています。

<div class="car car--sky">
  <svg xmlns="http://www.w3.org/2000/svg" width="28" height="18.5" viewBox="0 0 28 18.5" aria-hidden="true">
    <g transform="translate(-2 -3)">
      <path  class="car__body"   d="M6,10.5,9.2,5.4A4,4,0,0,1,12.6,3h6.8a4,4,0,0,1,3.4,2.4L26,10.5h2a2,2,0,0,1,2,2V18a3,3,0,0,1-3,3H5a3,3,0,0,1-3-3V12.5a2,2,0,0,1,2-2Z"/>
      <path  class="car__window" d="M9.5,10.5l2-4a2,2,0,0,1,1.8-1.2h5.3a2,2,0,0,1,1.8,1.2l2,4Z"/>
      <circle class="car__wheel" cx="2" cy="2" r="2" transform="translate(8 17.5)"/>
      <circle class="car__wheel" cx="2" cy="2" r="2" transform="translate(20 17.5)"/>
      <rect   class="car__light" width="2.2" height="1.8" rx="0.4" transform="translate(26.5 14)"/>
    </g>
  </svg>
</div>
.car--sky .car__body   { fill:#0ea5e9; }
.car--sky .car__window { fill:#bae6fd; }
.car--sky .car__wheel  { fill:#1e293b; }
.car--sky .car__light  { fill:#fde68a; }

まとめ

  • XDの出力はそのままでOK。後処理で色直書きを外すのが最短・安定。
  • 単色=currentColor多色=CSS変数に寄せれば、配色変更がCSSだけで完結

学びを深めたいあなたへ:ガチ無料で学べるスクール紹介

そんなあなたにおすすめなのが、完全無料で受けられるプログラミングスクールです。
完全無料で学べるプログラミングスクールなら、プロ講師のサポート付きでHTMLやCSSを基礎から学べます。
私もこちらの受講生なので、体験レポートを参考にして頂けたらと思います。

✅ 初学者のスタートダッシュに最適
✅ HTML/CSSの基礎が無料で学習できる
✅ オンライン完結&未経験OK
✅ Slackで講師に何回でも質問できる

無料の理由や利用者の声を見るならこちら

-HTML&CSS
-,