{}const=>[]async()letfn</>var
WebПрактикаОсновы

Как сделать сайт адаптивным под телефон на HTML и CSS

Соберём mobile-first страницу без фреймворков: настроим viewport, гибкий контейнер, изображения, Grid и понятные media queries.

К

Кодик

Автор

6 мин чтения

Чтобы сайт нормально выглядел на телефоне, добавьте viewport, начните стили с узкого экрана, используйте гибкие размеры и только затем расширяйте макет через media query. Ниже соберём адаптивную страницу без фреймворков: карточки будут перестраиваться, изображение не выйдет за контейнер, а кнопки останутся удобными для касания.

Адаптивность не означает «уменьшить десктопный сайт». На телефоне меняется доступная ширина, способ управления и порядок чтения. Рабочая стратегия называется mobile first: сначала делаем понятный одноколоночный интерфейс, затем добавляем правила для более широких экранов.

1Настраиваем экран

Viewport сообщает мобильному браузеру реальную ширину устройства.

2Убираем жёсткие размеры

Контейнеры, сетка и картинки могут сжиматься без горизонтальной прокрутки.

3Добавляем перелом

Media query включает колонки только тогда, когда для них достаточно места.

Почему обычный сайт ломается на телефоне

Чаще всего страницу растягивает один элемент с фиксированной шириной: контейнер width: 1200px, большая картинка, длинная строка или сетка из трёх несжимаемых колонок. Браузер честно сохраняет эти 1200 пикселей и предлагает прокрутить страницу вбок.

ПроблемаХрупкое правилоАдаптивная замена
Контент шире экранаwidth: 1200pxwidth: min(100% - 32px, 1120px)
Картинка растягивает карточкуРазмер задан только в HTMLmax-width: 100%; height: auto
Три колонки не помещаютсяgrid-template-columns: repeat(3, 1fr)Одна колонка сначала, три после breakpoint
Текст слишком крупный или мелкийОдин размер для всех экрановclamp() в разумном диапазоне
Быстрый диагноз

Если страницу можно сдвинуть пальцем влево и увидеть пустое место, найдите элемент шире viewport. Масштабирование страницы жестом не считается исправлением.

Сравнение фиксированного десктопного макета и адаптивного mobile-first макета
В адаптивном варианте контент меняет структуру, а не просто становится мельче.

🔥 100 000+ учеников уже с нами

Устал читать теорию?
Пора кодить!

Кодик — приложение, где ты учишься программировать через практику. AI-наставник, интерактивные уроки, реальные проекты.

🤖 AI 24/7
🎓 Сертификаты
💰 Бесплатно
🚀 Начать учиться
Присоединились сегодня

Минимальный HTML и тег viewport

Создайте рядом файлы index.html и style.css. Ключевая строка находится в head: width=device-width связывает ширину CSS-viewport с шириной устройства, а initial-scale=1 задаёт исходный масштаб. Без неё мобильный браузер может представить страницу как широкий десктопный лист.

<!doctype html>
<html lang="ru">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Мой адаптивный проект</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <header class="hero container">
    <div>
      <p class="eyebrow">Первый проект</p>
      <h1>Страница, которой удобно пользоваться с телефона</h1>
      <a class="button" href="#projects">Смотреть проекты</a>
    </div>
    <img src="workspace.jpg" alt="Ноутбук на рабочем столе">
  </header>

  <main id="projects" class="container">
    <section class="cards">
      <article class="card"><h2>Сайт-визитка</h2><p>Одна страница о вас.</p></article>
      <article class="card"><h2>Портфолио</h2><p>Проекты и контакты.</p></article>
      <article class="card"><h2>Блог</h2><p>Заметки об обучении.</p></article>
    </section>
  </main>
</body>
</html>
Проверьте до CSS. Страница открывается, кириллица отображается правильно, изображение найдено, ссылка на style.css не даёт ошибку 404 в DevTools.

Mobile-first CSS: сначала один столбец

Базовые правила ниже рассчитаны на узкий экран. У контейнера нет фиксированной ширины, у изображения есть предел, а карточки идут одной колонкой. box-sizing: border-box заставляет браузер включать padding и border в итоговый размер элемента.

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  font-family: system-ui, sans-serif;
  color: #18213d;
  background: #f4f6ff;
}

img {
  display: block;
  max-width: 100%;
  height: auto;
  border-radius: 20px;
}

.container {
  width: min(100% - 32px, 1120px);
  margin-inline: auto;
}

.hero {
  display: grid;
  gap: 24px;
  padding-block: 48px;
}

h1 {
  font-size: clamp(2rem, 8vw, 4rem);
  line-height: 1.05;
}

.button {
  display: inline-flex;
  min-height: 48px;
  align-items: center;
  padding: 0 20px;
  border-radius: 12px;
  color: white;
  background: #4454e8;
}

.cards {
  display: grid;
  gap: 16px;
}

.card {
  padding: 20px;
  border-radius: 16px;
  background: white;
}
  • Выражение 100% - 32px оставляет по 16 пикселей воздуха с каждой стороны.
  • Функция min() не даёт контейнеру стать шире 1120 пикселей на большом мониторе.
  • Функция clamp() плавно меняет заголовок, но удерживает его между 2rem и 4rem.
  • Минимальная высота кнопки 48 пикселей сохраняет удобную область касания.

Схема mobile-first от узкого макета к планшету и широкому экрану
Базовый CSS работает везде, а дополнительные правила включаются при наличии свободного места.

Если свойства CSS пока приходится угадывать, закрепите селекторы, размеры и сетки в курсе CSS. Разметку для проекта можно повторить в курсе HTML и сразу смотреть результат в мобильном превью Кодика.

Media query: когда включать две и три колонки

Breakpoint выбирают по макету, а не по названию конкретного телефона. Медленно расширяйте окно: когда строка становится слишком длинной или карточкам тесно, там и нужен перелом. Для этого проекта первый breakpoint поставим на 700 пикселей, второй на 1000.

@media (min-width: 700px) {
  .hero {
    grid-template-columns: 1.1fr 0.9fr;
    align-items: center;
  }

  .cards {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (min-width: 1000px) {
  .cards {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}
Что получится
  • До 699 пикселей герой и карточки стоят в одну колонку.
  • От 700 пикселей герой делится на текст и изображение, карточки становятся двухколоночными.
  • От 1000 пикселей три карточки помещаются в один ряд.
  • minmax(0, 1fr) разрешает колонкам сжиматься и снижает риск переполнения длинным содержимым.

Три состояния адаптивной сетки на ширине телефона, планшета и компьютера
Количество колонок зависит от места для контента, а не от модели устройства.

Как проверить адаптивность и найти переполнение

Откройте DevTools, включите режим устройства и проверьте не одну любимую ширину, а диапазон примерно от 320 до 1440 пикселей. Потяните границу плавно: ошибки часто появляются между готовыми пресетами. Затем поверните экран и увеличьте масштаб текста до 200 процентов.

Горизонтальная прокрутка

Не прячьте её через overflow-x: hidden. Найдите виновника: временно добавьте * { outline: 1px solid red; } и проверьте фиксированные width, gap и длинные строки.

Media query не срабатывает

Проверьте viewport, порядок правил и точную ширину. При mobile first используется min-width: широкие правила пишутся после базовых.

Кнопки налезают друг на друга

Разрешите контейнеру перенос: display: flex; flex-wrap: wrap; gap: 12px. Не уменьшайте текст до нечитаемого размера.

Финальный чек-лист. Нет прокрутки страницы вбок, меню доступно с клавиатуры, изображения не искажены, текст читается без зума, кнопки не меньше 44-48 пикселей по высоте, а сетка перестраивается плавно между breakpoint.
Короткие ответы
Как сделать сайт адаптивным под телефон?

Добавьте meta viewport, используйте гибкий контейнер и изображения, сначала опишите одноколоночный мобильный макет, затем расширьте его через @media (min-width: ...).

Какие размеры экрана брать для media query?

Выбирайте breakpoint по моменту, когда конкретному контенту становится тесно. Для старта часто хватает одного перелома около 700 пикселей и второго около 1000, но это не обязательные стандарты.

Почему width: 100% иногда всё равно растягивает страницу?

Ширину могут увеличивать padding при стандартном box model, фиксированная ширина дочернего элемента, min-width, длинный code или слишком большой gap.

Flexbox или Grid для адаптивного сайта?

Flexbox удобен для одной оси, например строки кнопок. Grid проще для сетки карточек и областей страницы. В одном проекте их нормально сочетать.

Можно ли сделать адаптив без media query?

Частично: гибкая сетка с auto-fit и minmax умеет перестраиваться сама. Но для заметной смены композиции, меню или порядка блоков media query обычно всё равно нужен.

Куда двигаться после адаптива

Если стили не применяются, пройдите восемь проверок подключения CSS. Затем добавьте поведение по разбору подключения JavaScript к HTML и опубликуйте результат через GitHub Pages.

Понять роли всех слоёв поможет материал как HTML, CSS и JavaScript превращаются в сайт. В Кодике соберите тот же макет по шагам и проверяйте мобильное состояние после каждого изменения, а не в самом конце.

🎯Хватит откладывать

Понравилась статья?
Пора применять на практике!

В Кодик ты не просто читаешь — ты сразу пишешь код. Теория + практика = реальный скилл.

Мгновенная практика
🧠AI объяснит код
🏆Сертификат

Без регистрации • Без карты