Как работает calc()

Функция calc(), которая стала доступна в CSS3, позволяет выполнять математические действия над значениями свойств. Например, вместо указания статического значения ширины элемента, мы можем использовать calc(), объявив, что эта величина является результатом сложения двух других ширин.

ПОЧЕМУ CALC()?

Если вы часто используете CSS-препроцессоры (например, SASS), то вы наверняка могли встретить что-то похожее на вышеприведенный пример.

Однако функция calc() является лучшим вариантом сразу по двум причинам:
1.Мы можем объединять в одном выражении разные единицы измерения.
В частности, мы можем комбинировать такие относительные единицы, как проценты и viewport units (vw, vh, vmin и vmax) с абсолютными единицами – пикселями. Например:

В этом примере элемент .quux всегда будет иметь ширину на 60 пикселей меньшую, чем у родителя.
2. Вычисленным значением является само выражение, а не результат этого выражения.
Вот как это выглядит при использовании препроцессора:

А вот так это будет работать при использовании функции calc():

Это означает, что значения в браузере будут более динамическими, они смогут адаптироваться к любым изменениям вьюпорта. Если мы имеем элемент, высота которого на 20 пикселей меньше высоты вьюпорта, то после изменения вьюпорта, высота элемента также останется на 20 пикселей меньше новой высоты видимой части окна.

ИСПОЛЬЗОВАНИЕ CALC()

Функция calc() может быть использована для осуществления всех простейших математических действий с числовыми значениями свойств. Вот несколько примеров:

Вложение Calc()

Функция Calc() может быть вложенной. Однако внутренние функции будут рассматриваться как обычные выражения в скобках. Для примера возьмем следующую вложенную конструкцию:

Вычисленное значение этой функции будет выглядеть таким образом:

Поддержка

Сейчас calc() поддерживается практически всеми современными браузерами. Браузеры же, которые не поддерживают эту функцию просто-напросто игнорируют значение, заданное мат.выражением. Поэтому, чтобы исключить все возможные косяки, на всякий случай задавайте и статическое значение свойства.

КОГДА МОЖНО ИСПОЛЬЗОВАТЬ CALC()?

Функция calc() может быть полезна в различных ситуациях.

Пример 1 – центрирование элементов

Использование calc() предоставляет нам еще одно решение старинной проблемы выравнивания элемента по горизонтали и вертикали внутри контейнера. Если мы знаем размеры дочернего элемента, то стандартным решением центрирования будет являться использование отрицательных margin, равных половине ширины и высоты элемента.

Calc() помогает нам сократить эту запись почти в два раза.

Конечно, с появлением флексбокса, такой метод центрирования стал, мягко говоря, не так актуален. Тем не менее никуда не делись элементы с фиксированным и абсолютным позиционированием, центровка которых невозможна с помощью flexbox.

Пример 2 – создание корневого размера сетки

Функция cacl() может быть использована для создания зависимой от размера вьюпорта сетки. Для этого зададим размер шрифта корневого элемента через vw.

Теперь 1rem будет соответствовать 1/30 ширины вьюпорта (напомню, что rem – это размер шрифта корневого элемента страницы, т.е. html, а vw – это 1% от ширины видимого окна браузера). Для любого текста на странице это будет означать, что он автоматически смасштабируется при любом изменении ширины вьюпорта.


Если мы будем задавать размеры нетекстовых элементов через rem, они будут вести себя также: ширина блока с width: 1rem; будет всегда равна 1/30 ширины вьюпорта.

Пример 3 – ясность

И, наконец, calc() может быть полезен для внесения ясности в неочевидные расчеты. Например, если вы хотите, чтобы элемент занимал ширину равную 1/6 ширины родителя, то вы, предварительно посчитав, пишете что-то вроде этого:

Однако более наглядна, в особенности для людей первый раз читающих ваш код, будет следующая запись:

Перевод статьи: https://bitsofco.de/how-calc-works/

Следить за обновлениями блога в: твиттере, фейсбуке, вконтакте

Отставить комментарий

Ваш электронный адрес не будет опубликован.Обязательные для заполнения поля отмечены *