The calc()
CSS function lets you perform calculations when specifying CSS property values. It can be used anywhere a <length>
, <frequency>
, <angle>
, <time>
, <number>
, or <integer>
is allowed.
/* property: calc(expression) */ width: calc(100% - 80px);
The calc()
function takes a single expression as its parameter, with the expression's result used as the value. The expression can be any simple expression combining the following operators, using standard operator precedence rules:
+
-
*
<number>
./
<number>
.The operands in the expression may be any <length>
syntax value. You can use different units for each value in your expression, if you wish. You may also use parentheses to establish computation order when needed.
Note: Division by zero results in an error being generated by the HTML parser.
Note: The +
and -
operators must be surrounded by whitespace. For instance, calc(50% -8px)
will be parsed as a percentage followed by a negative length—an invalid expression—while calc(50% - 8px)
is a percentage followed by a subtraction operator and a length. Likewise, calc(8px + -50%)
is treated as a length followed by an addition operator and a negative percentage.
The *
and /
operators do not require whitespace, but adding it for consistency is both allowed and recommended.
Note: Math expressions involving percentages for widths and heights on table columns, table column groups, table rows, table row groups, and table cells in both auto and fixed layout tables may be treated as if auto
had been specified.
Note: It is permitted to nest calc()
functions, in which case the inner ones are treated as simple parentheses.
calc( <calc-sum> )where
<calc-sum> = <calc-product> [ [ '+' | '-' ] <calc-product> ]*where
<calc-product> = <calc-value> [ '*' <calc-value> | '/' <number> ]*where
<calc-value> = <number> | <dimension> | <percentage> | ( <calc-sum> )
calc()
makes it easy to position an object with a set margin. In this example, the CSS creates a banner that stretches across the window, with a 40-pixel gap between both sides of the banner and the edges of the window:
.banner { position: absolute; left: calc(40px); width: calc(100% - 80px); border: solid black 1px; box-shadow: 1px 2px; background-color: yellow; padding: 6px; text-align: center; box-sizing: border-box; }
<div class="banner">This is a banner!</div>
Another use case for calc()
is to help ensure that form fields fit in the available space, without extruding past the edge of their container, while maintaining an appropriate margin.
Let's look at some CSS:
input { padding: 2px; display: block; width: calc(100% - 1em); } #formbox { width: calc(100% / 6); border: 1px solid black; padding: 4px; }
Here, the form itself is established to use 1/6 of the available window width. Then, to ensure that input fields retain an appropriate size, we use calc()
again to establish that they should be the width of their container minus 1em. Then, the following HTML makes use of this CSS:
<form> <div id="formbox"> <label>Type something:</label> <input type="text"> </div> </form>
Consider the following code:
.foo { --widthA: 100px; --widthB: calc(var(--widthA) / 2); --widthC: calc(var(--widthB) / 2); width: var(--widthC); }
After all variables are expanded, widthC
's value will be calc( calc( 100px / 2) / 2)
, then when it's assigned to .foo
's width property, all inner calc()
s (no matter how deeply nested) will be flattened to just parentheses, so the width
property's value will be eventually calc( ( 100px / 2) / 2)
, i.e. 25px
. In short: a calc()
inside of a calc()
is identical to just parentheses.
Specification | Status | Comment |
---|---|---|
CSS Values and Units Module Level 3 The definition of 'calc()' in that specification. | Candidate Recommendation | Initial definition |
Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|---|
Basic support | 19 -webkit 26 | (Yes) |
4.0 (2) -moz 16 (16)[1] | 9 | ? | 6 -webkit[2] 7 |
On gradients' color stops | 19 -webkit 26 | (Yes) | 19 (19) | 9 | ? | 6 -webkit[2] 7 |
nested calc() | 51[3] | ? | 48 (48) | ? | ? | ? |
Support for <number> values | ? | ? | 48 (48) | ? | ? | ? |
Feature | Android | Edge | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | ? | (Yes) | 4.0 (2) -moz 16.0 (16)[1] | ? | ? | 6 -webkit 7 |
On gradients' color stops | ? | (Yes) | 19.0 (19) | ? | ? | ? |
nested calc() | 51[3] | ? | 48 (48) | ? | ? | ? |
Support for <number> values | ? | ? | 48 (48) | ? | ? | ? |
[1] Support for the non-standard prefixed version -moz-calc()
was removed in Gecko 53.0 (Firefox 53.0 / Thunderbird 53.0 / SeaMonkey 2.50).
[2] In WebKit 6.0 the implementation was incorrect.
[3] See Chromium bug 600113.
calc()
expressions are rejected — causing the value to be invalid — when used as the radius component of a radial-gradient()
function (bug 1376019). Firefox's new parallel CSS engine (also known as Quantum CSS or Stylo, planned for release in Firefox 57) fixes this.calc(1*2*3)
is not parsed successfully; Quantum CSS fixes this (bug 1379467).
© 2005–2018 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/calc()