
IE9からwidth
やheight
などの数値を値に取る属性に対して、複数の値を組み合わせて計算するcalc()
を値に取ることができるようになりました。これによって、例えば「10ピクセルの間隔で画面横幅いっぱいに要素を3つ並べる」といった表現が可能となりました。
ただし、caniuseによるといくつか不具合が報告されているようです。上記のサンプルなどはcalc()
の中で入れ子の計算calc((100% - 20px) / 3)
をしていますが、IE11でも正しく表示されているので、下記に当てはまるケースが全てNGというわけでは無いかと思いますが、実装時にはよく注意する必要がありそうです。
報告されている問題点
- IE10でdiv要素のスタイルの値に
calc()
を指定した場合、子要素の同じ属性の値にinherit
を指定するとクラッシュする。 - IE9からIE11で
calc()
が指定された要素ではbox-shadow
が描画されない。 - IE10とIE11では
transform
の中でのcalc()
は無視される。 - SafariとiOSのSafari(6および7)では
calc()
中でビューポートユニット(vw
,vh
など)は使えない。 - IEとEdgeでは
flex
の中ではcalc()
が使えない。例えばflex: 1 1 calc(50% - 20px);
という記述は機能しない。 - Firefoxでは
line-height
,stroke-width
,stroke-dashoffset
,stroke-dasharray
属性にはcalc()
が使えない。 - IE11では
calc()
の中での入れ子の計算、例えばwidth: calc((100% - 10px) / 3);
で、小数点以下の値の処理がおかしいなどの不具合が報告されている。 - IE11では動的に生成される要素には
calc()
が正しく適用されないという報告がある。 - IE11では
calc()
で指定されたCSSプロパティのtransition処理がサポートされない。