O'Reilly

CSS calc

By on  

CSS is a complete conundrum; we all appreciate CSS because of its simplicity but always yearn for the language to do just a bit more. CSS has evolved to accommodate placeholders, animations, and even click events. One problem we always thought we'd have with CSS, however, was its static nature; i.e. there's really no logic, per se. The CSS calc routine bucks that trend, providing developers an ounce of programming ability within CSS.

The CSS

The calc routine is especially useful when calculating relative widths. Calculations can be additions, subtractions, multiplications, and divisions. Have a look:

/* basic calc */
.simpleBlock {
	width: calc(100% - 100px);
}

/* calc in calc */
.complexBlock {
	width: calc(100% - 50% / 3);
	padding: 5px calc(3% - 2px);
	margin-left: calc(10% + 10px);
}

Be sure to use whitespace around operators so that they aren't construed as positive and negative notations.

CSS calc is another example of CSS taking over the role of JavaScript in layout, and I think it's a great thing. As we move more toward responsive design, calc allows us to use percentages for overall block widths, with just a touch of pixel help for some of its components. Have you used calc for your apps? Share how you used calc!

Track.js Error Reporting

Upcoming Events

Recent Features

Incredible Demos

Discussion

  1. Browser compatibility ?

    • Sorry for the duplicate! didn’t see I coulld reply directly.

      Hey Adoumas,

      With a google search I found this compatibility table: http://caniuse.com/calc. Not supported in < IE 9, so it's pretty limited if you're dependent upon using this for relative width layouts. It could be useful elsewhere though.

    • srigi

      For people who doesn’t want to click:
      IE9+, Firefox 4+, Chrome 19+, Safari 6+, iOS 6+, overal support 72%.

  2. jessek

    Pardon my ignorance, but what are the benefits of doing this over using ‘box-sizing:border-box’ for responsive layout? I understand that you can mix percentage padding with a hint of static, but why would you want to?

    • You could set a layout width to 100% (responsive), while always leaving {x} pixels of that width for an absolutely positioned block on the right; that’s just one example.

  3. Calc() is quite awesome! Did you know you can use it in gradients and background-size/position too?

    Today’s HTML & CSS Advent 2012 entry is actually about the calc() function too.
    http://advent2012.digitpaint.nl/17/

  4. Hey Adoumas,

    With a google search I found this compatibility table: http://caniuse.com/calc. Not supported in < IE 9, so it's pretty limited if you're dependent upon using this for relative width layouts. It could be useful elsewhere though.

    Rob

  5. One word: awesome. Guess what I will be using in my next project?

  6. I share the words of some mates: Awesome! But hey! This is awesome for building grids! Take a look http://codepen.io/ed1nh0/pen/puhsf Tks for share!

  7. Sweet! I’ll have to try calc() out on my next web app

  8. RR

    Not supported for IE <= 9…

  9. CSS3 calculator … Isn’t it?
    I didn’t have a clue about it before though

  10. Salman Abbas

    **** you Android! I expected better from Google.

  11. unykron

    is there a way I can use calc to find the height of a div’s parent, then divide that by 2 and then apply that to the child div’s position so it is vertically centered within its parent when the parents height is flexible depending on the browser windows size? Or is this strictly java script?

    Side note, it seems ridiculous that there is still no way to effectively vertically center an item on the page in css without a workaround! I can do top: x; bottom: x; why isn’t there a center: x or something!

    • left: 50%; transform: translateX: -50%;
      

      This works since left is based on the container and the transform is based on the object.

  12. Hello David,
    I am trying to solve a quite complicated issue here with the CSS3 calc functionality you are advising here.
    General description of my issue you can read in this forum (where i also bought a Drupal Responsive Theme btw) :
    http://refaktorthemes.com/support/viewtopic.php?f=14&t=84&p=7606#p7606

    Do you think there’s a way to have that calc taking into account of a number of content items going to be listed (horizontally in my case) ?
    Thanks upfront for your advise!
    Bart

  13. Additionally to previous post, i found this as a possible solution (?)
    http://stackoverflow.com/questions/15831657/creating-css-global-variables/18941918#18941918
    If i understand it correctly, some CSS selectors are generated via php scripting, so it should in my opinion be possible to assign content specific values to those variables too…

  14. I’ve written a simple JS script to [detect calc support](http://aklp.gr/how-to-check-if-your-browser-supports-CSS3-s-calc-with-javascript)

  15. I use Modernizr to detect CSS calc support and a jQuery fallback solution in case is not supported.

    
    div#main {
        width: calc(100% - 100px);
        height: calc(100% - 50px);
    }
    
    if(! Modernizr.csscalc) {            
        $(window).resize(function() {
            var width = $(window).width() - 100;
            var height = $(window).height() - 50;
                         
            $("div#main").width(width);
            $("div#main").height(height);    
        });
                     
        $(window).resize(); 
    }
    
  16. Kostas Loupasakis

    You should check vh, vw and vmin then. Once properly supported by browsers, layout creation will be fun again! For real!

  17. Great article, thought I’d share my little experiment using calc and vw to make emails responsive in Gmail.

    http://emailcodegeek.com/responsive-email-in-gmail/

    It’s pretty pointless as it only works on larger devices. The Gmail mobile site and Gmail apps all strip style blocks and linked CSS. Just a bit of fun.

  18. Used calc on a recent project, I needed to use the modernizr tool.

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!

Recently on David Walsh Blog

  • OâReilly Velocity Conference â Amsterdam

    My favorite front-end conference has always been O'Reilly's Velocity Conference because the conference series has focused on one of the most undervalued parts of client side coding:  speed.  So often we're so excited that our JavaScript works that we forget that speed, efficiency, and performance are just as important. The next Velocity...

  • CanIUse Command Line

    Every front-end developer should be well acquainted with CanIUse, the website that lets you view browser support for browser features.  When people criticize my blog posts for not detailing browser support for features within the post, I tell them to check CanIUse:  always up to date, unlike...

  • Generating Alternative Stylesheets for Browsers Without @media

    If your CSS code is built with a mobile-first approach, it probably contains all the rules that make up the "desktop" view inside @media statements. That's great, but browsers that don't support media queries (IE 8 and below) will simply ignore them, ending up getting the...

  • Serve a Directory with PHP

    Many developers have a giggle at PHP, even looking down at the language, but let's be honest:  most of our blogs are powered by it (WordPress) and it's a great language to dabble around with.  I cut my teeth on PHP, though I prefer to avoid PHP these days. But...

  • Tips you can Use to Build an Excellent eCommerce Experience

    There are many reasons to build a good eCommerce experience if you are planning to build an eCommerce website. Visitors can place items in their cart and leave your site without making a purchase. In fact, three out of every four of them will do so....