ブルーシュ

IT技術の勉強記録

ホーム > Tips > フロントエンド

【CSS mask-image】SVGなどのアイコン画像の色を変更する方法!

, , , ,

以前、CSSのfilterプロパティを使う方法で画像の色を変更する方法を紹介しました。
【CSS filter】svgをJSなし・インライン読み込みなしで自由に色を変更する方法!
のOGP画像

今回は、mask-imageを使います。
filterと違ってグラデーションが使えます。

画像を用意

まずは画像を用意します。前回と違って、何色でも大丈夫。

猫のアイコン
cat.svg

pngでもsvgでも、何色でもOK

例1 HTML

<p id="cat"></p>

実際は疑似要素を使って文字の前に表示することが多いと思いますが、例としてこんな感じです。

例1-1:べた塗り

#cat{
	width:100px;
	height:100px;

	-webkit-mask-image: url(img/cat.svg);
	-webkit-mask-size: contain;
	-webkit-mask-repeat: no-repeat;
	-webkit-mask-position: center;

	mask-image: url(img/cat.svg);
	mask-size: contain;
	mask-repeat: no-repeat;
	mask-position: center;

	/*変更したい色をここに書く*/
	background-color: pink;
}

Chromeではプレフィックスが必要です。-webkit-を付けましょう。その次に、プレフィックスなしのプロパティを設定します。また、繰り返しや表示位置を設定することができます。
最後の行のようにbackground-colorを設定することで、好きな色に変更できます。

background-color:pink;

background-color:lightblue;

background-color:yellow;

例1-2:レインボーカラー

最初の例は1色でべた塗りですが、backgroundプロパティでいろいろできます。

#cat{
	/*省略*/

	/*レインボー*/
	background: linear-gradient(to right, red, orange, yellow, green, blue, darkblue, purple);
}

参考:linear-gradient() - CSS: カスケーディングスタイルシート | MDN

例2:丸くくりぬく

丸い円の中にアイコンを置くこともできます。

ニャ~ニャ~~

<p id="cat2">ニャ~ニャ~~</p>
#cat2{
	/*アイコンを50pxで表示*/
	--iconsize: 50px;
	--padding: 10px;

	color: #FFF;

	display: inline-flex;
	align-items: center;
	position: relative;

	min-height: calc(var(--iconsize) + var(--padding));
	padding: var(--padding);
	/*右側にアイコンのスペースを確保*/
	padding-right: calc(var(--iconsize) + var(--padding));

	background-image: radial-gradient(circle closest-corner at calc(100% - var(--iconsize) / 2 - var(--padding) / 2) 50%, #FFF calc(var(--iconsize) / 2 - 1px), transparent calc(var(--iconsize) / 2));
	background-repeat: no-repeat;
	background-color: pink;

}#cat2::after{
	content:'';
	width:var(--iconsize);
	height:var(--iconsize);

	display: inline-block;
	position: absolute;
	right:0;

	padding-right: inherit;

	background-color:inherit;
	-webkit-mask-image: url(img/cat.svg);
	-webkit-mask-size: calc(var(--iconsize) - var(--padding));
	-webkit-mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-image: url(img/cat.svg);
	mask-size: calc(var(--iconsize) - var(--padding));
	mask-repeat: no-repeat;
	mask-position: center;
}

解説

--iconsize: 50px;
--padding: 10px;

疑似要素に継承させたいので、カスタムプロパティを設定しています。
アイコンの大きさとパディングです。

min-height: calc(var(--iconsize) + var(--padding));
padding: var(--padding);
padding-right: calc(var(--iconsize) + var(--padding));

min-heightでアイコンと円を表示できる高さを確保。
padding-rightでアイコンの表示スペースを確保しています。

background-image: radial-gradient(
	circle closest-corner at calc(100% - var(--iconsize) / 2 - var(--padding) / 2) 50%,

	#FFF calc(var(--iconsize) / 2 - 1px),

	transparent calc(var(--iconsize) / 2)
);

radial-gradientで、丸い形を作っています。
詳しくはradial-gradient() - CSS: カスケーディングスタイルシート | MDN
をごらんください。
1段目は円の位置。
半径を設定したいので、calc / 2したりpadding分を調整したりしています。
2段目で – 1px しているのは、本当は必要ないんですが、3段目より小さい数字を設定することでガビガビを回避しています。

アイコンは疑似要素で表示しています。
 
リンクボタンなどに便利です。

【CSS mask-image】SVGなどのアイコン画像の色を変更する方法! #フロントエンド #ウェブデザイン #ウェブ制作 #WEBデザイン #WEB制作 #svg #maskimage #css #軽量化 #画像

作者の似顔絵

秋田市在住のプログラマーです。
プログラミングを始めて18年、まだまだ日々勉強。調べたことをブログにまとめていきます。
記事の感想・質問・間違い指摘などはツイッター ( @blooshcompany ) へお願いします。