<pixiv-icon>
はサーバーサイドレンダリング時にも利用できます。@charcoal-ui/icons
は、Node.jsの環境下でimportされたり、APIを呼び出されても問題が起きないように設計されています。
一方、Custom Elementであるということは、SVGアイコンの読み込みはクライアントサイドで行われます。
したがって、大きさが確定せずにレイアウトシフトが起こりうるのは、SSRにおける注意点の一つと言えます。
以下のようなコードをリセットCSSに含めることで、<pixiv-icon>
によるレイアウトシフトの発生を防ぐことができます。
(簡単のため、ネスト記法が利用できるケースを念頭に説明をしています)
pixiv-icon {
display: inline-flex;
width: calc(var(--icon-size, 1em) * var(--scale, 1));
height: calc(var(--icon-size, 1em) * var(--scale, 1));
&[name^='16/'] {
--icon-size: 16px;
}
&[name^='24/'] {
--icon-size: 24px;
}
&[name^='32/'] {
--icon-size: 32px;
}
&[scale='2'] {
--scale: 2;
}
&[scale='3'] {
--scale: 3;
}
/** NOTICE: 現状だと attr(... number) はほとんどのブラウザで動かない */
&[unsafe-non-guideline-scale] {
--scale: attr(unsafe-non-guideline-scale number);
}
}
ただしコメントにもある通り、現状unsafe-non-guideline-scale
をつけた要素は、リセットCSSだけではレイアウトシフトが防げません。
CSSのattr()
が数値の解釈をサポートするまでは、個別にインラインスタイルを用いて大きさを確定させるなどのワークアラウンドが必要です。
<pixiv-icon name="24/Add" unsafe-non-guideline-scale="0.5" style="--scale: 0.5;">
<pixiv-icon name="24/Add" unsafe-non-guideline-scale="0.5" style="width: 12px; height: 12px;">