GH GambleHub

Адаптивный дизайн и точки перелома

1) Принципы

1. Контент-first: макеты строятся от задач и содержания, а не от «популярных» ширин.
2. Mobile-first: начинаем со строгого простого варианта и усложняем по мере роста ширины/возможностей ввода.
3. Progressive enhancement: базовый UX работает без JS/анимаций; улучшения подключаются по условиям.
4. Consistency: одинаковые паттерны — одинаковое поведение на всех брейкпоинтах.
5. Performance-aware: изображения, сетки и скрипты адаптируются по весу и сложности.


2) Точки перелома (брейкпоинты)

Выбираем по данным реальных устройств и по смене паттерна (колонок/навигации/типографики).

Рекомендованный набор (ориентир)

AliasВьюпорт, pxКолонкиКонтейнер (max-width)Gutter
XS320–5994fluid16
SM600–8396560–58416
MD840–11998760–80820
LG1200–1439121104–115224
XL≥1440121280–132024–32
Правила:
  • Брейкпоинт вводим только при смене структуры (напр., 1→2 колонки карточек, появление сайдбара).
  • Допустимы локальные брейки внутри компонента (контейнерные запросы).

3) Контейнерные запросы vs медиазапросы

Когда медиазапросы `@media`: меняется layout всей страницы (навигация, шаблон).
Когда контейнерные `@container`: карточка/виджет должен подстраиваться по своей доступной ширине (компонент независим от страницы).

css
/ Включаем контейнерную оценку для блока /
.widget { container-type: inline-size; }

/ Внутри — адаптируем карточку по ширине контейнера /
@container (min-width: 520px) {
.card { grid-template-columns: 1fr 1fr; }
}

Используйте связку: медиа для фрейма страницы + контейнеры для компонентов.


4) Типографика: fluid + шаги

Сочетайте `clamp()` и шаги по брейкпоинтам.

css
:root {
/ Базовая fluid-гарнитура /
--fs-body: clamp(15px, 1.2vw + 0.2rem, 18px);
--fs-h2:  clamp(20px, 1.6vw + 0.4rem, 24px);
}
body { font-size: var(--fs-body); line-height: 1.55; }
h2  { font-size: var(--fs-h2);  line-height: 1.3; }
@media (min-width: 1200px) {
h2 { letter-spacing:.005em; } / тонкая настройка на LG+ /
}
Правила:
  • Длина строки 45–80 знаков (на сайдбарах 36–60).
  • Шаги величин кратны 4/8-pt; line-height стабильный по брейкпоинтам.

5) Сетки и модули

На уровне секций — CSS Grid (колонки, области); внутри — Flex.
Высоты компонентов кратны baseline (напр., 40/48/56 px).
Имеем 2 пресета плотности: Comfort (чтение/дашборды) и Compact (таблицы/про).

css
.container {
display: grid; gap: 24px;
grid-template-columns: repeat(12, minmax(0,1fr));
max-width: 1280px; margin: 0 auto; padding: 0 16px;
}
@media (max-width: 1199px) {.container { grid-template-columns: repeat(8,1fr); gap: 20px; }}
@media (max-width: 839px) {.container { grid-template-columns: repeat(6,1fr); gap: 16px; }}
@media (max-width: 599px) {.container { grid-template-columns: repeat(4,1fr); }}

6) Изображения и медиа

Используйте `srcset`/`sizes` и автоматический выбор плотности:
html
<img src="card-640.jpg"
srcset="card-640.jpg 640w, card-960.jpg 960w, card-1280.jpg 1280w"
sizes="(min-width:1200px) 33vw, (min-width:840px) 50vw, 100vw"
alt="Описание">
Фиксируйте пропорции, чтобы избежать CLS:
css
.media { aspect-ratio: 16/9; object-fit: cover; }

Для фонов — `image-set()` и lazy-loading.
Текст на изображении — только на плашке/оверлее; контраст ≥ AA.


7) Навигация и responsive-паттерны

XS/SM: bottom-nav или hamburger, заметный CTA; скрытый поиск раскрывается поверх.
MD: появляется persistent-sidebar/mega-menu.
LG/XL: два уровня навигации, быстрые фильтры, хлебные крошки.

Поведение: элементы не «переезжают» хаотично — всегда одна из заранее описанных схем.


8) Ввод: hover/touch/keyboard

Определяем доступные возможности устройства:
css
@media (hover: hover) and (pointer: fine) { / hover-эффекты / }
@media (hover: none), (pointer: coarse)  { / touch-паттерны / }
:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
Правила:
  • Никакого критичного контента «только в hover».
  • Зоны клика: ≥ 44×44 (моб.), ≥ 32×32 (десктоп).
  • Клавиатура поддерживается на всех брейкпоинтах.

9) Безопасные зоны и системные вырезы

На мобильных учитываем safe-area:
css
.page {
padding-left: max(16px, env(safe-area-inset-left));
padding-right: max(16px, env(safe-area-inset-right));
padding-bottom:max(16px, env(safe-area-inset-bottom));
}

10) Темная/светлая темы и контраст

Темы независимы от брейкпоинтов: цели контраста одинаковые везде.
На XS избегаем «кислотных» акцентов; повышаем светлоту ссылок на темном фоне.
Поддержка `prefers-color-scheme` и ручного переключателя.


11) Производительность

Критичные CSS — inline или через `media="print"`/preload стратегию; JS загружаем отложенно.
Избегайте layout-тяжелых анимаций на длинных списках; анимируйте `opacity/transform`.
Ленивая загрузка картинок/виджетов; skeleton вместо спиннеров.
Ограничивайте «тяжелые» тени/фильтры на десятках карточек.


12) Токены дизайн-системы (пример)

json
{
"breakpoints": { "xs": 360, "sm": 600, "md": 840, "lg": 1200, "xl": 1440 },
"container":  { "sm": 584, "md": 808, "lg": 1152, "xl": 1320 },
"columns":   { "xs": 4, "sm": 6, "md": 8, "lg": 12 },
"gutter":   { "sm": 16, "md": 20, "lg": 24, "xl": 32 },
"space":    { "xs": 4, "sm": 8, "md": 12, "lg": 16, "xl": 24, "2xl": 32 }
}
CSS-слой:
css
:root {
--bp-sm: 600px; --bp-md: 840px; --bp-lg: 1200px; --bp-xl: 1440px;
--container-lg: 1152px;
}
@media (min-width: var(--bp-lg)) {
.container { max-width: var(--container-lg); }
}

13) Практикум компонентов (контейнерные брейки)

Карточка товара/турнира:
css
.card { display: grid; gap: 12px; container-type: inline-size; }
.card__media { aspect-ratio: 4/3; }
@container (min-width: 420px) {
.card { grid-template-columns: 1fr 1.2fr; align-items: center; }
.card__media { aspect-ratio: 16/9; }
}
Таблица коэффициентов:
  • XS: stacked-вид (лейбл слева, значение справа, блоками).
  • SM+: горизонтальный скролл только при избытке столбцов, фиксируем шапку/первую колонку.
  • Числа — tabular-nums, выравнивание по десятичной.

14) Локализация и RTL

`dir="rtl"` + `:dir(rtl)` для зеркалирования иконок/стрелок/margin-ов.
Переводы могут увеличивать длину строк на 20–30% — закладывайте запас.
Для некоторых писемностей (например, грузинский/тайский) увеличивайте базовый кегль на 1 px.


15) Специфика iGaming

Карточки турниров/бонусов: сетка 3×N (LG), 2×N (MD), 1×N (SM/XS); CTA и условия — в постоянной зоне.
Лидеры/рейтинги: sticky-шапка/первая колонка; на XS — stacked-режим; числа моноширинные.
Платежные формы: на XS — одноколоночные; на MD — 2 колонки (поле + пояснение).
Ответственные уведомления (18+, лимиты, риски): всегда видимы на всех брейкпоинтах, контраст AAA, без «спрятано в hover».


16) Анти-паттерны

Фиксированные ширины блоков вместо сетки/колонок.
«Точка перелома на каждый пиксель»: слишком много медиазапросов → хаос.
Сломанный ритм: разные gutter/поля в соседних секциях без причины.
Критичный текст на изображении без плашки.
Контент, доступный только при hover (на тач недостижим).
Анимации layout-свойств на длинных списках.


17) QA-чек-лист

Сетка и контейнеры

  • Колонки и gutter соответствуют брейкпоинтам; контейнеры центрированы.
  • Компоненты корректно «перетекают» 1→2→3 колонки без ломки.

Типографика

  • Длина строки 45–80; fluid-кегли через `clamp()`.
  • Контраст текста соответствует WCAG в обеих темах.

Изображения

  • Есть `srcset/sizes`, `aspect-ratio` и lazy-loading; нет CLS.

Ввод и A11y

  • Навигация клавиатурой; `:focus-visible` виден.
  • Альтернатива hover на тач; зоны клика ≥ 44×44.
  • `prefers-reduced-motion` поддержан.

Производительность

  • Анимируются только `transform/opacity`; тяжелые эффекты ограничены.
  • Критичные CSS/JS загружаются эффективно.

18) Документация в дизайн-системе

«Responsive & Breakpoints»: таблица брейкпоинтов, контейнеров, колонок и gutter.
«Container Queries»: примеры адаптивных компонентов.
«Fluid Type»: формулы `clamp()` и преднастройки шкал.
«Patтерны навигации»: XS/SM/MD/LG/XL-варианты.
«Do/Don’t» с короткими клипами и значениями CLS/LCP.


Краткое резюме

Адаптивность — это стратегия, а не набор хаотичных медиазапросов. Опирайтесь на контент и аналитику устройств, комбинируйте медиазапросы со зрелой сеткой и контейнерными запросами, применяйте `clamp()` для типографики, контролируйте изображения и производительность, поддерживайте все способы ввода и A11y. Так интерфейс остается предсказуемым, быстрым и одинаково удобным на любом экране.

Contact

Свяжитесь с нами

Обращайтесь по любым вопросам или за поддержкой.Мы всегда готовы помочь!

Начать интеграцию

Email — обязателен. Telegram или WhatsApp — по желанию.

Ваше имя необязательно
Email необязательно
Тема необязательно
Сообщение необязательно
Telegram необязательно
@
Если укажете Telegram — мы ответим и там, в дополнение к Email.
WhatsApp необязательно
Формат: +код страны и номер (например, +380XXXXXXXXX).

Нажимая кнопку, вы соглашаетесь на обработку данных.