Unit Forge — конвертер единиц измерения для CSS

03.06.2026
Unit Forge — конвертер единиц измерения для CSS

Когда вёрстка переходит на относительные единицы, в рабочем процессе появляется одно постоянное рутинное действие: взять пиксельное значение из макета и перевести его в rem, em или vw. Одно значение — секунда с калькулятором. Десять значений — уже раздражение. Целый CSS-файл из чужого проекта — потеря часа.

Но дело не только в арифметике. Перед конвертацией нужно знать контекст: какой корневой шрифт у проекта, какой родительский, какой вьюпорт. При работе с calc() нужно думать: какие единицы внутри выражения конвертировать, а какие намеренны — 100% это не то же самое, что 100px. При работе с SCSS-файлом нужно не сломать медиазапросы и не тронуть border: 1px solid, который в пикселях стоит специально.

Unit Forge — это модуль на toolz.macrulez.ru, который убирает из этого процесса всё ручное: от одиночного перевода с форматированием до пакетной обработки файлов. Всё работает в браузере без отправки данных на сервер.


Контекст: основа для всех вычислений

Прежде чем что-то конвертировать, инструмент должен знать контекст. Он задаётся в боковой панели и влияет на все блоки сразу.

Корневой шрифт (Root font size)

Это основа для rem. По умолчанию браузеры используют 16px, и большинство проектов этого не меняют. Но есть исключения.

Пример: если root font size = 16px, то 24px → 1.5rem. Если root = 10px — распространённый трюк для упрощения расчётов, — то те же 24px → 2.4rem. Если root = 20px24px → 1.2rem.

Смена значения в поле пересчитывает все конвертеры и таблицу справочных значений мгновенно.

Родительский шрифт (Parent font size)

Нужен для единиц em и %. В отличие от rem, который всегда относится к корню документа, em зависит от того, где именно находится элемент: какой font-size у его родителя.

Если вёрстка предполагает, что элемент находится внутри контейнера с font-size: 14px — нужно задать это значение. Тогда 20px → 1.4286em (20 / 14), а не 1.25em (20 / 16).

Вьюпорт (Viewport width / height)

Основа для vw, vh, vmin, vmax. Влияет только на эти единицы.

При вьюпорте 1920×1080: 48px → 2.5vw (48 / 1920 × 100). При вьюпорте 375×812 (iPhone): те же 48px → 12.8vw. Разница существенная — поэтому смена пресета под мобильный вьюпорт может радикально изменить результаты при конвертации в vw.

Знаки после запятой

Контролирует точность всех чисел в результатах. При значении 4 получается 1.5625rem, при значении 2 — 1.56rem. Полезно менять: для быстрой оценки достаточно 2 знаков, для production-кода — 4.

Пресеты

Три кнопки быстро переключают комбинацию настроек под популярные фреймворки:

Пресет Root Parent Вьюпорт
Tailwind 16px 16px 1280 × 800
Bootstrap 16px 16px 1200 × 768
Mobile 16px 14px 375 × 812

Мобильный пресет устанавливает parentFontSize = 14px — типичный базовый размер текста на мобильных устройствах. Это меняет результаты при конвертации в em и %.


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

Самый базовый блок. Слева — поле ввода и выбор исходной единицы, справа — результат и целевая единица.

Поддерживаются все CSS-единицы без исключения:

Группа Единицы
Длины (абсолютные) px, pt, pc, in, cm, mm
Длины (относительные) rem, em, %, ch, ex, lh, rlh
Вьюпортные vw, vh, vmin, vmax
Углы deg, rad, grad, turn
Время ms, s
Разрешение dppx, dpi, dpcm

Угловые единицы (deg → rad) и временны́е (ms → s) конвертируются по прямой математике без привязки к контексту. Разрешение нужно реже всего, но иногда — при работе с печатными стилями или @media (min-resolution: ...) — бывает нужно пересчитать dpi в dppx.

Умный ввод

Поле ввода понимает значения вместе с единицей. Если написать 24px — конвертер разберёт число и единицу, переключит селектор «из» на px и подставит 24. Это особенно удобно при копировании значений из DevTools или из Figma, где числа всегда идут с единицами.

Горячие клавиши

Ctrl+Shift+S — поменять единицы «из» и «в» местами. Полезно при обратной проверке: получили 1.5rem, хотим убедиться что это действительно 24px.

Alt+↑ / Alt+↓ — перебирать единицы «из» по полному списку без клика на селектор. Удобно при сравнении: как выглядит одно и то же значение в разных единицах.

Формат копирования

Под строкой результата — переключатель между тремя режимами копирования:

Значение — копируется просто 1.5rem. Подходит для вставки в уже написанное правило.

CSS-переменная — копируется --имя: 1.5rem;. Имя переменной редактируется прямо здесь: меняешь --value на --font-size-body — и в буфер уходит готовое объявление переменной.

CSS-свойство — копируется font-size: 1.5rem;. Свойство выбирается из выпадающего списка с полным набором CSS-свойств: margin, padding, width, height, gap, border-radius и другие. Выбрал padding, получил padding: 1.5rem; — и сразу вставляешь в стили.

Это экономит один шаг: не нужно писать имя свойства руками после вставки.


Таблица справочных значений

Рядом с основным конвертером — таблица из 28 популярных пиксельных значений с их эквивалентами в выбранной целевой единице. Набор выбран так, чтобы покрыть стандартную сетку отступов и размеров: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 32, 36, 40, 44, 48, 56, 64, 72, 80, 96.

Таблица реагирует на все настройки контекста и на выбранную целевую единицу. Переключил «конвертировать в» с rem на vw — все 28 строк пересчитались под текущий вьюпорт. Поменял root font size — таблица для rem обновилась. Это работает как живой шпаргалка: можно быстро проверить, в какой rem-шаг попадает то или иное пиксельное значение в рамках конкретного проекта.

Клик по любой строке делает сразу три вещи: копирует результат в буфер, устанавливает это значение в основном конвертере и показывает всплывающее подтверждение. Удобно при последовательной работе с несколькими значениями — выбираешь из таблицы, результат уже в буфере.


Массовая конвертация

Когда значений много, вводить их по одному нет смысла. Блок массовой конвертации принимает произвольный текст в левое поле и разбирает все встреченные значения.

Режим значений (по умолчанию)

Инструмент находит в тексте все пары «число + единица» и конвертирует каждую. Формат ввода — произвольный:

Copy
Несколько значений в строку:      10px 16px 24px
Через запятую или точку с запятой: 16px; 1.5rem; 100%
Перемешанный текст:                padding: 24px, margin: 16px

Одинаковые значения дедуплицируются — если 16px встречается пять раз, в результате оно будет один раз. Это удобно при вставке куска кода: не нужно заранее чистить дубликаты.

Справа — результат в виде таблицы: исходное значение → конвертированное. Кнопка «Копировать всё» собирает все результаты через переносы строк.

Режим CSS-объявлений

Переключатель «Режим CSS-объявлений» меняет поведение: теперь блок обрабатывает полные CSS-правила, а не просто значения.

Вход:

css Copy
font-size: 16px;
margin-top: 24px;
padding: 8px 16px;

Выход при конвертации в rem:

css Copy
font-size: 1rem;
margin-top: 1.5rem;
padding: 0.5rem 1rem;

Правило с несколькими значениями (как padding: 8px 16px) обрабатывается целиком: каждый токен конвертируется отдельно, результат собирается обратно. Объявления, которые не удалось распознать, помечаются в результате отдельно — их легко найти и исправить вручную.


Генератор clamp()

Fluid-типографика и «жидкие» отступы требуют clamp(). Блок реализует два подхода к его генерации.

Простой режим

Три значения через запятую — минимум, идеальное и максимум. Значения могут быть в любых единицах, не обязательно одинаковых:

Copy
Ввод:  16px, 5vw, 24px

Инструмент конвертирует крайние значения в rem (опираясь на root font size), среднее — оставляет в vw, и собирает итоговое правило:

css Copy
clamp(1rem, 5vw, 1.5rem)

Если значения введены в разных единицах — 1rem, 4vw, 2rem или 14px, 3vw, 20px — конвертация применяется к каждому согласно его типу. rem остаётся rem, px переводится, vw не трогается.

Кнопка «Копировать» сохраняет готовое CSS-выражение в буфер.

Fluid-режим

Более точный подход: задаются не три произвольных значения, а четыре параметра с конкретным физическим смыслом.

Параметр Что означает
Мин. размер Размер шрифта/отступа на самом маленьком вьюпорте
Макс. размер Размер на самом большом вьюпорте
Мин. вьюпорт Ширина экрана, при которой значение достигает минимума
Макс. вьюпорт Ширина экрана, при которой значение достигает максимума

Инструмент вычисляет линейную интерполяцию между двумя точками и записывает её через clamp():

Copy
Мин. размер: 16px   Мин. вьюпорт: 320px
Макс. размер: 24px  Макс. вьюпорт: 1280px

Результат: clamp(1rem, 0.8333vw + 0.6667rem, 1.5rem)

Такое значение для font-size гарантирует: на экране 320px — ровно 16px, на 1280px — ровно 24px, между ними — плавное увеличение. Никаких медиазапросов, никакого скачка.

Все четыре поля опираются на текущий root font size из боковой панели. Если проект использует нестандартный корень — достаточно поменять одну настройку, и fluid-формула пересчитается автоматически.


Конвертер calc()

Выражения с calc() — это отдельный случай. Примитивный подход «заменить все числа с единицами» ломает смысл: calc(100% - 20px) превратится в calc(6.25rem - 1.25rem), и это неправильно — 100% здесь означает «весь родительский контейнер», а не 1600 пикселей.

Unit Forge решает эту проблему через явный выбор: какие единицы внутри выражения конвертировать, а какие оставить.

Как работает

При вводе выражения инструмент разбирает его и находит все единицы, которые встречаются внутри. Для каждой отображается чип — переключаемая кнопка:

Copy
Ввод: calc(100% - 20px)
Чипы: [%  □]  [px ✓]

Активные чипы (с галочкой) — конвертируются. Неактивные — остаются в исходном виде.

Умный предвыбор чипов

При обнаружении новых единиц инструмент автоматически решает, нужно ли их конвертировать:

Не конвертируются по умолчанию: %, vw, vh, vmin, vmax. Эти единицы в calc() почти всегда намеренны. 100% — это весь родительский блок. 100vw — весь вьюпорт. Переводить их в rem бессмысленно и сломает логику.

Конвертируются по умолчанию: всё остальное — px, pt, em, cm и т.д. Это, как правило, фиксированные отступы или размеры, которые и нужно перевести в относительные единицы.

Никогда не конвертируется: целевая единица сама в себя. Если конвертируем в rem, и внутри calc() есть rem — этот чип не будет доступен. Конвертировать 2rem → 2rem бессмысленно.

Пользователь может изменить предвыбор — нажать на любой чип и включить или отключить его вручную. Например, если в проекте em внутри calc() тоже нужно конвертировать — просто нажать на чип em, и он включится.

Результат

Copy
Ввод (toUnit: rem, root: 16px):  calc(100vw - 32px)
Чипы: [vw □]  [px ✓]
Вывод: calc(100vw - 2rem)
Copy
Ввод:  calc(2em + 8px)
Чипы:  [em □]  [px ✓]
Вывод: calc(2em + 0.5rem)

Результат всегда обёрнут в calc() и готов вставляться в CSS без правок.


Конвертация CSS/SCSS файла

Самый мощный блок — пакетная обработка CSS-кода. Принимает текст через редактор или загрузку файлов. Результат отображается рядом с подсветкой синтаксиса.

Режимы работы

Ввод вручную. Textarea слева для исходного кода, результат справа. Конвертация происходит в реальном времени при вводе.

Один файл. После перетаскивания или загрузки .css, .scss, .sass, .less — файл открывается в том же двухколоночном виде. В шапке отображается имя файла. Код можно редактировать прямо в браузере: изменения в левом редакторе сразу отражаются в конвертированном результате справа.

Несколько файлов. При загрузке двух и более файлов интерфейс переходит в режим списка. Каждый файл — отдельная строка-аккордеон с именем. Клик по строке разворачивает её и показывает двухколоночный редактор для этого конкретного файла. Кнопка «Скачать файл» у каждого элемента скачивает только его конвертированную версию. Кнопка «Скачать архив ZIP» в шапке собирает все файлы в один архив.

Выбор CSS-свойств для конвертации

Главный контрол блока — список CSS-свойств в боковой панели, сгруппированных по категориям. Только значения у включённых свойств будут изменены; всё остальное в файле останется нетронутым.

Категория Свойства По умолчанию
Шрифты и текст font-size, line-height, letter-spacing, word-spacing, text-indent Включены
Отступы margin/padding (все 5 вариантов каждого) Включены
Размеры width, height, min/max-width/height Включены
Grid / Flex gap, row-gap, column-gap, grid-gap Включены
Границы border, border-width, border-radius Выключены
Тени box-shadow, text-shadow Выключены
Позиционирование top, right, bottom, left Выключены
Анимации transition, transform Выключены

Границы, тени и позиционирование по умолчанию выключены не случайно. border: 1px solid — это, как правило, намеренный пиксель. box-shadow: 0 2px 4px rgba(0,0,0,0.2) — тоже. Их конвертация в rem технически корректна, но редко нужна на практике. Если нужно — включить несложно.

Тоггл у каждой категории поддерживает три состояния:

  • Все включены — тоггл активен (подсвечен).
  • Все выключены — тоггл неактивен.
  • Частично — тоггл в промежуточном состоянии: ползунок посередине, цвет приглушён. Это значит, что в категории одни свойства включены, другие — нет. Клик по такому тогглу включает все свойства категории сразу.

Медиазапросы

Переключатель «Конвертировать внутри media запросов» контролирует, обрабатываются ли значения внутри @media-блоков.

Без этой опции CSS-файл с брейкпоинтами получится наполовину конвертированным: значения снаружи @media — в rem, значения внутри — по-прежнему в px. Включённый переключатель обрабатывает оба уровня:

css Copy
/* До */
.card { font-size: 16px; }
@media (max-width: 768px) {
  .card { font-size: 14px; }
}

/* После (toUnit: rem) */
.card { font-size: 1rem; }
@media (max-width: 768px) {
  .card { font-size: 0.875rem; }
}

Ширина самого брейкпоинта (768px) не трогается — она не является значением свойства из списка конвертации.

Обработка calc() в файле

Внутри CSS-файлов может быть множество calc()-выражений, и к каждому применяется та же умная логика, что и в отдельном блоке конвертера: %, vw, vh внутри calc() не конвертируются по умолчанию.

Но здесь есть дополнительный уровень гибкости: для каждого режима работы (textarea, одиночный файл, каждый файл в мультирежиме) — свой независимый набор чипов, который отображается прямо под редактором.

Сценарий: два файла загружены в мультирежим. В tokens.scss все calc() используют только px — чип px активен. В animations.scss внутри calc() есть ещё и em, который в этом файле нужно тоже конвертировать — включаем чип em только для этого файла, первый файл не меняется. Настройки per-file, независимые.

Чипы для calc() не нужно настраивать вручную с нуля — они появляются автоматически, как только инструмент находит calc()-выражения в тексте, и предвыбор сделан по тем же умным правилам.


Сценарии использования

Сценарий 1: Перевод дизайн-токенов на rem

Дизайнер передал систему типографики и спейсинга в виде SCSS-файла с переменными — всё в px. Нужно перевести в rem для продакшна.

scss Copy
/* Исходник tokens.scss */
$font-size-xs:   12px;
$font-size-sm:   14px;
$font-size-base: 16px;
$font-size-lg:   20px;
$font-size-xl:   24px;

$spacing-1: 4px;
$spacing-2: 8px;
$spacing-3: 16px;
$spacing-4: 24px;
$spacing-5: 32px;
$spacing-6: 48px;

Загружаем файл в Unit Forge. В боковой панели — корневой шрифт 16px, целевая единица rem. В категориях включаем «Шрифты» и «Отступы» (они уже включены по умолчанию). Медиазапросы — включить на всякий случай.

scss Copy
/* Результат */
$font-size-xs:   0.75rem;
$font-size-sm:   0.875rem;
$font-size-base: 1rem;
$font-size-lg:   1.25rem;
$font-size-xl:   1.5rem;

$spacing-1: 0.25rem;
$spacing-2: 0.5rem;
$spacing-3: 1rem;
$spacing-4: 1.5rem;
$spacing-5: 2rem;
$spacing-6: 3rem;

Скачиваем файл — готово. Если нужно пересчитать под другой root (проект использует 10px) — меняем одно поле в боковой панели и скачиваем заново.


Сценарий 2: Fluid-типографика без медиазапросов

Новый проект, нужна типографическая шкала, которая плавно масштабируется от 320px до 1280px без ступенчатых брейкпоинтов.

Открываем блок «Генератор clamp()», переключаемся на Fluid-режим. Для каждого уровня заголовков подбираем граничные значения:

Элемент Мобильный Десктоп
h1 26px 52px
h2 22px 38px
h3 18px 28px
body 15px 18px

Вводим значения, вьюпорт 320→1280. Результат — четыре строки для копирования:

css Copy
--text-h1:   clamp(1.625rem, 2.7083vw + 0.7593rem, 3.25rem);
--text-h2:   clamp(1.375rem, 1.6667vw + 0.8417rem, 2.375rem);
--text-h3:   clamp(1.125rem, 1.0417vw + 0.7917rem, 1.75rem);
--text-body: clamp(0.9375rem, 0.3125vw + 0.8375rem, 1.125rem);

Вставляем в :root, подключаем в компоненты — типографика адаптируется непрерывно на любом разрешении.


Сценарий 3: Миграция легаси-проекта

Унаследованный проект: три SCSS-файла, написаны три года назад, всё в px. Медиазапросы есть. Внутри встречаются calc(100% - 48px) и calc(100vw - 320px). Задача — перевести на rem, не сломав логику.

Перетаскиваем все три файла в Unit Forge. Получаем три аккордеона. Открываем каждый по очереди.

В боковой панели: все категории включены кроме «Границы» (там border: 1px solid намеренный) и «Тени» (там box-shadow тоже намеренный). Медиазапросы — включены.

У первого файла _layout.scss в calc()-выражениях только px — чип px активен, всё ок.

У второго _components.scss в calc() встречается em: calc(1em + 8px) — это межстрочный отступ, который привязан к размеру шрифта компонента. Чип em был автоматически не выбран — правильно, оставляем. Только px конвертируется.

Третий _animations.scss не содержит calc() вообще — блок чипов не появляется.

Сравниваем исходник и результат в каждом аккордеоне, убеждаемся что логика сохранена, скачиваем ZIP. Три файла конвертированы, настройки calc() у каждого были независимые.


Unit Forge доступен на toolz.macrulez.ru вместе с другими модулями: Image Compressor, Tiny SVG, Gradient Fabric, Fav Icona и Stronghold.

Читать далее

30.05.2026

Command-палитра для Vue 3, часть 2: вторичные действия, режимы, превью и ещё дюжина фич

Продолжение поста про мою headless-палитру команд (Cmd/Ctrl + K) для Vue 3. Во втором заходе пакет оброс вторичными действиями в стиле Raycast, префиксными режимами, боковой панелью предпросмотра, мультивыбором, frecency-ранжированием и ещё дюжиной вещей — плюс десяток выловленных по дороге багов.

Метки
Vue 3Command PaletteOpen SourceTypeScriptFrontend
28.05.2026

vue-image-kit — полный toolkit для изображений во Vue 3

Один пакет закрывает всё что нужно для работы с изображениями: ленивая загрузка через IntersectionObserver, пять видов плейсхолдеров (ThumbHash / BlurHash / LQIP / dominant color / shimmer), focal point, WebP/AVIF, srcset с width- и density-дескрипторами, art direction, retry с backoff, CDN-адаптеры для 12 провайдеров, build-time импорты через Vite-плагин, кодирование плейсхолдеров прямо в браузере, CLI для обработки на сборке, Nuxt-модуль. Ноль runtime-зависимостей, tree-shakeable.

Метки
vue3imagesperformancenuxttypescript