357

The Less compilers that I'm using (OrangeBits and dotless 1.3.0.5) are aggressively translating

body { width: calc(100% - 250px - 1.5em); }

into

body { width: calc(-151.5%); }

Which is obviously not desired. I'm wondering if there is a way to signal to the Less compiler to essentially ignore the attribute during compilation. I've searched through the Less documentation and both compilers' documentation, and I could not find anything.

Does Less or a Less compiler support this?

If not, is there a CSS extender that does?

2
  • 10
    Are you sure you don't want a compiler less agressive? Commented Aug 15, 2013 at 3:43
  • 1
    I am very sure too, to want the compiler be more aggressive! (the double negation in the previous comment confused me ;) ) (so my vote as well for the nice feature below) Commented Jan 8, 2015 at 23:53

5 Answers 5

556

Less no longer evaluates expression inside calc by default since v3.00.


Original answer (Less v1.x...2.x):

Do this:

body { width: calc(~"100% - 250px - 1.5em"); }

In Less 1.4.0 we will have a strictMaths option which requires all Less calculations to be within brackets, so the calc will work "out-of-the-box". This is an option since it is a major breaking change. Early betas of 1.4.0 had this option on by default. The release version has it off by default.

Sign up to request clarification or add additional context in comments.

6 Comments

Note that if you're compiling less with twitter's recess it ignores this escaping. At least at the time of writing this comment.
I just tried calc(100% - 50px) in less.css 1.4.0 and the result was calc(50%). The awesome ~"..." trick continues to work, but I am confused by the "out-of-the-box" statement, which makes me think the above would work. Luke, how does support for calc change in Less 1.4.0? Thanks!
The question is why did less.js attempt to compute this in the first place? It should throw an error for "100% - 250px" as it can't compute a sensible answer.
Update: I see there's a --strict-units option which prevents these kinds of errors. Awesome!
For future readers, you can also escape just the operator, enabling you to use variables as well. Example: calc(@somePercent ~"-" @someLength)
|
39

A very common usecase of calc is take 100% width and adding some margin around the element.

One can do so with:

@someMarginVariable = 15px;

margin: @someMarginVariable;
width: calc(~"100% - "@someMarginVariable*2);
width: -moz-calc(~"100% - "@someMarginVariable*2);
width: -webkit-calc(~"100% - "@someMarginVariable*2);

1 Comment

34

There is several escaping options with same result:

body { width: ~"calc(100% - 250px - 1.5em)"; }
body { width: calc(~"100% - 250px - 1.5em"); }
body { width: calc(100% ~"-" 250px ~"-" 1.5em); }

Comments

11

There's a tidier way to include variables inside the escaped calc, as explained in this post: CSS3 calc() function doesn't work with Less #974

@variable: 2em;

body{ width: calc(~"100% - @{variable} * 2");}

By using the curly brackets you don't need to close and reopen the escaping quotes.

Comments

1
@variable: 2em;

body{ 
    width: ~"calc(100% - @{variable} * 2)";
}

Reference: Is there a way to use variables in Less for the ~ operator, like ~"calc(100% - @spacing)";

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.