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

Какие знаешь подходы в создании адаптивного сайта?

2.0 Middle🔥 151 комментариев
#HTML и CSS

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

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

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

Какие знаешь подходы в создании адаптивного сайта

Адаптивный дизайн (responsive design) — это создание сайтов, которые хорошо выглядят на устройствах любых размеров (мобильные, планшеты, десктопы). Есть несколько основных подходов.

1. Fluid Layout (Текучий макет)

Принцип: использовать относительные единицы (%, em, rem) вместо абсолютных (px).

/* ❌ Негибкий макет (абсолютные размеры) */
.container {
  width: 1200px;
  margin: 0 auto;
}

.sidebar {
  width: 300px;
}

.content {
  width: 900px;
}

/* ✅ Текучий макет (относительные размеры) */
.container {
  width: 90%; /* Адаптируется к размеру экрана */
  max-width: 1200px;
  margin: 0 auto;
}

.sidebar {
  width: 25%; /* 1/4 контейнера */
}

.content {
  width: 75%; /* 3/4 контейнера */
}

Характеристики:

  • Используются проценты, em, rem
  • Контент масштабируется с размером окна
  • Простая реализация
  • Максимальная ширина контейнера предотвращает слишком широкие макеты

2. Media Queries (Медиа-запросы)

Принцип: применять разные стили для разных размеров экрана.

/* Mobile First подход */
.container {
  width: 100%;
  padding: 10px;
}

.content {
  font-size: 14px;
  column-count: 1;
}

/* Планшет и больше */
@media (min-width: 768px) {
  .container {
    padding: 20px;
  }
  
  .content {
    font-size: 16px;
    column-count: 2;
  }
}

/* Десктоп */
@media (min-width: 1024px) {
  .container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 40px;
  }
  
  .content {
    font-size: 18px;
    column-count: 3;
  }
}

Breakpoints (точки разрыва):

Mobile:   0 - 575px
Tablet:   576px - 991px
Desktop:  992px - 1199px
Widescreen: 1200px+

Характеристики:

  • Разные стили для разных размеров
  • Mobile-first подход (начинаем с мобильных)
  • Легко переопределять стили
  • Самый гибкий подход

3. Flexible Grid (Гибкая сетка)

Принцип: использовать CSS Grid или Flexbox для создания адаптивных макетов.

Flexbox

.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap; /* Переносить элементы на новую строку */
  gap: 20px;
}

.nav {
  display: flex;
  flex-direction: column; /* Мобильные: вертикально */
  gap: 10px;
}

@media (min-width: 768px) {
  .nav {
    flex-direction: row; /* Планшет+: горизонтально */
  }
}

CSS Grid

.grid {
  display: grid;
  grid-template-columns: 1fr; /* Мобильные: один столбец */
  gap: 20px;
}

@media (min-width: 768px) {
  .grid {
    grid-template-columns: 1fr 1fr; /* Планшет: два столбца */
  }
}

@media (min-width: 1024px) {
  .grid {
    grid-template-columns: 1fr 1fr 1fr; /* Десктоп: три столбца */
  }
}

auto-fit и auto-fill:

/* Автоматическая адаптация количества столбцов */
.grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 20px;
  /* На мобильных: 1 столбец (250px < ширина) */
  /* На планшетах: 2-3 столбца */
  /* На десктопе: 4-5 столбцов */
}

4. Mobile-First подход

Принцип: начинаем с дизайна для мобильных, потом расширяем.

/* Сначала мобильные стили (основные) */
.container {
  width: 100%;
  padding: 10px;
  font-size: 14px;
  flex-direction: column;
}

.sidebar {
  display: none; /* Скрыть на мобильных */
}

/* Потом добавляем планшет */
@media (min-width: 768px) {
  .container {
    padding: 20px;
    font-size: 16px;
  }
}

/* Потом десктоп */
@media (min-width: 1024px) {
  .container {
    flex-direction: row;
    max-width: 1200px;
  }
  
  .sidebar {
    display: block; /* Показать на десктопе */
    width: 25%;
  }
}

Преимущества:

  • Базовый контент загружается первым
  • Лучше performance
  • Естественная прогрессивная улучшение

5. Relative Units (Относительные единицы)

/* ✅ Хорошо */
.button {
  padding: 1rem; /* Относительно font-size */
  font-size: 1.2em; /* Относительно parent */
  width: 80%; /* Относительно контейнера */
  margin: 2rem auto;
}

/* ❌ Плохо */
.button {
  padding: 16px; /* Абсолютное значение */
  font-size: 19.2px;
  width: 960px;
  margin: 32px auto;
}

Единицы:

  • % — процент от parent элемента
  • em — относительно font-size parent
  • rem — относительно root font-size
  • vw/vh — процент от viewport

6. Viewport Meta Tag

<!-- ❌ Без этого адаптивность не будет работать -->
<!-- Браузер будет рендерить как десктоп -->

<!-- ✅ Обязательна для мобильных -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">

Параметры:

  • width=device-width — установить ширину = ширине устройства
  • initial-scale=1.0 — начальный масштаб
  • maximum-scale=5.0 — максимальный масштаб
  • user-scalable=yes — разрешить зум

7. Responsive Images (Адаптивные изображения)

srcset

<img
  src="image-small.jpg"
  srcset="
    image-small.jpg 480w,
    image-medium.jpg 768w,
    image-large.jpg 1200w
  "
  sizes="
    (max-width: 480px) 100vw,
    (max-width: 768px) 90vw,
    1200px
  "
  alt="Description"
/>

picture элемент

<picture>
  <source media="(min-width: 1024px)" srcset="desktop.jpg">
  <source media="(min-width: 768px)" srcset="tablet.jpg">
  <img src="mobile.jpg" alt="Description">
</picture>

CSS фоновые изображения

.hero {
  background-image: url("mobile-hero.jpg");
  background-size: cover;
}

@media (min-width: 768px) {
  .hero {
    background-image: url("desktop-hero.jpg");
  }
}

8. Container Queries (современный подход)

/* Стили зависят от размера контейнера, а не viewport */
.card-container {
  container-type: inline-size;
}

.card {
  padding: 1rem;
  font-size: 0.9rem;
}

@container (min-width: 400px) {
  .card {
    padding: 2rem;
    font-size: 1rem;
    display: grid;
    grid-template-columns: 1fr 1fr;
  }
}

@container (min-width: 700px) {
  .card {
    grid-template-columns: 1fr 2fr;
  }
}

Преимущества:

  • Адаптируется к размеру контейнера, не viewport
  • Компоненты более переиспользуемые
  • Лучше для модульной архитектуры

9. Практический пример: Полностью адаптивный сайт

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <style>
    /* Mobile First */
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    
    body {
      font-size: 16px;
      line-height: 1.5;
    }
    
    .container {
      width: 100%;
      max-width: 1200px;
      margin: 0 auto;
      padding: 1rem;
    }
    
    header {
      padding: 1rem;
      background-color: #333;
      color: white;
    }
    
    .logo {
      font-size: 1.5rem;
      font-weight: bold;
    }
    
    nav {
      display: none; /* Скрыто на мобильных */
      margin-top: 1rem;
    }
    
    nav ul {
      display: flex;
      flex-direction: column;
      gap: 0.5rem;
      list-style: none;
    }
    
    nav a {
      color: white;
      text-decoration: none;
    }
    
    .main {
      display: grid;
      grid-template-columns: 1fr;
      gap: 2rem;
      margin: 2rem 0;
    }
    
    .sidebar {
      display: none; /* Скрыто на мобильных */
    }
    
    @media (min-width: 768px) {
      header {
        display: flex;
        justify-content: space-between;
        align-items: center;
      }
      
      nav {
        display: block;
        margin-top: 0;
      }
      
      nav ul {
        flex-direction: row;
        gap: 2rem;
      }
      
      .main {
        grid-template-columns: 1fr 1fr;
      }
    }
    
    @media (min-width: 1024px) {
      .main {
        grid-template-columns: 2fr 1fr;
      }
      
      .sidebar {
        display: block;
      }
    }
  </style>
</head>
<body>
  <header>
    <div class="logo">MyLogo</div>
    <nav>
      <ul>
        <li><a href="#">Home</a></li>
        <li><a href="#">About</a></li>
        <li><a href="#">Services</a></li>
        <li><a href="#">Contact</a></li>
      </ul>
    </nav>
  </header>
  
  <main class="container">
    <div class="main">
      <article>Content here</article>
      <aside class="sidebar">Sidebar</aside>
    </div>
  </main>
</body>
</html>

10. Best Practices

/* ✅ Хорошо */
1. Используй mobile-first подход
2. Используй relative units (rem, em, %)
3. Используй flexbox и grid
4. Тестируй на разных размерах
5. Используй srcset для изображений
6. Используй viewport meta tag
7. Оптимизируй шрифты
8. Используй CSS variables для масштабирования

/* CSS Variables для адаптивности */
:root {
  --spacing: 1rem;
  --font-size: 16px;
}

@media (min-width: 768px) {
  :root {
    --spacing: 1.5rem;
    --font-size: 18px;
  }
}

.component {
  padding: var(--spacing);
  font-size: var(--font-size);
}

Заключение

Основные подходы к адаптивности:

  1. Fluid Layout — текучие размеры
  2. Media Queries — разные стили для разных размеров
  3. Flexible Grid — CSS Grid/Flexbox
  4. Mobile-First — начинать с мобильных
  5. Relative Units — используть % em rem
  6. Responsive Images — адаптивные картинки
  7. Container Queries — современный подход

Лучший современный подход: сочетание Mobile-First + Flexbox/Grid + Media Queries + Responsive Images.