Арифметичні операції
До того як в CSS з'явилася функція calc()
, препроцесори були єдиним
рішенням за потреби виконати арифметичні обчислення.
Додавання і віднімання
На відміну від функції calc()
, в препроцесорі не можна змішувати типи одиниць.
При спробі виконати додавання або віднімання несумісних типів, виникне помилка.
Пікселі до пікселів, слони до слонів.
.box {
width: 960px + 10%; // Помилка!
width: 960px + 30px; // 990px
width: 960px + 30; // 990px
width: 100% + 20%; // 120%
width: 100% - 50px; // Помилка!
width: 960px - 30px; // 930px
width: 960px - 30; // 930px
width: 100% - 20%; // 80%
}
Справа в тому, що препроцесор не знає наперед, скільки буде 100%
або 5em
у пікселях. Значення відносних одиниць в пікселях можна дізнатися тільки в момент
рендеру HTML-сторінки. Тому для таких обчислень необхідно використовувати
нативну функцію calc()
.
.box {
width: calc(100% - 20px);
width: calc(5em + 20px);
}
Множення
Виконується аналогічно функції calc()
в CSS, за винятком того, що не можна
множити несумісні типи. Також не можна множити слонів на слонів, можна
тільки слонів на множник.
.box {
width: 50px * 50px; // Помилка!
width: 50% * 5%; // Помилка!
width: 50px * 2; // 100px
width: 10px * 2 + 50px; // 70px
width: 5 * (5px + 15px); // 100px
}
Ділення
Ділення в препроцесорі виконується у трьох випадках.
$value: 50px;
.box {
// 1 - значення зберігається у змінній.
width: $value / 5; // 10
// 2 - значення, взяті в круглі дужки.
width: (100px / 5); // 20px
// 3 - значення використовується як частина іншого виразу.
width: 100px / 5px + 10px; // 30px
}
Змінні в операціях
Якщо в арифметичній операції використовується валідне значення змінної, не буде жодних проблем.
- SCSS
- CSS
.box {
margin: 40px;
}
$gridItemMargin: 20px;
.box {
margin: $gridItemMargin * 2;
}
Але у разі, якщо SASS-змінна використовується в функції calc()
, під час
компіляції її ім'я не замінюється на значення.
- SCSS
- CSS
.box {
margin: calc($gridItemMargin * 2);
}
$gridItemMargin: 20px;
.box {
margin: calc($gridItemMargin * 2);
}
У таких випадках необхідно робити інтерполяцію значення змінної, використовуючи
спеціальну конструкцію #{$ім'я_змінної}
.
- SCSS
- CSS
.box {
margin: calc(20px * 2);
}
$gridItemMargin: 20px;
.box {
margin: calc(#{$gridItemMargin} * 2);
}