Единственное место, где вы можете использовать функцию calc() - это в качестве значения свойства. Несколько примеров применения calc() для ряда различных свойств:
.box {
font-size: calc(1vw + 2px);
width: calc(100% - 25px);
height: calc(100vh - 60px);
padding: calc(1vw + 8px);
}
Также calc может быть частью значения свойства:
.box {
margin: 10px calc(2vw + 10px);
border-radius: 15px calc(15px / 3) 4px 2px;
transition: transform calc(1s - 120ms);
background: linear-gradient(to bottom, #1E88E5 0%, #1E88E5 calc(50% - 10px), #3949AB calc(50% + 10px), #3949AB 100%);
}
Размерные величины, с которыми работает calc: px, %, em, rem, in, mm, cm, pt, pc, ex, ch, vh, vw, vmin, vmax.
Допускается использование безразмерных величин и даже углов:
.box {
line-height: calc(1.2 * 1.2);
transform: rotate(calc(10deg * 5));
}
Для эстетики кода старайтесь упростить выражение внутри calc(), но если вычисления объёмные, функция поддерживает вложенность:
.box {
width: calc(
calc(100% / 3)
-
calc(1rem * 2)
);
/* Валидное выражение */
}
.box {
width: calc(
(100% / 3)
-
(1rem * 2)
);
/* Упрощённый вариант */
}
В сложных выражениях порядок выполнения действий такой же, как и в математике:
.box {
width: calc(100% / 3 - 1rem * 2); /* Деление и умножение отработают сперва, а потом вычитание */
}
Где использование calc() не сработает
В вычислениях несоответствующих величин
.box {
margin-top: calc(10px + 5); /* не сработает - не указана единица измерения для 5 */
margin-bottom: calc(30px / 10px); /* не сработает - деление и умножение должно осуществляться с безразмерной величиной */
margin-left: calc(30px / 0); /* не сработает - делить на 0 нельзя */
}
В выражениях с неверным синтаксисом
.box1 {
font-size: calc(3vw+2px);
font-size: calc(3vw-2px);
/* не сработают - нет пробела между значениями и знаком действия */
}
.box2 {
width: calc (100% / 3);
/* не сработают - не должно быть пробела между calc и ( ) */
}
В выражениях со строками
.el {
counter-reset: calc("Мой " + "счётчик"); /* Не сработает */
}
.el::before {
content: calc("Текст " * 3); /* Не сработает */
}
В выражениях со значениями атрибутов
<div class="grid" data-columns="7" data-gap="2">
...
</div>
.grid {
display: grid;
/* Не сработает */
grid-template-columns: repeat(attr(data-columns), 1fr);
grid-gap: calc(1rem * attr(data-gap));
}
В параметрах медиа-выражений
@media (min-width: calc(40rem + 1px)) {
/* Не сработает */
}