【SVG】SVGアイコンのカラーをCSSで変更したい!
SVGを使うメリットは拡大・縮小に強く、またjpgやpngのようなラスタ画像と違いCSSによって手軽に色を変えられる柔軟性にあります。その反面いろいろな制約が多く、これまでの画像と違い扱いが難しかったりします。
CSSでサクッと色変更するにもそれなりの作法が必要で知らないと簡単にハマってしまいます。そして見事にハマったので、ここにその時の軌跡を残しておこうと思います。
この記事の目次
やりたかったこと
この画像のボタンのようにグラデーションの背景にSVGアイコンを重ねてSVGアイコンの塗りを調節する。
なるほどなるほど。あれをこうして~と頭の中でぽんぽんと工程が浮かび、そしてサクッとハマりました。
難しい。。
とにかく試してみる
なぜか出来ない。なぜか出来ない(;´Д`)・・・。
このままだと埒が明かないので1つずつ試していきました。
辿った工程は以下の通りです。
- input[type="submit"]の背景色にCSSグラデーション⇒できる
- 単色背景とSVG画像を同時に指定⇒できる
- グラデーションとSVG画像を背景として同時に指定⇒できる
- input要素を指定しているクラスにそのままfillを指定⇒できない
- SVGをbefore擬似要素として使用-その1⇒before疑似要素自体が表示されない\(^o^)/
- input要素をbutton要素に変更⇒∠( ゚д゚)/・・・?before疑似要素は表示できたがSVG画像の色が変えられない!
- 仕方ないのでSVG自体を白くした別ファイルを作る⇒う~ん・・・負けた気がする。
- SVGをシンボル化して使いまわす!⇒CSSファイルで色変更が効く!
input[type="submit"]の背景色にCSSグラデーション
このボタンに実装していきます。まずは背景色にCSSグラデーションを指定。
基本的なボタンの形状はbuttonクラスで使い回し、適当にtest01というクラス名で装飾していきます。
記述が長くなるためベンダープレフィックスの指定は割愛しています。
うん、できる。
単色背景とSVG画像を同時に指定
グラデーションの指定を消して背景画像としてSVG画像を指定しています。
うん、できる。
グラデーションとSVG画像を背景として同時に指定
別の背景指定を複数重ねるマルチバックグラウンドの要領で、backgroundプロパティの中でカンマ区切りで指定します。ポイントとしては先に指定している方が重ね順の上側に位置するという点です。
うん、できる。
input要素を指定しているクラスにそのままfillを指定
できません。
img要素やCSSのbackgroundで読み込まれると画像として扱われてしまい、CSSでの装飾が効かなくなるようです。
SVGをbefore擬似要素として使用-その1
できません。
どうやらinputやimg、videoなどの置換要素にはbefore、after疑似要素が使えないらしく、無知な私はしばらくハマりました。ということで別の要素で代用する必要があります。
SVGをbefore擬似要素として使用-その2
before疑似要素は表示できました。
ただカラーは変えられません。
SVGファイル内で直接スタイリング
SVGをテキストエディタで開いて編集します。
グループ化しているg要素、もしくはpath要素一つ一つにクラスを付けてSVG内でスタイリングしています。これなら色は変えられますが黒いアイコンと白いアイコンを使い分けたい場合は結局SVGファイルを2つ用意することになります。
SVGをシンボル化して使いまわす!
使いまわすベースとなるSVGのsvgタグ内をsymbol要素で囲むことでこのSVGを参照できるようになります。symbol要素には参照名としてidを付けておきます(classだとダメ)。
使いまわすベースとなるSVGをHTMLファイルにインラインで記述する必要がありますが、通常通りCSSでスタイリングできるため複数のSVGファイルを用意する必要がなくなるメリットがあります。
管理人「よら」はこう思う
最後のSVGを参照する方法はCSSファイルでの操作ができるので非常に使いやすい方法だと思います。
ただ、ベースとなるSVGはUI的には不必要な要素なのでCSSで非表示にしている点がSEO的にあまり気持ちよくないんですよね。
表示するだけならIE9以上で使えますし、選択肢の1つとして覚えておこうと思います。