ToolHub
View All Posts

Руководство по конвертации единиц CSS: px, rem, em, vw, vh подробно

Выбор правильных единиц CSS — одно из самых влиятельных решений при написании таблиц стилей. Выбранные вами единицы определяют, как элементы масштабируются на разных размерах экрана, как они реагируют на пользовательские предпочтения (например, настройки размера шрифта браузера) и насколько предсказуемо ведёт себя макет. Однако многие разработчики по привычке используют пиксели, упуская гибкость и преимущества доступности, которые предоставляют относительные единицы. Это руководство охватывает все основные единицы CSS, объясняет, когда использовать каждую, показывает, как конвертировать между ними, и предоставляет практические лучшие практики для современного адаптивного дизайна.

Понимание классификации единиц CSS

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

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

Абсолютные единицы — это меры фиксированного размера. Наиболее часто используемая абсолютная единица в веб-разработке — пиксель (px). Другие абсолютные единицы включают пункты (pt), сантиметры (cm), миллиметры (mm) и дюймы (in). Эти единицы в основном используются для таблиц стилей печати или когда вам нужна мера, не зависящая от контекста. В экранном CSS px — единственная абсолютная единица, которую вы будете регулярно использовать.

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

Относительные единицы вычисляют своё конечное значение на основе эталонного значения. em относится к размеру шрифта текущего элемента, rem относится к размеру шрифта корневого элемента, vw и vh относятся к размерам viewport, а проценты относятся к родительскому элементу. Относительные единицы являются краеугольным камнем адаптивного и доступного дизайна, поскольку они позволяют вашему макету автоматически адаптироваться к различным контекстам.

Пиксели (px): базовая единица

Пиксель — наиболее интуитивная единица CSS, поскольку она напрямую отображается на экранные пиксели (с некоторыми оговорками относительно соотношения пикселей устройства). Значения px всегда одинаковы независимо от контекста, что делает их предсказуемыми и лёгкими для понимания. Однако эта предсказуемость имеет свою цену: размеры на основе пикселей не масштабируются, когда пользователи изменяют размер шрифта браузера по умолчанию, что создаёт проблемы доступности.

Когда использовать px

Когда избегать px

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

rem: размер относительно корня

). В большинстве браузеров размер шрифта корня по умолчанию составляет 16px, поэтому 1rem = 16px, 0.5rem = 8px, 2rem = 32px. Ключевое преимущество rem в том, что он масштабируется при изменении пользователем размера шрифта браузера по умолчанию, что делает его лучшим выбором для доступности.

Конвертация px в rem

Формула конвертации проста: разделите значение в пикселях на размер шрифта корня.

rem = px / root-font-size

// With default root font size of 16px:
12px = 12 / 16 = 0.75rem
16px = 16 / 16 = 1rem
24px = 24 / 16 = 1.5rem
32px = 32 / 16 = 2rem
48px = 48 / 16 = 3rem

Трюк с 62.5%

Многие разработчики находят математику деления на 16 утомительной. Популярный трюк — установить размер шрифта корня на 62.5%, что делает 1rem равным 10px. Это упрощает вычисления в уме: 14px становится 1.4rem, 24px становится 2.4rem и так далее.

html {
    font-size: 62.5%; /* 1rem = 10px */
}

body {
    font-size: 1.6rem; /* 16px */
}

h1 {
    font-size: 3.2rem; /* 32px */
    margin-bottom: 1.6rem; /* 16px */
}
Примечание о доступности: трюк с 62.5% работает, потому что он всё ещё уважает предпочтения пользователя по размеру шрифта. Установка font-size: 62.5% на корневом элементе составляет 62.5% от значения, выбранного пользователем по умолчанию, поэтому если пользователь установит браузер на 20px, корень станет 12.5px, и все значения rem масштабируются пропорционально. Никогда не устанавливайте корневой размер шрифта в фиксированное значение px, так как это переопределяет пользовательские предпочтения.

em: размер относительно контекста

Единица em относится к размеру шрифта текущего элемента (или, для свойств, отличных от font-size, к его родительскому элементу). Это означает, что 1em равен текущему размеру шрифта, и значения em компаундируются при вложении элементов. Это поведение компаундирования может быть как мощным, так и запутанным.

Проблема компаундирования

/* Parent: font-size 16px */
.parent {
    font-size: 1em; /* 16px */
}

/* Child: 1.2em of parent's 16px = 19.2px */
.child {
    font-size: 1.2em;
}

/* Grandchild: 1.2em of child's 19.2px = 23.04px */
.grandchild {
    font-size: 1.2em;
}

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

Когда использовать em

Единицы viewport: vw, vh, vmin, vmax

Единицы viewport относятся к размерам окна браузера. 1vw равен 1% ширины viewport, 1vh равен 1% высоты viewport. vmin — меньшее из vw и vh, vmax — большее. Эти единицы необходимы для создания макетов, реагирующих на доступное пространство экрана.

Распространённые случаи использования единиц viewport

Случай использованияЕдиницаПример
Полноэкранная hero-секцияvhheight: 100vh
Плавная типографикаvw + clampfont-size: clamp(1rem, 2.5vw, 2rem)
Макет бок о бокvwwidth: 50vw
Квадратный элементvminwidth: 20vmin; height: 20vmin
Наложение на весь viewportvw + vhwidth: 100vw; height: 100vh

Проблема vh на мобильных устройствах

В мобильных браузерах 100vh не всегда равен видимой высоте viewport. Адресная строка браузера и элементы управления навигацией занимают пространство, но 100vh включает область за этими элементами. Это приводит к обрезанию контента в нижней части полноэкранных секций. Современный CSS предоставляет dvh (динамическая высота viewport) как решение, учитывающее динамические панели инструментов. В качестве альтернативы используйте JavaScript для установки CSS-пользовательского свойства на основе window.innerHeight.

/* Modern approach */
.hero {
    height: 100dvh; /* Dynamic viewport height */
}

/* Fallback for older browsers */
.hero {
    height: 100vh;
    height: 100dvh;
}

Новые единицы viewport: svh, lvh, dvh

CSS ввёл три новые единицы высоты viewport для решения проблем мобильного viewport:

Те же варианты small/large/dynamic существуют для ширины (svw, lvw, dvw) и единиц min/max (svmin, lvmin, dvmin и т.д.). Используйте dvh для полноэкранных макетов на мобильных устройствах, svh, когда нужно гарантировать, что контент виден без прокрутки, и lvh, когда хотите заполнить максимально возможное пространство.

Использование clamp() для плавной типографики

Функция CSS clamp() меняет правила игры для адаптивной типографики. Она принимает три значения: минимальное, предпочтительное и максимальное. Браузер выбирает предпочтительное значение, но ограничивает его между минимальным и максимальным.

/* Font size scales from 1rem to 2.5rem based on viewport */
h1 {
    font-size: clamp(1rem, 2.5vw + 0.5rem, 2.5rem);
}

/* Padding scales proportionally */
.container {
    padding: clamp(1rem, 3vw, 3rem);
}

Этот подход даёт вам преимущества масштабирования на основе viewport без риска, что текст станет слишком маленьким на мобильных устройствах или слишком большим на десктопе. Он устраняет необходимость в контрольных точках медиа-запросов для размера шрифта, значительно снижая сложность CSS.

Справочная таблица конвертации

Используйте эту таблицу как быстрый справочник для распространённых конвертаций. Все значения предполагают размер шрифта корня 16px и viewport 1920x1080.

pxremem (при 16px)vw (1920px)% (от 16px)
8px0.5rem0.5em0.417vw50%
12px0.75rem0.75em0.625vw75%
16px1rem1em0.833vw100%
20px1.25rem1.25em1.042vw125%
24px1.5rem1.5em1.25vw150%
32px2rem2em1.667vw200%
48px3rem3em2.5vw300%
64px4rem4em3.333vw400%

Лучшие практики единиц CSS

Нужна быстрая конвертация между единицами CSS? Попробуйте наш бесплатный онлайн-конвертер единиц CSS. Мгновенно конвертируйте между px и rem, em и px, единицами viewport и другими.

Конвертер единиц CSS

Часто задаваемые вопросы

Следует ли использовать px или rem для размера шрифта?

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

В чём разница между em и rem?

em относится к размеру шрифта родительского элемента, в то время как rem относится к размеру шрифта корня (обычно 16px). em компаундируется при вложении, что может привести к неожиданным изменениям размера. rem всегда ссылается на одну и ту же основу, что делает его более предсказуемым. Используйте rem для глобальных размеров, em для масштабирования на уровне компонентов, где вы хотите, чтобы вложенные элементы масштабировались пропорционально.

Как конвертировать px в rem?

Разделите значение в пикселях на размер шрифта корня (обычно 16px). Например, 24px / 16 = 1.5rem. Формула: rem = px / root-font-size. Если размер шрифта корня 16px, то 1rem = 16px, 0.5rem = 8px, 2rem = 32px. Вы можете использовать онлайн-конвертер единиц CSS для быстрой конвертации.

Когда следует использовать единицы viewport (vw, vh)?

Используйте единицы viewport, когда хотите размер относительно окна браузера. Распространённые случаи использования включают полноэкранные hero-секции (100vh), типографику, масштабирующуюся с шириной viewport (clamp с vw), и макеты, которые должны заполнять доступное пространство. Избегайте использования vw отдельно для основного текста, так как он может стать слишком маленьким на мобильных устройствах или слишком большим на широких экранах.

Какая лучшая единица CSS для адаптивного дизайна?

Нет единственной лучшей единицы. Комбинация работает лучше всего: rem для размеров шрифта и отступов, проценты для ширины внутри контейнеров, единицы viewport для полноэкранных элементов и CSS clamp() для плавной типографики, масштабирующейся между минимальным и максимальным размерами. Ключ в понимании того, на что ссылается каждая единица, и выборе соответствующей.

ToolHub's collection of 300+ free online tools including CSS unit converters, formatters, and more — no sign-up required.