calc()
Функція CSS calc() (обчислити) дає змогу виконувати обчислення при заданні значень властивостей CSS. Вона може використовуватися зі значеннями <length>, <frequency>, <angle>, <time>, <percentage>, <number>, <integer> і <color-function>.
Спробуйте його в дії
Синтаксис
/* calc(вираз) */
calc(100% - 80px)
/* Вираз із функцією CSS */
calc(100px * sin(pi / 2))
/* Вираз, що вміщає змінну */
calc(var(--hue) + 180)
/* Вираз із колірними каналами у відносних кольорах */
lch(from aquamarine l c calc(h + 180))
Функція calc() приймає за параметр один вираз, і результат цього виразу використовується як значення властивості CSS. У цьому виразі операнди можна комбінувати за допомогою операторів, перелічених нижче. Коли вираз містить кілька операндів, calc() використовує стандартні правила пріоритету операторів:
+Додає вказані операнди.
-Віднімає другий операнд від першого.
*Множить вказані операнди.
/Ділить операнд зліва (ділене) на операнд справа (дільник).
Усі операнди, крім операндів типу <number>, повинні мати суфікс із відповідними одиницями вимірювання, такими як px, em або %. У різних операндах одного виразу можна використовувати різні одиниці вимірювання. Також для задання порядку обчислення можна використовувати дужки, якщо це потрібно.
Опис
Дещо варто взяти до уваги під час роботи з calc():
-
Серіалізація аргументів усередині
calc()виконує стандарт обчислень над числами з рухомою комою IEEE-754, а отже є кілька випадків, які треба мати на увазі, щодо сталихinfinityтаNaN. Більше про те, як серіалізуються сталі, дивіться на сторінціcalc-keyword. -
Математичні вирази, що мають відсоткові значення для обчислення ширин і висот для табличних колонок, груп табличних колонок, табличних рядів, груп табличних рядів і табличних комірок, як в таблицях з автоматичним компонуванням, так і в таблицях з фіксованим, можуть розглядатися так, ніби було задано
auto. -
Функція
calc()не може безпосередньо замінити числове значення у відсотковому типі; наприклад,calc(100 / 4)%– невалідний запис, аcalc(100% / 4)– валідний. -
Коли
calc()використовується там, де очікується<integer>, то значення округлюється до найближчого цілого. Томуcalc(1.4)дасть значення1. Якщо дробова частина значення рівна0.5, то значення округлюється до більшого. Наприклад,calc(1.5)дасть значення2, аcalc(-1.5)округлиться до-1. -
calc()не може виконувати обчислення над значеннями природних розмірів, як тоautoіfit-content. Для них користуйтеся натомість функцієюcalc-size().
Правила та найкращі підходи під час роботи з calc()
- Оператори
+і-повинні бути оточені пробілами. Наприклад,calc(50% -8px)буде тлумачитись як "відсоткове значення, після якого стоїть від'ємна довжина" – що є недійсним виразом, аcalc(50% - 8px)– "відсоткове значення, після котрого – оператор віднімання та довжина". Аналогічно,calc(8px + -50%)тлумачиться як "довжина, після якої стоїть оператор додавання і від'ємне відсоткове значення". - Оператори
*і/не вимагають пробілів, але додавання таких пробілів для сталості – рекомендується. - Дозволена вкладеність викликів функції
calc(), у випадку чого внутрішні виклики обробляються як прості дужки. - У випадку довжин не можна використовувати
0на позначення0px(або іншої одиниці довжини); натомість слід використовувати версію з одиницями вимірювання:margin-top: calc(0px + 20px);– дійсний запис, аmargin-top: calc(0 + 20px);– ні. - Нинішні реалізації вимагають, щоб в операторів
*і/один з операндів не мав одиниць вимірювання. У випадку/саме правий операнд не повинен їх мати. Наприклад,font-size: calc(1.25rem / 1.25)– дійсний запис, аfont-size: calc(1.25rem / 125%)– недійсний.
Підтримка обчислення колірних каналів у відносних кольорах
Функція calc() може використовуватися для роботи з колірними каналами безпосередньо в контексті відносних кольорів. Це дає змогу динамічно підлаштовувати колірні канали в колірних моделях штибу rgb(), hsl() і lch().
Синтаксис відносного кольору визначає низку ключових слів для колірних каналів, кожне з яких представляє значення колірного каналу як <number> (дивіться більше в Значеннях каналів, що розв'язуються до значень <number>). Функція calc() може використовувати ці ключові слова колірних каналів, щоб виконувати динамічне підлаштування колірних каналів, наприклад, calc(r + 10).
Формальний синтаксис
calc( <calc-sum> )де
<calc-sum> = <calc-product> [ [ \'+\' | \'-\' ] <calc-product> ]*де
<calc-product> = <calc-value> [ \'*\' <calc-value> | \'/\' <number> ]*де
<calc-value> = <number> | <dimension> | <percentage> | <calc-constant> | ( <calc-sum> )
Доступність
Коли calc() використовується для контролю розміру тексту, слід слідкувати, аби одне зі значень мало відносну одиницю довжини, наприклад:
h1 {
font-size: calc(1.5rem + 3vw);
}
Це дасть змогу пересвідчитися, що розмір тексту масштабується при збільшенні сторінки.
Приклади
Розташування об'єкта з зовнішнім відступом на екрані
calc() дає змогу легко розташувати об'єкт, що має зовнішній відступ. У цьому прикладі CSS утворює банер, що розтягується на все вікно, з 40-піксельною прогалиною з обох боків банера до країв вікна:
.banner {
position: absolute;
left: 40px;
width: calc(100% - 80px);
border: solid black 1px;
box-shadow: 1px 2px;
background-color: yellow;
padding: 6px;
text-align: center;
box-sizing: border-box;
}
<div class="banner">Це банер!</div>
Автоматичний розмір полів форми для вписування їх у контейнер
Іще одне застосування calc() – допомогти пересвідчитись, що поля форми вписуються у доступний простір, не вилазять за край контейнера, дотримуючись при цьому відповідного відступу.
Погляньмо на певний CSS:
input {
padding: 2px;
display: block;
width: calc(100% - 1em);
}
#form-box {
width: calc(100% / 6);
border: 1px solid black;
padding: 4px;
}
Тут сама форма займає 1/6 доступної ширини вікна. Далі, щоб поля введення зберігали відповідний розмір, знову використовується calc() для задання того, що вони повинні мати ширину свого контейнера мінус 1em. Далі – цей CSS використовує такий HTML:
<form>
<div id="form-box">
<label for="misc">Надрукуйте щось:</label>
<input type="text" id="misc" name="misc" />
</div>
</form>
Вкладеність вкупі зі змінними CSS
Можна використовувати calc() вкупі зі змінними CSS. Погляньте на наступний код:
.foo {
--widthA: 100px;
--widthB: calc(var(--widthA) / 2);
--widthC: calc(var(--widthB) / 2);
width: var(--widthC);
}
Коли всі змінні розгорнуті, значення widthC стає calc(calc(100px / 2) / 2). Коли його присвоєно властивості ширини за селектором .foo, то всі внутрішні функції calc() (незалежно від глибини своєї вкладеності) сплощуються до простих дужок. Отже, значенням властивості width зрештою буде calc((100px / 2) / 2), що дорівнює 25px. Стисло висловлюючись, calc() всередині calc() рівносильно використанню дужок.
Підлаштування колірних каналів у відносних кольорах
Функція calc() може використовуватися для підлаштування окремих колірних каналів у відносних кольорах без потреби зберігати значення колірних каналів як змінні.
У прикладі нижче перший абзац використовує <named-color>.
У наступних абзацах вживається calc() вкупі з функціями rgb() і hsl(), щоб підлаштувати значення кожного з колірних каналів на основі вихідного іменованого кольору.
<p class="original">Вихідний колір тексту – rebeccapurple</p>
<p class="increase-hue">Барва збільшена на 80</p>
<p class="increase-lightness">Світність збільшена на 20</p>
<p class="decrease-lightness">Світність зменшена на 10</p>
.original {
color: rebeccapurple;
}
.increase-hue {
color: lch(from rebeccapurple l c calc(h + 80));
}
.increase-lightness {
color: lch(from rebeccapurple calc(l + 20) c h);
}
.decrease-lightness {
color: lch(from rebeccapurple calc(l - 10) c h);
}
Ще один приклад застосування функції calc() для виведення відносних кольорів дивіться у розділі Використання математичних функцій на сторінці Використання відносних кольорів.
Специфікації
Сумісність із браузерами
| desktop | mobile | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
calc()
|
Chrome Full support 26 | Edge Full support 12 | Firefox Full support 16 | Internet Explorer Full support 9 | Opera Full support 15 | Safari Full support 7 | WebView Android Full support 37 | Chrome Android Full support 28 | Firefox for Android Full support 16 | Opera Android Full support 14 | Safari on iOS Full support 7 | Samsung Internet Full support 1.5 |
Gradient color stops support
|
Chrome Full support 19 | Edge Full support 12 | Firefox Full support 19 | Internet Explorer Full support 9 | Opera Full support 15 | Safari Full support 6 | WebView Android Full support 37 | Chrome Android Full support 28 | Firefox for Android Full support 19 | Opera Android Full support 15 | Safari on iOS Full support 6 | Samsung Internet Full support 1.5 |
Nested calc() support
|
Chrome Full support 51 | Edge Full support 16 | Firefox Full support 48 | Internet Explorer No support Ні | Opera Full support 38 | Safari Full support 11 | WebView Android Full support 51 | Chrome Android Full support 51 | Firefox for Android Full support 48 | Opera Android Full support 41 | Safari on iOS Full support 11 | Samsung Internet Full support 5.0 |
<number> value support
|
Chrome Full support 31 | Edge Full support 12 | Firefox Full support 48 | Internet Explorer Full support 9 | Opera Full support 18 | Safari Full support 6 | WebView Android Full support 4.4.3 | Chrome Android Full support 31 | Firefox for Android Full support 48 | Opera Android Full support 18 | Safari on iOS Full support 6 | Samsung Internet Full support 2.0 |
Дивіться також
<calc-keyword>- Функції CSS
- Повний посібник із calc() у CSS (CSS-Tricks)