アイコンは SVG コンポーネントではなく CSS の mask で(Icons in Pure CSS)
SVG を data URI にして mask に指定し、background-color: currentColor で塗ると、クラス1つで「文字色に追従し、文字サイズで伸縮する」アイコンになる。
どんな時に使う?
- React などで SVG アイコンコンポーネントを大量に import して JS バンドルが重いとき。
- 投稿者は SVG アイコンライブラリをやめて CSS クラス化し、CSS は増えたが JS が大きく減って Lighthouse スコアが改善したと報告。
コード
css
.icon {
display: inline-block;
inline-size: 1em; /* 親の font-size に追従 */
block-size: 1em;
background-color: currentColor; /* 文字色に追従 */
mask: var(--svg) no-repeat center / 100% 100%;
}
.icon-check {
--svg: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z'/%3E%3C/svg%3E");
}html
<button><span class="icon icon-check" aria-hidden="true"></span>保存</button>- 単色アイコン →
mask+currentColor。 - 多色アイコン →
background: url(...) no-repeat center / 100% 100%で画像としてそのまま表示。 - SVG はテキストなので base64 より URL エンコード(
<→%3Cなど)のほうが小さくなる。 - 手書きせず UnoCSS の preset-icons(Iconify)などで自動生成するのが現実的。
注意点
- 装飾アイコンは
aria-hidden="true"、意味があるならボタン側にラベルを付ける。 - 使うアイコンが多いと CSS が膨らむので、必要なものだけ生成する仕組みと組み合わせる。
出典
- @ryoppippi · 2026-07-04 (紹介されている解説: Anthony Fu「Icons in Pure CSS」 antfu.me )