← Назад к вопросам

Как сделать приложение отзывчивым?

2.0 Middle🔥 171 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Создание отзывчивого (responsive) приложения

1. Mobile-First подход

Начинаю с мобильного дизайна, затем добавляю стили для больших экранов:

/* Mobile first - базовые стили для мобилки */
.container {
  padding: 8px;
  font-size: 14px;
}

button {
  padding: 8px 12px;
  width: 100%;
}

/* Планшет и выше */
@media (min-width: 768px) {
  .container {
    padding: 16px;
    font-size: 16px;
  }
  
  button {
    width: auto;
  }
}

/* Десктоп */
@media (min-width: 1024px) {
  .container {
    padding: 24px;
    max-width: 1200px;
    margin: 0 auto;
  }
}

2. Flex и Grid для layout

Использую современные CSS инструменты вместо float:

/* Flex для простых горизонтальных/вертикальных layout'ов */
.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
  gap: 16px;
}

.header__logo {
  flex: 0 0 auto;
}

.header__menu {
  flex: 1 1 auto;
  display: flex;
  gap: 8px;
  flex-direction: column;
}

/* На десктопе - горизонтальное меню */
@media (min-width: 768px) {
  .header__menu {
    flex-direction: row;
  }
}

/* Grid для сложных layout'ов */
.grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
}

@media (min-width: 768px) {
  .grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (min-width: 1024px) {
  .grid {
    grid-template-columns: repeat(3, 1fr);
  }
}

3. Viewport meta tag (обязателен!)

В HTML head добавляю:

<meta name="viewport" content="width=device-width, initial-scale=1.0">

Это критично для правильного масштабирования на мобильных устройствах.

4. Относительные единицы вместо абсолютных

/* Плохо - абсолютные пиксели */
.container {
  width: 1200px;
  padding: 20px;
  font-size: 16px;
}

/* Хорошо - относительные единицы */
.container {
  width: 100%;
  max-width: 1200px;
  padding: 1.25rem;
  font-size: clamp(14px, 2vw, 16px);
}

5. Responsive изображения

<!-- Базовый способ -->
<img src="image.jpg" alt="Description" style="max-width: 100%; height: auto;">

<!-- Продвинутый - разные картинки для разных разрешений -->
<picture>
  <source media="(min-width: 1024px)" srcset="large.jpg">
  <source media="(min-width: 768px)" srcset="medium.jpg">
  <img src="small.jpg" alt="Description">
</picture>

6. Tailwind CSS для responsive дизайна

Tailwind делает responsive стили просто:

<!-- Разные размеры текста -->
<h1 class="text-2xl md:text-3xl lg:text-4xl">Заголовок</h1>

<!-- Скрытие элементов на определенных экранах -->
<nav class="hidden md:flex gap-4">
  <!-- Меню видно только на 768px и выше -->
</nav>

<nav class="md:hidden">
  <!-- Мобильное меню видно только < 768px -->
</nav>

<!-- Responsive grid -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
  <div>Card 1</div>
  <div>Card 2</div>
  <div>Card 3</div>
</div>

<!-- Responsive padding и margin -->
<div class="p-4 md:p-6 lg:p-8 mb-4 md:mb-6">
  Content
</div>

7. Правильная типография для разных экранов

:root {
  /* Мобилка */
  --text-h1: 1.5rem;
  --text-h2: 1.25rem;
  --text-body: 0.875rem;
}

@media (min-width: 768px) {
  :root {
    /* Планшет */
    --text-h1: 2rem;
    --text-h2: 1.5rem;
    --text-body: 1rem;
  }
}

@media (min-width: 1024px) {
  :root {
    /* Десктоп */
    --text-h1: 2.5rem;
    --text-h2: 1.875rem;
    --text-body: 1.125rem;
  }
}

h1 {
  font-size: var(--text-h1);
}

body {
  font-size: var(--text-body);
}

8. Сенсорные элементы и touch targets

На мобилке кнопки должны быть достаточно большими для касания:

/* Minimum 44x44px для сенсорных устройств */
button, a, input {
  min-height: 44px;
  min-width: 44px;
  padding: 12px 16px;
}

@media (min-width: 768px) {
  button, a {
    min-height: auto;
    padding: 8px 12px;
  }
}

/* Избегай hover на мобилке */
@media (hover: hover) {
  button:hover {
    background-color: #e0e0e0;
  }
}

9. Тестирование responsive дизайна

function useMediaQuery(query: string): boolean {
  const [matches, setMatches] = useState(false);

  useEffect(() => {
    const media = window.matchMedia(query);
    setMatches(media.matches);
    
    const listener = () => setMatches(media.matches);
    media.addEventListener('change', listener);
    
    return () => media.removeEventListener('change', listener);
  }, [query]);

  return matches;
}

export function ResponsiveComponent() {
  const isMobile = useMediaQuery('(max-width: 767px)');
  const isTablet = useMediaQuery('(min-width: 768px) and (max-width: 1023px)');
  const isDesktop = useMediaQuery('(min-width: 1024px)');

  if (isMobile) return <MobileLayout />;
  if (isTablet) return <TabletLayout />;
  return <DesktopLayout />;
}

10. Best Practices для responsive дизайна

  • Всегда используй viewport meta tag
  • Начинай с мобильного дизайна (mobile-first)
  • Используй относительные единицы (rem, em, %)
  • Тестируй на реальных устройствах
  • Используй Flexbox и Grid вместо float
  • Делай изображения responsive (picture, srcset)
  • Избегай горизонтального скролла
  • Обеспечь достаточный размер touch targets (44x44px)
  • Используй CSS media queries или Tailwind breakpoints
  • Оптимизируй производительность на медленных сетях

Отзывчивый дизайн — это обязательный стандарт для современных приложений.

Как сделать приложение отзывчивым? | PrepBro