Как всегда случайно набрел в просторах Интернет на интересный блог одной девушки-дизайнера с не менее интересным именем Inayaili de León Persson.
Более того, эта девушка португальского происхождения родом из Панамы, но родилась она в СССР! С 2008 года живет в Лондоне и работает ведущим веб-дизайнеров в Canonical. Как все запутано!
Но это было лирическое вступление. Переходим к главному. Мне на глаза уже давно попадались описания функции
- на CSSTricks (еще не успел прочитать) и на htmlbook (успел прочитать). Последний источник как-то не впечатлил, из-за сухости изложения материала, наверное.1
calc()
А вот на сайте девушки с таким необычным именем функция
описана кратко, но интересно, с примерами. И хоть написана статья была в далеком 2011 году, мне интересно было ее прочитать для себя (и фактически перевести).1
calc()
Что такое функция calc()
Функция
может быть использована для вычисления различных линейных размеров на странице. Например, с ее помощью можно рассчитывать значение границ, 1
calc()
, 1
margin
, кегля и многое другое.1
padding
Вычисление ширины объектов может быть чрезвычайно сложной задачей, особенно если макет сайта резиновый; функция
уникальная, потому что она позволяет выполнять расчеты внутри самих таблиц стилей CSS.1
calc()
Функция
умеет работать с простейшими математическими операторами:1
calc()
- сложением
1
+
- вычитанием
1
-
- умножением
1
*
- делением
1
/
Давайте рассмотрим простейший пример работы функции
:1
calc()
Очень просто, не правда ли? В одной функции может использоваться не один, а несколько математических операторов:
В текущей спецификации говориться, что операции умножения и деления имеют приоритет над операциями сложения и вычитания. Это означает, что в примере выше сначала будет вычислено выражение
, и только затем два оставшихся - сложение и вычитание. Также обратите внимание, что деление на 0 приведет (и должно привести) к ошибке.1
2px*2
Спецификация по функции
еще не завершена, но ее основы уже готовы.1
calc()
Простой пример calc()
Для того, чтобы показать возможности функции
, была создана базовая разметка страницы с помощью этой функции.1
calc()
Разметка состоит из основного контейнера
(расположенного слева), колонки справа 1
div id="main"
и подвала, помещенного внизу 1
div id="accessory"
.1
div id="footer"
Ниже приведен код этой разметки:
После применения не требующего объяснений (надо надеяться) простого сброса CSS-стилей (полный код CSS-сброса смотрите в исходном коде примера - Calc Examples), установки базового шрифта и внешнего вида ссылок, стилизуем элемент
:1
body
После этого я говорю, что основной контейнер
должен занимать всю ширину своего контейнера (100%) за вычетом 40 пикселей и располагаться горизонтально, по центру:1
div.wrapper
В коде выше была добавлена строка отката для браузеров, которые не поддерживают работу с функцией
, а также браузерный префикс 1
calc()
для браузера Firefox 4.1
-moz-
Затем устанавливается ширина, границы, плавание влево и
для основного блока с контентом 1
margin
:1
div#main
Давайте разберемся с функцией
в этом примере кода. Здесь я хочу, чтобы ширина контейнера 1
calc()
равнялась 75% (75% от ширины контейнера-родителя, не забывайте об этом!).1
div#main
Но из этой ширины мне необходимо вычесть
слева и справа от контейнера - 1
padding
, а также ширину границы с обоих сторон - 1
20px*2
.1
8px*2
Переходим к боковой панели
и говорим ей, что она должна занимать оставшуюся ширину контейнера-родителя в 25%. Но при этом также должны учитываться ширина границы этого блока, 1
div#accessory
и 1
margin-right: 20px
. Блок будет “плавать” вправо:1
padding
Если более подробно разобрать выражение
, то увидим, что из первоначальной ширины 25% вычитается padding справа и слева 1
calc(25% - 10px*2 - 8px*2 -20px)
, ширина правой и левой сторон границы этого блока 1
10px*2
, а также правый 1
8px*2
для блока-контейнера 1
margin
.1
div#main
Блок-подвал
просто имеет ширину, равную всей ширине блока-родителя. Я думаю, что описывать стили для этого блока излишне.1
footer
Если уменьшать размер окна браузера, то при достижении им определенной величины ширина боковой панели
становиться слишком маленькой, что нарушает дизайн страницы.1
div#accessory
Поэтому в код ниже был добавлен простой
, с помощью которого у блоков 1
media query
и 1
div#main
убирается плавание влево-вправо и пересчитывается ширина обоих блоков так, чтобы они занимали 100% ширины блока-родителя за минусом ширины границ и соответствующих 1
div#accessory
:1
padding
Приведенный выше пример разметки страницы является очень упрощенным. Но есть надежда, что он заинтересует вас и подтолкнет к дальнейшим экспериментам с замечательной функцией
.1
calc()
Поддержка браузерами
Функция
поддерживается браузером IE9 и Firefox 4 (для которого необходимо указать браузерный префикс 1
calc()
). Я понимаю, однако, что применение этой функции в устаревших браузерах к таким вещам, как анимация, может быть большой проблемой. Но в тоже время, анимация не является жизненно важной необходимостью сайта.1
-moz-calc()
Это не означает, что вы не должны пробовать эту функцию на практике. Ведь разработчики браузеров Firefox и IE предприняли усилия для того, чтобы внести поддержку данной функции в свои браузеры. Доля этих браузеров на мировом рынке самая большая, поэтому, я полагаю, что остальные производители браузеров не останутся долго в стороне.
В своих примерах я предпочла использовать откат в виде абсолютной величины (ширина блока) для браузеров, которые не поддерживают данную функцию.
Дальше переводить не стал, ибо идет сплошная “вода” в виде заключения и всяческих пожеланий, не относящаяся к делу.