Filling in the blanks with calc()
Published on: March 28, 2015One of the things in css3 that I don't see used very often is the calc() function. Even though this function might not be useful in every scenario it certainly has it's own use cases. In this post I'll try to outline a few of these use cases for you. First, let's start with a quick introduction to the calc() function.
What is calc()?
Calc() is a function that was added to css3. It allows you to perform calculations on a certain property value, for example the width, font-size or even the margins of an element can be calc()-ed. The syntax for it is quite simple:
.my-class { width: calc(100% - 3em); }
This code snippet sets the width of an element to 100% minus 3em. What's interesting about this is that we're combining both percentages and em values. So you can be partially fluid and partially fixed in your layout. Calc is very powerful and will perform this calculation whenever the element is being layed-out on the screen, making it incredibly flexible. An important thing to notice here is that there are spaces around the minus operator. These spaces are required.
Using calc for gutters
When building your layout you will often want to have a certain gutter in it. For instance, you could want a gutter that is exactly .75em all the time between two elements. For these cases calc is a perfect fit. Here's an example of that.
In the embedded codepen you'll see that we used only a small amount of css to accomplish this layout. A quick look at the css:
.item { height: 50px; float: left; } .item-1 { width: 25%; background-color: #c0ff3e; } .item-2 { width: calc(75% - .75em); margin-left: .75em; background-color: #0ff1ce; }
The nice part about this is that a use can adjust their font-size and the layout will adapt to that because we've used ems. The calc() function will make sure that our page will still look pretty. If you take this approach to the next level I'm pretty sure it should be possible to use calc() in a very advanced and flexible grid system.
Calc to fill up the page
There are times where you might want to make an element take up all the width minus some known portion of the page. This becomes interesting in the case of a sidebar with a known width and content that should make up the rest of the page. Let's jump straight in with an example, shall we?
If we ignore all the kitten cuteness that Placekitten.com is providing this example with we're left with this piece of relevant css.
.item-1 { width: 250px; } .item-2 { width: calc(100% - 250px - .75em); margin-left: .75em; }
What this demonstrates is that it suddenly becomes easy to have a partially fixed and partially flexible layout and that calc is very powerful because you can mix all kind of values. Pixels, ems, percentages, calc() will calculate them for you. It's pretty cool actually.
How about browser support?
I'm glad you asked, browser support is more than decent for the calc feature. All new browsers have implemented it and they have done so for quite some time. Even IE has had support for some time, they only didn't implement multiplying and dividing until IE10. For an up to date list of support you can refer to caniuse.com.
Conclusion
In this post you've learned what the calc() function is in css3 and I've showed you two real word examples of when you might want to use calc() in your own projects. Browser support is good so there's nothing stopping you from sprinkling some calculations in to your css. If you have questions, suggestions or feedback you can always send me a Tweet.