お疲れ様です!るーぷのコーダー、三木です。
今回もいつも通りWeb制作初心者向けに、ちょっと便利なCSSプロパティをご紹介します!
ボタンなどに使用しているアイコンの色を変更したいとき、色違いのアイコンを用意していないでしょうか?
実はCSSだけで、画像として用意したSVGアイコンの色を変更できます。
今回のテーマ
例えば、Webサイトでよく「会社概要 →」のようなページ遷移するためのボタンがあると思います。
矢印の部分は、通常のテキストでは再現しにくいデザインもあるので、SVG画像を使用することがよくあります。
通常なら、aタグにテキストを入れたあと、擬似要素でアイコンを入れるので、以下のようなCSSになります。
.link_btn::after {
content: "";
display: block;
width: 1em;
height: 1em;
background: url(../img/cmn/arrow.svg) no-repeat center / contain;
position: absolute;
right: 1em;
top: calc(50% - .5em)
}
これで矢印を表示します。
しかしここで、私が初心者のころ困ったことがありました。
それが、ボタンをホバーしたときに背景色と文字色を変更する場合です。
矢印も一緒に色を変更したいので、
.link_btn:hover::after {
background-image: url(../img/cmn/arrow-black.svg);
}
というように、色違いのSVG画像をホバー時だけ表示すればOK。とも言えないケースがありました。
それが、transitionをかけているとき。つまり、色を瞬時にではなく、0.4秒ぐらいで滑らかに変化させたいときです。
文字色や背景色には「transition」を指定しているのに、矢印だけはパッと切り替わってしまいます。
実際にみるとこんな感じです。
【解決策】mask-imageを使う
そこでおすすめしたいのが、CSSの「mask-image」です。
mask-imageは、簡単に説明すると、pngやsvg画像の形に合わせて要素を切り抜くことができるプロパティです。
まず、先ほどのCSSを以下のように書き換えます。
.link_btn::after {
content: "";
display: block;
width: 1em;
height: 1em;
background-color: currentColor;
/* currenColorは要素の文字色 */
mask: url(../img/cmn/arrow.svg) no-repeat center / contain;
/* ショートハンドで書けます。url()の部分がmask-image。 */
position: absolute;
right: 1em;
top: calc(50% - .5em);
transition: .4s;/* 忘れずに。 */
}
ポイントは、以下の2つです。
① background-color: currentColor;
通常のbackground-colorではなく「currentColor」を指定しています。
これは、その要素に指定されている文字色(color)と同じ色を使用する指定です。
つまり、ボタンの文字色が黒ならアイコンも黒、白ならアイコンも白になります!
② mask-imageでSVGを指定する
今回は「mask」というショートハンドで一括指定していますが、mask-imageを使ってSVG画像を指定しています。
SVGの形状に合わせて要素が切り抜かれるため、SVG自体の色は関係ありません。
あくまで「形」だけを利用しています。
縦横1em分の大きさの四角で塗りつぶされた擬似要素が、指定したSVGの形で切り取られたとイメージしてください。
また、currentColorで擬似要素の背景色を指定しているので、ホバー時の記述は無しです!
実際の表示はこんな感じになります。
mask-imageを使うときの注意点
とても便利なmask-imageですが、いくつか注意点もあります。
まず、「画像の形に切り抜く」ことが前提なので、透過情報が含まれているsvgやpng画像、またはwebpを使いましょう。
また、今回のように疑似要素で使用する場合は、width・heightを指定して表示領域を確保する必要があります。
ちなみに、今回のコードでは載せませんでしたが、「mask」は一部古いバージョンのブラウザでベンダープレフィックスが必要です。
「-webkit-mask」と書かないと対応できない点にご注意ください。
おわりに
今回は「mask-image」を使って、SVGアイコンの色をCSSで変更する方法をご紹介しました。
私自身、初心者の頃は今回のような色の切り替わりに悩んでいたので、この方法を知ってからはmaskを頻繁に使用しています。
今回のようなボタンでの色変更。
他には、ページ上部のメインヴィジュアル(ヒーローイメージ)にいる間だけヘッダーの背景色が透明で、アイコンを見やすい色に変更しなければならない。
といったケースにおすすめです。
CSSには、今回のように知っているだけでコーディングでの表現が広がるプロパティがたくさんあります。
皆さんもぜひ、制作の中で活用してみてください!
