Шкалы и базовая единица
Все размеры Framework берутся из шкал, а не задаются произвольными числами. Здесь — базовая единица, шкала примитивов и соразмерные ступени.
Величины берутся из шкал
Шкалы — это общие ряды допустимых величин. Они дают интерфейсу ритм и позволяют менять размеры централизованно, одной переменной.
Зачем шкалы
Интерфейс читается спокойно, если в нём мало разных величин и между ними есть порядок. Шкалы дают три вещи:
- Ритм. Отступы, высоты и кегли стоят на одной сетке и не спорят друг с другом.
- Централизованное изменение. Проект меняет одну переменную, а не сотни чисел в CSS.
- Адаптивность без лишних правил. Значение роли само меняется между мобильным и настольным режимом; компоненту не нужно своё правило для ширины экрана (см. Адаптивные размеры).
Три уровня величин
| Уровень | Что это | Примеры | Когда выбирать |
|---|---|---|---|
| Примитивы | Неизменные ступени базовой шкалы в rem |
--sf-b6, --sf-c2, --sf-px |
Нужен точный системный размер или основа для своего токена |
| Адаптивные шкалы | Соразмерные ступени, у которых есть мобильное и настольное значение | --sf-space-1, --sf-text--size-3, --sf-radius-2 |
Ритм интерфейса и текста |
| Роли | Величины с назначением | --sf-content--space-block, --sf-heading-2--size, --sf-radius--surface, --sf-ui-1--control-height, --sf-focus--width |
Почти всегда в прикладном коде |
Роль ссылается на ступень шкалы, ступень — на примитив. Если проект перенастраивает шкалу, роли меняются вместе с ней.
Порядок выбора
В CSS проекта величину выбирают в таком порядке:
- готовая утилита или токен-роль нужного назначения;
- ступень адаптивной шкалы;
- примитив
--sf-a0…--sf-i9, если нужен точный размер; - собственный токен проекта, который ссылается на системный.
Правила:
- Нельзя писать голые числа в прикладном CSS.
- Пиксели в справочных таблицах — только эквивалент для понимания, а не рекомендация.
- Исключение — геометрия, которую измеряет браузер: координаты всплывающего окна, положение при перетаскивании, ширина полосы прокрутки. Это не выбор дизайна, а замер, и он остаётся в пикселях.
Виды значений
У каждой величины есть вид значения. Как значения записываются в классе, описано в Значения.
| Вид | Примеры | Откуда |
|---|---|---|
| Размерные | 0, px, a4, c2 |
Шкала примитивов (Базовая единица и шкала примитивов) |
| Соразмерные | 1/4, 1/3, 1/2, 1…12 |
Адаптивные шкалы (Соразмерные ступени) |
| Процентные и доли | 25, 50, full |
Доли ширины и высоты |
| Цветовые | primary, surface-container |
Роли цвета (Цветовые роли) |
| Направления и выравнивание | inline-start, start, center |
Логические стороны (Направление текста) |
Смотрите также
- Базовая единица и шкала примитивов — шкала примитивов.
- Адаптивные размеры — адаптивные размеры.
- Значения — запись значений в классах.
Базовая единица и шкала примитивов
Шкала примитивов — неизменный ряд размеров в rem, на котором стоят все
остальные шкалы. Она даёт точные системные размеры и позволяет переводить
пиксели макета в ступени и обратно.
Почему rem
Все размеры Framework заданы в rem, то есть в долях корневого кегля браузера.
Framework не меняет корневой кегль ни на мобильном экране, ни на
настольном. Если человек увеличил шрифт в настройках браузера, интерфейс
вырастает целиком и пропорционально: текст, кнопки, отступы и углы вместе.
Отсюда следствие: пиксельный эквивалент — не контракт. Все таблицы в этой части
посчитаны при 1rem = 16px. При другом корневом кегле пиксели будут другими,
а шкала останется прежней.
Основной кегль страницы назначается на body (или на внешний контейнер
приложения), а не на html.
Буква и цифра
Примитивы названы буквой и цифрой: a4, b6, d2. Буква выбирает группу
(диапазон и шаг), цифра — номер шага внутри группы. Групп девять, в каждой
десять ступеней.
| Группа | Начало | Шаг | Последняя ступень |
|---|---|---|---|
| A | 0 px | 1 px | a9 = 9 px |
| B | 10 px | 1 px | b9 = 19 px |
| C | 20 px | 2 px | c9 = 38 px |
| D | 40 px | 4 px | d9 = 76 px |
| E | 80 px | 8 px | e9 = 152 px |
| F | 160 px | 16 px | f9 = 304 px |
| G | 320 px | 32 px | g9 = 608 px |
| H | 640 px | 64 px | h9 = 1216 px |
| I | 1280 px | 128 px | i9 = 2432 px |
Начиная с B, каждая следующая буква удваивает и начало, и шаг. Группа A — отдельный случай: это просто пиксели от 0 до 9.
Относительная точность шкалы постоянна: внизу различаются отдельные пиксели, вверху — десятки пикселей. На крупном размере разница в один-два пикселя не видна, и такие ступени не нужны.
Все девяносто примитивов (пиксели — при 1rem = 16px):
| Токен | rem | px | Токен | rem | px | Токен | rem | px |
|---|---|---|---|---|---|---|---|---|
--sf-a0 |
0 | 0 | --sf-b0 |
0.625 | 10 | --sf-c0 |
1.25 | 20 |
--sf-a1 |
0.0625 | 1 | --sf-b1 |
0.6875 | 11 | --sf-c1 |
1.375 | 22 |
--sf-a2 |
0.125 | 2 | --sf-b2 |
0.75 | 12 | --sf-c2 |
1.5 | 24 |
--sf-a3 |
0.1875 | 3 | --sf-b3 |
0.8125 | 13 | --sf-c3 |
1.625 | 26 |
--sf-a4 |
0.25 | 4 | --sf-b4 |
0.875 | 14 | --sf-c4 |
1.75 | 28 |
--sf-a5 |
0.3125 | 5 | --sf-b5 |
0.9375 | 15 | --sf-c5 |
1.875 | 30 |
--sf-a6 |
0.375 | 6 | --sf-b6 |
1 | 16 | --sf-c6 |
2 | 32 |
--sf-a7 |
0.4375 | 7 | --sf-b7 |
1.0625 | 17 | --sf-c7 |
2.125 | 34 |
--sf-a8 |
0.5 | 8 | --sf-b8 |
1.125 | 18 | --sf-c8 |
2.25 | 36 |
--sf-a9 |
0.5625 | 9 | --sf-b9 |
1.1875 | 19 | --sf-c9 |
2.375 | 38 |
| Токен | rem | px | Токен | rem | px | Токен | rem | px |
|---|---|---|---|---|---|---|---|---|
--sf-d0 |
2.5 | 40 | --sf-e0 |
5 | 80 | --sf-f0 |
10 | 160 |
--sf-d1 |
2.75 | 44 | --sf-e1 |
5.5 | 88 | --sf-f1 |
11 | 176 |
--sf-d2 |
3 | 48 | --sf-e2 |
6 | 96 | --sf-f2 |
12 | 192 |
--sf-d3 |
3.25 | 52 | --sf-e3 |
6.5 | 104 | --sf-f3 |
13 | 208 |
--sf-d4 |
3.5 | 56 | --sf-e4 |
7 | 112 | --sf-f4 |
14 | 224 |
--sf-d5 |
3.75 | 60 | --sf-e5 |
7.5 | 120 | --sf-f5 |
15 | 240 |
--sf-d6 |
4 | 64 | --sf-e6 |
8 | 128 | --sf-f6 |
16 | 256 |
--sf-d7 |
4.25 | 68 | --sf-e7 |
8.5 | 136 | --sf-f7 |
17 | 272 |
--sf-d8 |
4.5 | 72 | --sf-e8 |
9 | 144 | --sf-f8 |
18 | 288 |
--sf-d9 |
4.75 | 76 | --sf-e9 |
9.5 | 152 | --sf-f9 |
19 | 304 |
| Токен | rem | px | Токен | rem | px | Токен | rem | px |
|---|---|---|---|---|---|---|---|---|
--sf-g0 |
20 | 320 | --sf-h0 |
40 | 640 | --sf-i0 |
80 | 1280 |
--sf-g1 |
22 | 352 | --sf-h1 |
44 | 704 | --sf-i1 |
88 | 1408 |
--sf-g2 |
24 | 384 | --sf-h2 |
48 | 768 | --sf-i2 |
96 | 1536 |
--sf-g3 |
26 | 416 | --sf-h3 |
52 | 832 | --sf-i3 |
104 | 1664 |
--sf-g4 |
28 | 448 | --sf-h4 |
56 | 896 | --sf-i4 |
112 | 1792 |
--sf-g5 |
30 | 480 | --sf-h5 |
60 | 960 | --sf-i5 |
120 | 1920 |
--sf-g6 |
32 | 512 | --sf-h6 |
64 | 1024 | --sf-i6 |
128 | 2048 |
--sf-g7 |
34 | 544 | --sf-h7 |
68 | 1088 | --sf-i7 |
136 | 2176 |
--sf-g8 |
36 | 576 | --sf-h8 |
72 | 1152 | --sf-i8 |
144 | 2304 |
--sf-g9 |
38 | 608 | --sf-h9 |
76 | 1216 | --sf-i9 |
152 | 2432 |
Пример показывает примитивы в собственном CSS проекта:
.project-card {
inline-size: var(--sf-f0); /* 160 px */
padding: var(--sf-c2); /* 24 px */
gap: var(--sf-b2); /* 12 px */
}
Примитив не заменяет роль. Если значение выражает устойчивую роль интерфейса, заведите переменную проекта с понятным именем и сошлитесь в ней на примитив.
Перевод в пиксели и обратно
Из ступени в пиксели:
пиксели = начало группы + шаг × цифра
c8 = 20 + 2 × 8 = 36 px
d6 = 40 + 4 × 6 = 64 px
f2 = 160 + 16 × 2 = 192 px
Из пикселей в ступень:
- Найдите группу: наибольшее начало, которое не больше числа.
- Вычтите начало.
- Разделите остаток на шаг группы — получится цифра.
48 px → группа D (40): 48 − 40 = 8, 8 ÷ 4 = 2 → d2
16 px → группа B (10): 16 − 10 = 6, 6 ÷ 1 = 6 → b6
Если деление не даёт целого, точной ступени нет. Тогда берите ближайшую. Шкала — это общий ряд, а не способ записать любое число: исключение стоит дороже, чем разница в два пикселя.
Как считать в уме. Достаточно помнить ряд удвоений: начала групп 10, 20, 40, 80, 160, 320, 640, 1280, шаги 1, 2, 4, 8, 16, 32, 64, 128. Буква задаёт обе величины сразу.
Особые значения
--sf-0— ноль.--sf-auto—auto.--sf-px— ровно один CSS-пиксель. Это не начало второй шкалы, а именованная толщина для волосяных линий: границ, разделителей, обводок, кольца фокуса.--sf-a1здесь не подходит: он задан вremи растёт вместе с кеглем, а рамка должна оставаться тонкой.
Кратность четырём
Итоговая высота видимого элемента (кнопки, поля, строки списка, строки
текста) кратна 0.25rem, то есть 4 px при 1rem = 16px. Внутренние части могут
быть некратными, итоговый размер — нет. Все высоты строк и все высоты
контролов во Framework подчиняются этому правилу (см. Одна лестница размеров и Типографика).
Смотрите также
- Соразмерные ступени — соразмерные ступени адаптивных шкал.
- Толщина — толщина границы
--sf-px. - Все переменные — роли и адаптивные ступени, которые стоят на примитивах.
Соразмерные ступени
Соразмерные ступени — единая запись ступеней для всех адаптивных шкал. Она позволяет понять величину по имени без таблицы.
Почти все адаптивные шкалы Framework названы одинаково: 1 — обычная
ступень, дроби меньше её, целые числа больше.
… 1/4 1/3 1/2 [1] 2 3 4 …
меньше обычная больше
1/2 читается как «меньше обычного», 3 — как «заметно больше». Сокращения
вроде sm и lg для размеров не используются, чтобы их не путали с
префиксами ширины экрана (см. Ширина экрана: контрольные точки).
Одна и та же ступень у разных семейств означает одинаковую роль, но не
одинаковые пиксели. --sf-space-1 (12/16 px), --sf-text--size-1 (14/16 px) и
--sf-radius-1 (8 px) — это «обычная» ступень своего семейства. Где шкалы должны
совпадать по смыслу, они явно связаны: высота контрола размера 1 строится из
высоты строки текста 1 (Одна лестница размеров), угол блока ступени 3 — из отступа ступени 3
(Скругления).
Смотрите также
- Адаптивные размеры — мобильные и настольные значения ступеней.
- Одна лестница размеров — лестница размеров компонентов.
- Ширина экрана: контрольные точки — префиксы ширины экрана.