Last updated on

CSS の `calc()` がブラウザによって通らないとき(掛け算・割り算と単位)

  • CSS
  • Firefox
  • calc
  • Chrome
  • Safari
  • Edge

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 日本語版が整理されています。