Формальный синтаксис функции calc():

свойство: calc(выражение);

Выражение внутри calc как правило содержит некоторое математическое действие, результат которого является значением css-свойства, к которому применён calc.

Выражение может включать такие математические операторы, как:

  • сложение ( width: calc(10px + 25px) );
  • вычитание ( width: calc(100px - 25px) );
  • умножение ( width: calc(20% * 2) );
  • деление ( width: calc(100% / 3) );

Валидным, но не имеющим эффекта, будет выражение:

.box {
  width: calc(20px);
}

Важной частью синтаксиса являются пробелы.

Пробелы обязательно должны быть по обеим сторонам у операторов + и - . Что, в свою очередь, не является обязательным для операторов * и / (но для красоты кода лучше ставить).

.box1 {
  margin-top: calc(50% - 8px); 
  /* валидное выражение */
}
.box2 {
  margin-top: calc(50%     -     8px);
  /* также валидное, количество пробелов не имеет значения */
}
.box3 {
  margin-top: calc(
    100%
    /
    3
  );
  /* также валидное, перенос строки допускается */
}
.box4 {
  margin-right: calc(100%/3); 
  /* валидное, но не эстетичное */
}

Хорошим примером для демонстрации необходимости в пробелах является использование отрицательных значений в вычислениях:

.box {
  margin: calc(5vw - -5px); /* валидное выражение, аналогичное (5vw + 5px) */
}