Единицы длины

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

CSS определяет два вида единиц длины, для задания размеров элементов: абсолютные и относительные. Абсолютные единицы не зависят от устройства вывода, а относительные единицы определяют размер элемента относительно значения другого размера.

Абсолютные единицы

Указывать длину можно в разных единицах. Единицы pt (пункт) и pc (пика) CSS получил в наследство от печатного дела. Там традиционно применялись эти и подобные единицы, а не сантиметры или дюймы. Другие, например сантиметр (cm) и дюйм (in), знакомы нам в повседневном обиходе. Есть и «волшебная» единица, придуманная специально для CSS: px.

Список абсолютные единиц измерения длины

CSS поддреживает следующие типы абсолютных единиц

in
Дюймы
cm
Сантиметры
mm
Миллиметры
pt
Пункты (1 пункт равен 1/72 дюйма)
pc
Пики (1 пика равна 12 пунктам)
Так называемые абсолютные единицы (cm, mm, in, pt и pc) в CSS означают то же самое, что и везде, но только если у устройства вывода достаточно высокое разрешение. На лазерном принтере 1cm должен быть точно равен 1 сантиметру. Но на устройствах низкого разрешения, вроде компьютерных экранов, CSS этого не требует. И вправду, разные устройства и разные реализации CSS норовят отобразить их по-разному. Лучше оставить эти единицы для устройств высокого разрешения, в частности для печати. На компьютерных экранах и мобильных устройствах может получиться не то, что ожидалось.
Еще одна причина не использовать абсолютные единицы где-либо, кроме печати: на разные экраны мы смотрим с разного расстояния. 1 сантиметр на экране настольного компьютера выглядит маленьким. Но на мобильном экране прямо перед глазами — это много. Лучше вместо них использовать относительные единицы.

in

Дюймы

.wrapIn {
    font-size: 1in; /* 1in == 96px */
}
				

1in == 96px

cm

Сантиметры

.wrapCm {
    width: 3cm; /* 1cm == 37.8px */
    height: 2cm;
    border: 0.5cm solid black;
}
				
1cm == 37.8px

mm

Миллиметры

.wrapMm {
    width: 100mm; /* 1mm == 0.1cm == 3.78px */
    height: 100mm;
    border: 1mm solid black;
}
				
1mm == 0.1cm == 3.78px

px абсолютная или относительная единицы измерения длины?

Первоначально считалось что пиксель - это мельчайшая точка, которую можно установить на экране компьютера. Отсюда следует следующее вопрос - "Почему пиксель относительная величина?".

Если мы возьмём `физический` монитор, у которого, естественно, есть диагональ — это реальная физическая величина. Значит пиксель должен быть абсолютной величеной. Но ведь мы можем поставить на нём любое разрешение, правильно? В результате получается, что в зависимости от поставленного нами разрешения, величина пикселя может меняться. Вот почему пиксель — относительная величина. То есть на разных мониторах px имеет разный размер.

Как мы узнали ранее px - это относительная единица длины, но, на самом деле это уже не так. С недавних пор пиксели считаются абсолютной единицей, и тому свидетельствует небольшая история.

В CSS1 px пиксель сделали относительным, потому что он считался реальным пикселем устройства. Ведь, по сути, устройства разные. В каком нибудь лазерном принтере пиксель - это один микрон, а например, на уличном экране, пиксель уже равняется пару сантиметрам. В общем px был относительно DPI устройства вывода. В CSS2.x поняли, что поторопились, и стали вводить понятие "логического пикселя" в зависимости от угла зрения. Пиксель определили как 1/96 дюйма при рассмотрении с расстояния вытянутой руки, а потом вообще плюнули и решили, что как его ни рассматривай, по сути-то он именно 1/96 дюйма и есть, и все браузеры именно так его и отображают и, не мудрствуя лукаво, зафиксировали соотношение 1px = 0.75pt = 1/16pc = 1/96in тем самым пиксель стал полноправной абсолютной единицей, как всегда и воспринимался интуитивно.

При этом физический пиксель может не соответствовать CSSному. На том же четвёртом айфоне физических пикселей 960, а CSS-ных — 480, как у предыдущих айфонов каждый CSSный пиксель картинки рисуется четырьмя физическими.

Так же стоит отметить, что пиксели могут быть дробными, например размер можно задать в 16.5px. Это совершенно нормально, браузер сам использует дробные пиксели для внутренних вычислений. К примеру, есть элемент шириной в 100px, его нужно разделить на три части – волей-неволей появляются 33.333...px. При окончательном отображении дробные пиксели, конечно же, округляются и становятся целыми.

Для мобильных устройств, у которых много пикселей на экране, но сам экран маленький, чтобы обеспечить читаемость, браузер автоматически применяет масштабирование.

Относительные единицы

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

Список относительных единиц измерения длины

%
Проценты
em
Высота шрифта родительского элемента
ex
Высота символа x
ch
Размер символа "0"
В спецификации указаны также единицы ex и ch, которые означают размер символа "x" и размер символа "0".
Эти размеры присутствуют в шрифте всегда, даже если по коду этих символов в шрифте находятся другие значения, а не именно буква "x" и ноль "0". В этом случае они носят более условный характер.
Эти единицы используются чрезвычайно редко, так как «размер шрифта» em обычно вполне подходит.

em

em вычисляется относительно размера шрифта родительского элемента. Если по простому, то 1em – текущий размер шрифта.

Можно брать любые пропорции от текущего шрифта: 2em, 0.5em и т.п.

Один em равен значению свойства font-size заданного шрифта. Всё это очень важно понимать, при таких ситуациях, как, например, вложенность нескольких элементов в друг друга.

.wrapEm {
    font-size: 1.5em;
}
				
<div class="wrapEm">
 Text one
    <div class="wrapEm">
     Text two
        <div class="wrapEm">Text three</div>
    </div>
</div>
				
Text one
Text two
Text three

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

Проценты %

Когда мы говорим «процент», то возникает вопрос – «Процент от чего?»

Значение высчитывается относительно значения свойства родительского тега. Это очень важная особенность процентов, про которую, увы, часто забывают.

.wrapProcent {
    font-size: 90%;
}
				
<div class="wrapProcent">
 Text one
    <div class="wrapProcent">
     Text two
        <div class="wrapProcent">Text three</div>
    </div>
</div>
				
Text one
Text two
Text three

По сути, ничего сложного. Следует помнить, что у процентов есть ряд особенностей. Например, в отличии от em, размеры отступов, ширины и т.д, у процентов высчитывается относительно ширины родительского элемента, а не относительно его шрифта. В связи с чем не получится указать размер шрифта и отступов в одних и тех же единицах.

    font-size: .5em;
    margin: .5em;
	  vs.
    font-size: 50%;
    margin: 50%;
				

Т.е, если, например, в последнем примере нам хочется, чтобы отступ был равен межстрочному интервалу, то из процентной величины шрифта напрямую его не взять. Всё равно придётся прибегать к (r)em-ам или абсолютным единицам.

Ещё один из важных моментах в жизни процента, это пример, когда задав вертикальные отступы у элемента в %, многие начинающие верстальщики (да, и не только), полагают, что высчитываться они будут относительно высоты родительского элемента. Но, на самом деле это не так. На этом примере видно, что при изменении высоты, отступы у параграфа остаются неизменными, что нельзя сказать про результат во время смены ширины контейнера. В этом случае вертикальные отступы начинают пропорционально изменяться, относительно ширины своего родительского элемента. Т.е, выходит, что вертикальные отступы реагируют на width предка, а не на его height. Это может показаться странным, но на самом деле всё вполне логично. Составляя эту часть спецификации, W3C исходили из того, что, если, например, верхнее или нижние отступы задать как процент от высоты родителя, это может привести к бесконечному циклу. Ведь в таком случае высота родителя постоянно бы увеличивалась, чтобы вместить вертикальные отступы, которые затем снова должны были бы увеличиться относительно новой высоты и т.д. Этот момент очень важен и о нём нужно помнить.

Но, самое, пожалуй, известное и полезное использование процентов, это ситуация, когда мы можем назначить корневому элементу body разумный размер шрифта, а затем использовать проценты для шрифта всех остальных элементов на сайте. Это позволяет изменять размер шрифта всего сайта в одном месте, т.е. у body. Пожалуй, это очень удобно.

margin-left
При установке свойства margin-left в %, процент берётся от ширины родительского блока, а вовсе не от его margin-left.

line-height
При установке свойства line-height в %, процент берётся от текущего размера шрифта, а вовсе не от line-height родителя.

width/height
Для width/height обычно процент от ширины/высоты родителя, но при position:fixed, процент берётся от ширины/высоты окна (а не родителя и не документа).

rem

rem — новыя единица измерения, введённая спецификацией. Она означает примерно "Корневой em" (root em).

Если em — это единица, которая пляшет относительно шрифта родительского элемента, то rem — это единица измерения, которая пляшет относительно корневого элемента, т.е, как вы уже догадались — html. Это означает, что мы можем определить единый размер шрифта в <html>, и отталкиваться уже от него, причём при любой вложенности.

.wrapRem {
    font-size: 1.5rem;
}
				
<div class="wrapRem">
 Text one
    <div class="wrapRem">
     Text two
        <div class="wrapRem">Text three</div>
    </div>
</div>
				
Text one
Text two
Text three

getComputedStyle(document.documentElement).fontSize

vw, vh, vmin и vmax

Во всех современных браузерах, поддерживаются новые единицы из черновика стандарта CSS Values and Units 3:

  • vw – 1% ширины окна
  • vh – 1% высоты окна
  • vmin – наименьшее из (vw, vh)
  • vmax – наибольшее из (vw, vh)

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

Их основное преимущество – в том, что любые размеры, которые в них заданы, автоматически масштабируются при изменении размеров окна.

Этот текст написан с размером `5vh`.

Вы сможете легко увидеть, как работает vh, если поменяете размер окна браузера. Текст выше будет расти/уменьшаться.