calc() の式は、足し算・引き算に比べると、掛け算・割り算まわりでブラウザ差が出やすい ことがあります。
ここではそのポイントを、シンプルな例で整理します。
足し算・引き算は、単位が混ざっていても問題になりにくい
calc() の中で + や - を使う場合、長さどうしの加減なら単位が違っても(互換なら)普通に通ります。
width: calc(100% - 20px);
width: calc(10rem + 5px);
ここは仕様も実装も揃いやすいイメージでよいです。
掛け算・割り算は、単位の組み合わせに厳しい
掛け算・割り算は、途中で「長さ × 長さ」のような式を作ると、calc() 全体が無効になることがあります。
たとえば、次は NG です(結果を width にしたいのに、式の型が合わない)。
width: calc(10px * 10px);
「最終的に px っぽく見えるか」ではなく、途中の演算の時点で妥当か が問われます。
Chrome・Safari・Edge(Chromium)では calc(10px * 10px / 1px) が通ることがある
次のように、最後に長さの単位で割る と、結果を長さとして解釈してくれる実装があります。
width: calc(10px * 10px / 1px);
値としては「100px に相当する長さ」に近いイメージの例です。
ただし 推奨パターンというより、エンジンごとの解釈の違いが出やすい書き方 です。
Firefox では同じ式が無効のままになることがある
同じ式でも Firefox ではパースを通さない ことがあります。
width: calc(10px * 10px / 1px); /* Firefox では効かないことがある */
そのため、この書き方に依存する CSS は避けた方が安全です。
実務ではどう書くか
- 倍率や係数は無単位の数にしてから掛ける
例:calc(10px + 2 * (50vw - 20px))のように数 × 長さに寄せる(2は単位なし、(50vw - 20px)は長さ)。 - 「長さ × 長さ」を途中で作らない」
fluid typography やclamp()の中身を組むときも、問題になりやすいのはこのパターンです。
clamp() が効かないと感じたら、まず clamp そのものではなく、中の calc() をブラウザの開発者ツールで無効化されていないか を見ると、切り分けが早くなります。
参考
構文・演算子の優先順位・CSS 型付き演算(乗除まわり)の説明は、次の MDN 日本語版が整理されています。