'Sass negative variable value?
I have a couple of scss selectors where I use the same amount positive and negative, as in:
padding: 0 15px 15px;
margin: 0 -15px 20px -15px;
I'd prefer to use a variable for all the 15px amounts, but this does not work:
$pad: 15px;
padding: 0 $pad $pad;
margin: 0 -$pad 20px -$pad;
The margin amounts convert to positive numbers. Am I missing something?
Solution 1:[1]
create a function
@function neg($val) {
@return $val * -1
};
then I use it like this
$gutter: 30px;
.header {
margin: $gutter neg($gutter);
}
Solution 2:[2]
Try it like this
margin: 0 (-$pad) 20px (-$pad);
Solution 3:[3]
A more sane solution according to sass guidelines would be to interpolate variables like the following example:
margin: 0 -#{$pad} 20px -#{$pad};
An example: https://www.sassmeister.com/gist/c9c0208ada0eb1fdd63ae47830917293
Solution 4:[4]
I'm adding my two-penneth after considering the two previous answers, but then reading this (emphasis mine):
You should especially avoid using interpolation like
#{$number}px. This doesn’t actually create a number! It creates an unquoted string that looks like a number, but won’t work with any number operations or functions. Try to make your math unit-clean so that$numberalready has the unitpx, or write$number * 1px.
Therefore I believe the correct way would be as follows, which preserves the mathematical abilities of SASS/SCSS:
$pad: 15px;
padding: 0 $pad $pad;
margin: 0 $pad*-1 20px $pad*-1;
Solution 5:[5]
The official sass guides suggest a similar solution to the (currently) highest voted answer - instead of wrapping the minus-sign inside the parens, put it outside, e.g.
$pad: 15px;
padding: 0 $pad $pad;
margin: 0 -($pad) 20px -($pad);
source: https://sass-lang.com/documentation/operators/numeric#unary-operators
and per #comment-72915126 you would want to interpolate the sass value when it appears inside a css calc function:
margin: calc(#{-$pad} - 10px);
strangely, the parens are no longer required - perhaps the string interpolation acts in a similar way to wrapping it in parens?
(I'm using [email protected] and [email protected])
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Bouh |
| Solution 2 | Zoltan Toth |
| Solution 3 | |
| Solution 4 | EvilDr |
| Solution 5 | Jon z |
