Тип CSS `<calc-keyword>`
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с июня 2023 года.
<calc-keyword> — это CSS-тип данных, представляющий четко определенные константы, такие как e и pi. Вместо того чтобы требовать от авторов вручную вводить несколько цифр этих математических констант или вычислять их, CSS предоставляет некоторые из них напрямую для удобства.
Синтаксис
Тип <calc-keyword> задает числовые константы, которые можно использовать в математических функциях CSS.
Значения
-
e - Основание натурального логарифма, приблизительно равное
2.7182818284590452354. -
pi - Отношение длины окружности к ее диаметру, приблизительно равное
3.1415926535897932. -
infinity&-infinity - Бесконечное значение, используемое для обозначения максимально возможного или минимально возможного значения.
-
NaN - Значение, представляющее «не число» в каноническом регистре.
Примечания
Сериализация аргументов внутри calc() соответствует стандарту IEEE-754 для вычислений с плавающей точкой. Это означает, что следует учитывать несколько особенностей констант, таких как infinity и NaN:
- Деление на ноль возвращает положительное или отрицательное
infinityв зависимости от знака числителя. - Сложение, вычитание или умножение
infinityна любое значение возвращаетinfinity, если только результатом не становитсяNaN(см. ниже). -
Любая операция хотя бы с одним аргументом
NaNвозвращаетNaN. Это означает, что0 / 0,infinity / infinity,0 * infinity,infinity + (-infinity)иinfinity - infinityвозвращаютNaN. - Возможны положительный и отрицательный ноль (
0⁺и0⁻). Это приводит к следующим последствиям:- Умножение или деление, дающее ноль с ровно одним отрицательным аргументом (
-5 * 0или1 / (-infinity)), а также отрицательный результат в других математических функциях возвращает0⁻. -
0⁻ + 0⁻или0⁻ - 0возвращает0⁻. Все остальные операции сложения и вычитания, результатом которых был бы ноль, возвращают0⁺. - Умножение или деление
0⁻на положительное число (в том числе0⁺) возвращает отрицательный результат (либо0⁻, либо-infinity), тогда как умножение или деление0⁻на отрицательное число возвращает положительный результат.
- Умножение или деление, дающее ноль с ровно одним отрицательным аргументом (
Примеры применения этих правил приведены в разделе «Бесконечность, NaN и деление на ноль».
Примечание: Редко возникает необходимость использовать infinity в качестве аргумента в calc(), но это значение можно использовать, чтобы избежать жестко заданных «магических чисел» или гарантировать, что одно значение всегда будет больше другого. Оно может пригодиться, если нужно явно показать, что свойство имеет «максимально возможное значение» для этого типа данных.
Формальный синтаксис
Описание
Математические константы можно использовать для вычислений только внутри математических функций CSS. Математические константы не являются ключевыми словами CSS, но при использовании вне вычисления обрабатываются как любые другие ключевые слова. Например:
-
animation-name: pi;обозначает анимацию с именем «pi», а не числовую константуpi. -
line-height: e;недопустимо, ноline-height: calc(e);допустимо. -
rotate(1rad * pi);не сработает, так какrotate()не является математической функцией. Используйтеrotate(calc(1rad * pi));
В математических функциях значения <calc-keyword> вычисляются как значения <number>, поэтому e и pi выступают в качестве числовых констант.
Значения infinity и NaN немного отличаются: они считаются вырожденными числовыми константами. Хотя технически это не числа, они ведут себя как значения <number>. Поэтому для получения бесконечного значения <length>, например, требуется выражение вида calc(infinity * 1px).
Значения infinity и NaN включены главным образом для упрощения и повышения наглядности сериализации, но их можно использовать для обозначения «максимально возможного значения», поскольку бесконечное значение ограничивается допустимым диапазоном. Обычно это нецелесообразно, но при использовании бесконечности такой подход гораздо проще, чем указание огромного числа в таблице стилей или жесткое задание магических чисел.
Все константы нечувствительны к регистру, за исключением NaN, поэтому допустимы варианты calc(Pi), calc(E) и calc(InFiNiTy):
e -e E pi -pi Pi infinity -infinity InFiNiTy NaN
Следующие варианты недопустимы:
nan Nan NAN
Примеры
Использование e и pi в calc()
В следующем примере показано, как использовать e внутри calc() для поворота элемента на угол, экспоненциально увеличивающийся со временем. Во втором блоке показано, как использовать pi внутри функции sin().
#wrapper {
display: flex;
flex-direction: row;
justify-content: space-evenly;
}
.container {
display: flex;
flex-direction: column;
align-items: start;
width: 200px;
}
.container > div {
width: 100px;
height: 100px;
margin: 10px;
}
span {
font-family: monospace;
font-size: 0.8em;
}
#e {
background-color: blue;
}
#pi {
background-color: blue;
}
<div id="wrapper">
<div class="container">
<div id="e"></div>
<input type="range" min="0" max="7" step="0.01" value="0" id="e-slider" />
<label for="e-slider">e:</label>
<span id="e-value"></span>
</div>
<div class="container">
<div id="pi"></div>
<input type="range" min="0" max="1" step="0.01" value="0" id="pi-slider" />
<label for="pi-slider">pi:</label>
<span id="pi-value"></span>
</div>
</div>
// sliders
const eInput = document.querySelector("#e-slider");
const piInput = document.querySelector("#pi-slider");
// spans for displaying values
const eValue = document.querySelector("#e-value");
const piValue = document.querySelector("#pi-value");
eInput.addEventListener("input", function () {
e.style.transform = `rotate(calc(1deg * pow(${this.value}, e)))`;
eValue.textContent = e.style.transform;
});
piInput.addEventListener("input", function () {
pi.style.rotate = `calc(sin(${this.value} * pi) * 100deg)`;
piValue.textContent = pi.style.rotate;
});
Бесконечность, NaN и деление на ноль
В следующем примере показано вычисленное значение свойства width при делении на ноль, а затем — как выглядит сериализация разных констант calc() в консоли:
<div></div>
div {
height: 50px;
background-color: red;
width: calc(1px / 0);
}
const div = document.querySelector("div");
console.log(div.offsetWidth); // 17895698 (infinity clamped to largest value for width)
function logSerializedWidth(value) {
div.style.width = value;
console.log(div.style.width);
}
logSerializedWidth("calc(1px / 0)"); // calc(infinity * 1px)
logSerializedWidth("calc(1px / -0)"); // calc(-infinity * 1px)
logSerializedWidth("calc(1px * -infinity * -infinity)"); // calc(infinity * 1px)
logSerializedWidth("calc(1px * -infinity * infinity)"); // calc(-infinity * 1px)
logSerializedWidth("calc(1px * (NaN + 1))"); // calc(NaN * 1px)
Спецификации
Совместимость с браузерами
| Настольные устройства | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome для Android | Firefox для Android | Opera для Android | Safari для iOS | Samsung Internet | WebView для Android | WebView для iOS | |
calc-keyword |
99 |
99 |
108 |
85 |
15.4 |
99 |
108 |
68 |
15.4 |
18.0 |
99 |
15.4 |
NaN |
99 |
99 |
114 |
85 |
16 |
99 |
114 |
68 |
16 |
18.0 |
99 |
16 |
e |
110 |
110 |
108 |
96 |
15.4 |
110 |
108 |
74 |
15.4 |
21.0 |
110 |
15.4 |
infinity |
99 |
99 |
114 |
85 |
16 |
99 |
114 |
68 |
16 |
18.0 |
99 |
16 |
pi |
109 |
109 |
108 |
95 |
15.4 |
109 |
108 |
74 |
15.4 |
21.0 |
109 |
15.4 |
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/calc-keyword