HTML и CSS для вайбкодинга: от чтения нейросетевого кода до реализации идей

Курс ориентирован на тех, кто использует ИИ-инструменты для создания интерфейсов. Вы научитесь понимать структуру сгенерированного кода, корректировать стили и осознанно управлять визуальным результатом своих идей.

Анатомия веб-страницы: как читать структуру, созданную нейросетью

Анатомия веб-страницы: как читать структуру, созданную нейросетью

Вы просите нейросеть: «Сделай мне красивую кнопку для сайта». В ответ она выдает не просто прямоугольник с текстом, а двадцать строк непонятного кода с угловыми скобками, английскими словами и кавычками. Первая реакция — скопировать, вставить и надеяться, что сработает. Но когда кнопка съезжает влево или не меняет цвет, магия рушится. В вайбкодинге вам не нужно писать код с нуля, но вам жизненно необходимо уметь его читать.

Чтобы управлять нейросетью, нужно понимать, как она видит веб-страницу. Для неё сайт — это не картинка, а строгий текстовый чертёж.

Иерархия: страница как фамильное дерево

Когда искусственный интеллект генерирует разметку, он мыслит не пикселями, а вложенными друг в друга коробками. Эта концепция называется DOM (Document Object Model) — объектная модель документа.

Представьте матрешку: чтобы добраться до самой маленькой фигурки, нужно открыть все внешние. В HTML элементы точно так же вкладываются друг в друга, образуя строгую иерархию — дерево.

В этом дереве действуют родственные связи:

  • Родитель (Parent) — элемент, внутри которого находятся другие элементы.
  • Потомок, или дочерний элемент (Child) — элемент, находящийся внутри родителя.
  • Соседи (Siblings) — элементы, лежащие внутри одного и того же родителя на одном уровне.

Если нейросеть создала карточку товара, то сама карточка — это родитель. Картинка товара, заголовок и цена внутри неё — это потомки. А по отношению друг к другу картинка и цена — соседи.

Понимание этой иерархии — ваш главный инструмент отладки. Если фон применился ко всему экрану, а не к маленькой плашке, значит, нейросеть по ошибке прописала цвет родителю, а не потомку.

Словарь разметки: из чего состоит тег

Вся структура строится из тегов — базовых кирпичиков HTML. Тег — это команда браузеру, объясняющая, чем является данный кусок текста: абзацем, ссылкой или картинкой.

Нейросеть всегда пишет теги по одному и тому же шаблону. Рассмотрим типичную строку, которую вы часто будете встречать:

<a href="https://example.com">Нажми меня</a>

Давайте проведем вскрытие этого элемента:

  1. Открывающий тег (<a>): сообщает браузеру, где начинается элемент. Буква a (от англ. anchor — якорь) означает, что перед нами ссылка.
  2. Атрибут (href="https://example.com"): это скрытая настройка тега. Атрибуты всегда пишутся внутри открывающего тега через пробел. Они состоят из имени (href) и значения в кавычках. В данном случае атрибут указывает, куда именно должна вести ссылка.
  3. Содержимое (Нажми меня): то, что реально увидит пользователь на экране.
  4. Закрывающий тег (</a>): сообщает, что элемент закончился. Обратите внимание на слеш / — это стоп-сигнал для браузера.

Существуют и одиночные теги, которым не нужно содержимое, а значит, не нужен и закрывающий тег. Самый частый пример, который генерирует ИИ — это картинка:

<img src="photo.jpg" alt="Мой кот">

Здесь нет текста для вывода на экран, есть только открывающий тег и два атрибута: src (путь к файлу картинки) и alt (текст на случай, если картинка не загрузится).

Обязательный каркас: невидимая часть айсберга

Когда вы просите ИИ написать страницу целиком, он выдаст вам стандартный каркас. Выглядит он пугающе, но на деле это просто бюрократия, которую требует браузер.

<!DOCTYPE html>
<html>
  <head>
    <title>Мой первый сайт</title>
  </head>
  <body>
    <h1>Привет, мир!</h1>
    <p>Это текст на странице.</p>
  </body>
</html>

Разделим этот каркас на две зоны: то, что видит машина, и то, что видит человек.

  • <!DOCTYPE html> и <html> — это просто конверт. Они говорят браузеру: «Внутри современный HTML-документ, открывай».
  • <head> (Голова) — это служебная информация. Пользователь её не видит. Сюда нейросеть складывает название вкладки (<title>), шрифты, настройки для мобильных телефонов и ссылки на стили. Если вы просите ИИ изменить структуру текста или добавить картинку, в <head> вам лезть не нужно.
  • <body> (Тело) — это сама страница. Всё, что вы видите на экране (кнопки, тексты, видео), живет строго внутри этого тега.

В вайбкодинге 95% вашего внимания при чтении структуры должно быть направлено внутрь <body>.

Читаем код как рентгеновский снимок

Давайте применим наши знания. Вы попросили нейросеть: «Сделай профиль пользователя с именем и должностью». Она выдала следующий код внутри <body>:

<div class="user-profile">
  <img src="avatar.png" alt="Фото Ивана">
  <h2>Иван Иванов</h2>
  <p>Главный инженер</p>
</div>

Как это прочитать, не вникая в программирование?

  1. Мы видим тег <div>. Это универсальный контейнер (о них мы подробно поговорим в следующей главе). У него есть атрибут class="user-profile". Это бейджик, который ИИ повесил на контейнер, чтобы потом сказать: «Сделай элемент с бейджиком user-profile серым и круглым».
  2. Внутри <div> лежат три потомка: картинка (<img>), заголовок (<h2>) и абзац (<p>).
  3. Картинка — одиночный тег. Заголовок и абзац — парные, внутри них лежит текст, который увидит пользователь.
  4. В конце стоит </div> — контейнер закрылся.

Теперь, если нейросеть ошиблась и добавила кнопку «Написать сообщение» после </div>, вы поймете, почему кнопка визуально отвалилась от карточки профиля — она стала не потомком карточки, а её соседом. Чтобы исправить это, вам достаточно попросить ИИ: «Перемести кнопку внутрь контейнера user-profile».

Вы научились видеть сквозь символы и понимать скелет страницы. Но пока это просто набор элементов, идущих друг за другом сверху вниз. Чтобы строить сложные интерфейсы, эти элементы нужно правильно группировать — именно этим мы займемся далее.

Семантика и контейнеры: логика группировки элементов для ИИ-запросов

Семантика и контейнеры: логика группировки элементов для ИИ-запросов

Представьте ситуацию: вы просите нейросеть сгенерировать карточку товара. Она выдает картинку, заголовок, цену и кнопку «Купить». Затем вы пишете: «Сдвинь текст и кнопку вправо от картинки». И тут макет рассыпается: цена улетает в угол, кнопка прилипает к краю экрана, а заголовок остается на месте. Почему ИИ вас не понял? Потому что для него эти элементы были просто свалены в кучу. Чтобы двигать объекты вместе, их нужно сначала положить в одну «коробку».

В прошлой главе мы разобрали, что веб-страница — это дерево, где у каждого тега есть свое место, а элементы могут быть родителями и потомками. Теперь мы научимся создавать эти родственные связи искусственно, чтобы управлять структурой так же легко, как мы раскладываем вещи по папкам на компьютере.

Универсальная коробка: тег <div>

Если тег <img> говорит браузеру «здесь картинка», а <a> — «здесь ссылка», то тег <div> (от слова division — раздел) не значит ровно ничего. Это просто прозрачная прямоугольная коробка. Сам по себе он никак не меняет внешний вид страницы.

Его единственная задача — быть контейнером (родителем) для других элементов.

Допустим, у нас есть аватарка и имя пользователя. Если они просто лежат рядом, браузер и нейросеть воспринимают их как независимые объекты. Но если мы обернем их в <div>, они станут единым целым.

Посмотрим на код, который часто генерируют нейросети:

<div>
  <img src="avatar.jpg" alt="Фото профиля">
  <h2>Иван Иванов</h2>
  <p>Вайбкодер</p>
</div>

Теперь, если вы попросите ИИ: «Сделай у этой группы серый фон и добавь рамку», он применит эти стили к родительскому <div>, и весь блок (картинка, заголовок, текст) визуально объединится в карточку.

Строчный брат: тег <span>

<div> — это коробка, которая по умолчанию занимает всю доступную ширину и переносит текст на новую строку (блочный элемент). Но что, если нам нужно выделить только одно слово внутри абзаца?

Для этого существует <span>. Это такой же пустой контейнер, но он работает прямо внутри текста, не разрывая строку.

<p>Стоимость курса: <span>бесплатно</span>.</p>

Обернув слово «бесплатно» в <span>, мы даем ИИ возможность зацепиться за него и, например, перекрасить в зеленый цвет, не трогая остальной текст.

Имена для коробок: атрибут class

Если на странице сто прозрачных коробок <div>, как нейросеть поймет, к какой именно вы просите применить изменения? Фраза «сделай ту коробку посередине побольше» для машины звучит как белый шум. Ей нужны точные координаты.

Для этого используется атрибут class. Это бейдж с именем, который мы вешаем на любой тег.

<div class="profile-card">
  <img src="avatar.jpg" class="profile-avatar">
  <h2 class="profile-name">Иван Иванов</h2>
</div>

Введение классов решает сразу две задачи:

  1. Связь с дизайном. Класс — это крючок, за который в следующей главе зацепится CSS, чтобы сказать: «Все элементы с классом profile-card должны иметь белую рамку».
  2. Язык общения с ИИ. Вы больше не говорите «сделай текст под картинкой красным». Вы пишете промпт: «Измени цвет у profile-name на красный». Нейросеть мгновенно находит нужный тег и пишет безошибочный код.

Атрибут class может содержать несколько имен одновременно, разделенных пробелом: <div class="card dark-theme">. Это позволяет ИИ комбинировать разные наборы настроек.

Семантика: когда коробка обретает смысл

Долгое время веб-разработчики делали сайты исключительно на тегах <div>. Это называлось «div-soup» (суп из дивов). Код выглядел как бесконечная матрешка одинаковых тегов: <div class="header">, внутри <div class="nav">, ниже <div class="content">.

Браузеру было все равно, но поисковым роботам и программам чтения экрана (для слабовидящих) было сложно понять, где на странице главное меню, а где статья.

Поэтому в HTML добавили семантические теги. Это те же самые <div>, но с осмысленными названиями. Они так же ничего не делают с дизайном, но громко заявляют о своей роли:

  • <header> — шапка сайта или раздела (логотип, навигация).
  • <nav> — блок с главными ссылками (меню).
  • <main> — основное уникальное содержимое страницы.
  • <section> — смысловой раздел (например, «О нас» или «Тарифы»).
  • <article> — самостоятельная сущность (пост в блоге, новость, товар).
  • <footer> — подвал сайта (копирайты, контакты).

Зачем семантика вайбкодеру?

Нейросети обучаются на миллионах качественных сайтов. Они «мыслят» паттернами. Если вы просите сгенерировать структуру страницы, используя семантические теги, ИИ выдаст гораздо более чистый и предсказуемый код.

Сравните два промпта:

Плохой промпт: «Сделай блок сверху для логотипа, потом большой блок для текста, а внизу блок для контактов». ИИ наплодит безымянных <div>, в которых вы потом запутаетесь.

Вайбкодерский промпт: «Сгенерируй структуру страницы. Используй семантические теги: <header> для шапки, <main> для основного контента. Внутри <main> создай контейнер <article> для поста. Дай всем элементам понятные классы по БЭМ (методология именования), например post-title, post-body».

Получив такой запрос, нейросеть выдаст профессиональный каркас:

<header class="site-header">
  <!-- Логотип и меню -->
</header>
<main class="content">
  <article class="post">
    <h1 class="post-title">Как общаться с ИИ</h1>
    <p class="post-body">Текст статьи...</p>
  </article>
</main>

Теперь вы умеете читать структуру, которую выдает нейросеть, и понимаете, как элементы группируются в контейнеры. Вы знаете, что классы — это имена, по которым мы будем обращаться к элементам. В следующей главе мы наконец-то вдохнем в этот серый каркас жизнь и узнаем, как именно CSS использует эти классы для управления цветом, шрифтами и отступами.

Визуальный язык CSS: управление цветом, типографикой и пространством

Визуальный язык CSS: управление цветом, типографикой и пространством

Мы уже умеем размечать контент тегами и группировать его в контейнеры, раздавая им имена с помощью атрибута class. Но если мы откроем такой HTML-файл в браузере, мы увидим лишь унылый черный текст на белом фоне, прижатый к левому верхнему углу. Нейросеть сгенерировала идеальный каркас, но как она его «красит»?

Браузер не знает, что элемент с классом profile-card должен выглядеть как стильная карточка с тенью. Ему нужна инструкция. Эту инструкцию предоставляет CSS (Cascading Style Sheets) — язык таблиц стилей. Если HTML — это существительные (что это?), то CSS — это прилагательные (какое оно?).

Анатомия CSS-правила

Когда нейросеть выдает вам код дизайна, она пишет набор правил. Каждое правило состоит из двух главных частей: кого мы хотим изменить, и что именно мы хотим с ним сделать.

Вот классическое CSS-правило:

.profile-card {
  background-color: #f0f0f0;
  border-radius: 8px;
}

Давайте разберем его по косточкам:

  1. Селектор (.profile-card). Это указатель, который связывает CSS с HTML. Точка в самом начале — это критически важный символ. Она говорит браузеру: «Ищи в HTML элемент, у которого атрибут class равен profile-card». Без точки браузер будет искать тег <profile-card>, не найдет его и проигнорирует правило.
  2. Блок объявлений ({ ... }). Фигурные скобки обозначают границы инструкций для выбранного элемента.
  3. Свойство (background-color). Это конкретный аспект дизайна, который мы меняем (в данном случае — цвет фона).
  4. Значение (#f0f0f0). То, каким именно должно стать свойство (светло-серый цвет).
  5. Синтаксический клей (: и ;). Двоеточие отделяет свойство от значения, а точка с запятой завершает команду. Забытая точка с запятой — самая частая причина, по которой ломается нейросетевой код при ручных правках.

Цвет и типографика: первые штрихи

Чаще всего при вайбкодинге вам хочется изменить цвета или шрифты, потому что ИИ не угадал с настроением проекта.

Управление цветом в CSS строится вокруг свойств color (цвет самого текста) и background-color (цвет фона элемента). Нейросети обычно используют HEX-коды — шестизначные номера цветов, начинающиеся с решетки (например, #ff0000 для красного). Если вы хотите поменять цвет, вам не нужно учить эти коды наизусть. Достаточно попросить ИИ: «Замени цвет фона в .profile-card на темно-синий», и он сам подберет нужный HEX-код.

Управление типографикой отвечает за текст. Ключевые свойства, которые вы будете встречать постоянно:

  • font-size: размер шрифта (обычно измеряется в пикселях, например, 16px).
  • font-weight: толщина букв (normal, bold или числа от 100 до 900).
  • font-family: название шрифта (например, Arial или Roboto).

Читая код, обращайте внимание на английские слова. CSS очень логичен. Если вы видите font-size: 24px;, интуиция вас не обманывает — это действительно делает шрифт размером в 24 пикселя.

Невидимая геометрия: Блочная модель (Box Model)

Цвета и шрифты — это косметика. Настоящая магия CSS начинается там, где мы управляем пространством.

Браузер воспринимает абсолютно каждый HTML-элемент (будь то заголовок, картинка или контейнер <div>) как прямоугольную коробку. Даже если визуально кнопка круглая, математически для браузера она остается прямоугольником. Правила, по которым строятся эти коробки, называются Box Model (блочная модель).

Блочная модель состоит из четырех слоев, идущих от центра к краям:

  1. Content (Контент) — само содержимое. Текст, картинка или вложенные элементы. У него есть ширина (width) и высота (height).
  2. Padding (Внутренний отступ) — пустое пространство между контентом и границей элемента. Заливается фоновым цветом элемента.
  3. Border (Граница) — рамка, окаймляющая элемент. Может быть видимой (например, сплошная линия) или невидимой.
  4. Margin (Внешний отступ) — пустое пространство снаружи границы. Оно прозрачное и служит для того, чтобы отодвинуть элемент от его соседей.

Padding vs Margin: главная путаница новичков

Разница между padding и margin — это то, на чем спотыкаются почти все.

Представьте картину в раме, висящую на стене.

  • Padding — это паспарту (картонная окантовка), которое находится внутри рамы, между самим холстом (контентом) и деревянной рамой (border). Если увеличить padding, картина станет больше занимать места на стене, потому что рама раздвинется.
  • Margin — это расстояние от рамы вашей картины до соседней картины на стене. Если увеличить margin, сама картина не изменится, но она оттолкнет от себя соседей.

Когда вы просите нейросеть «сделать кнопку побольше», она, скорее всего, увеличит padding. А если вы скажете «отодвинь кнопку от текста», она увеличит margin.

Синтез: как читать и править ИИ-код

Теперь, понимая синтаксис и блочную модель, вы можете осмысленно читать ответы нейросети. Допустим, ИИ выдал вам такой код для кнопки:

.action-button {
  background-color: #007bff;
  color: white;
  padding: 10px 20px;
  margin-top: 15px;
  border-radius: 5px;
}

Вы больше не видите здесь магические заклинания. Вы читаете геометрию и стиль:

  • Это правило для элемента с классом action-button.
  • Кнопка синяя (background-color), текст на ней белый (color).
  • Внутри кнопки есть «воздух»: 10 пикселей сверху/снизу и 20 пикселей по бокам (padding).
  • Кнопка отталкивает от себя элементы сверху на 15 пикселей (margin-top).
  • Углы немного скруглены (border-radius).

Если кнопка кажется вам слишком тесной, вы не просите ИИ «переделай дизайн». Вы пишете точный промпт: «Увеличь padding у .action-button до 15px 30px». Если она слипается с верхним текстом — «Добавь больше margin-top».

Понимание визуального языка CSS дает вам контроль. Вы перестаете быть пассивным потребителем кода и становитесь арт-директором, который точно знает, за какие рычаги дергать. Но пока наши элементы просто идут друг за другом сверху вниз. Как заставить их выстроиться в сложную сетку или встать рядом? Этим управляют современные системы раскладки, которые мы разберем на следующем шаге.

Современная раскладка: Flexbox и Grid как инструменты композиции

Современная раскладка: Flexbox и Grid как инструменты композиции

Вы уже умеете создавать красивые элементы: настраивать цвета, шрифты и внутренние отступы, формируя идеальную рамку вокруг контента. Но если вы попросите нейросеть сгенерировать три такие карточки, браузер по умолчанию выстроит их строго друг под другом, растянув на всю ширину экрана. Почему? Потому что тег <div> — это блочный элемент, и его природное поведение — занимать всю доступную ширину, выталкивая соседей на новую строку.

Чтобы создать навигационное меню, галерею товаров или сложный дашборд, нам нужно преодолеть это природное поведение. Нам нужны инструменты, которые управляют пространством между элементами. В современном вебе за это отвечают две технологии: Flexbox и CSS Grid. Именно их нейросети используют в подавляющем большинстве случаев для построения интерфейсов.

Flexbox: одномерная магия

Flexbox (Flexible Box Layout) был создан для решения одной глобальной задачи: распределить элементы вдоль одной линии — либо в строку, либо в столбец.

Как только вы добавляете родительскому контейнеру CSS-свойство display: flex, происходит магия: все его прямые потомки перестают быть обычными блоками и становятся «гибкими элементами» (flex-items). По умолчанию они тут же выстраиваются в один горизонтальный ряд, прижимаясь друг к другу.

Управлять этим рядом невероятно просто, если понимать, что у Flexbox есть две оси:

  1. Главная ось (Main Axis) — направление, в котором идут элементы. По умолчанию это горизонталь (слева направо).
  2. Поперечная ось (Cross Axis) — перпендикулярна главной. По умолчанию это вертикаль (сверху вниз).

Всю работу во Flexbox делают два свойства, которые вы будете постоянно встречать в сгенерированном коде:

  • justify-content — выравнивает элементы вдоль главной оси. Популярные значения: center (собрать всё в центре), space-between (раскидать элементы по краям, оставив пустоту между ними).
  • align-items — выравнивает элементы вдоль поперечной оси. Например, center выровняет иконку и текст строго по вертикальному центру, даже если они разной высоты.

Как это использовать в вайбкодинге? Если вы видите, что ИИ сгенерировал меню, но логотип и ссылки прилипли друг к другу, вам не нужно писать код руками. Достаточно сказать: «Сделай шапку flex-контейнером и раскидай элементы по краям через space-between, а по вертикали выровняй по центру». Нейросеть поймет вас с полуслова, потому что вы используете точную терминологию.

CSS Grid: двумерный каркас

Flexbox идеален, когда элементы идут друг за другом цепочкой. Но что если вам нужна сетка фотографий 3x3? Или сложный макет статьи, где слева узкое меню, по центру широкий текст, а справа рекламный блок?

Пытаться собрать двумерную сетку из цепочек Flexbox — это как строить дом из спичек: можно, но конструкция получится хрупкой (вспомните «суп из дивов»). Для таких задач существует CSS Grid.

Свойство display: grid превращает контейнер в двумерную сетку, где вы одновременно управляете и строками, и столбцами.

Главное свойство здесь — grid-template-columns. Оно задает количество и ширину колонок. В Grid появилась специальная единица измерения — fr (fraction, доля свободного пространства).

Если ИИ пишет grid-template-columns: 1fr 1fr 1fr;, это означает: «раздели доступную ширину на три равные колонки». Если написать 1fr 2fr, первая колонка займет треть ширины, а вторая — две трети.

Еще одно важнейшее свойство Grid (которое сейчас работает и во Flexbox) — это gap. В прошлой главе мы обсуждали margin (внешний отступ). Проблема margin в том, что он добавляется к элементу со всех сторон, и крайние элементы сетки начинают отталкиваться от краев экрана. Свойство gap: 20px; решает эту проблему изящно: оно создает пустое пространство только между элементами, не трогая внешние границы контейнера.

Flexbox или Grid: как ставить задачи нейросети

Главный навык вайбкодера при работе с раскладкой — умение выбрать правильный инструмент на этапе промпта. Нейросеть может собрать сетку на Flexbox, а меню на Grid, но код получится переусложненным и трудным для дальнейших правок.

Запомните простое правило распределения ролей:

Характеристика Flexbox CSS Grid
Измерение Одномерный (строка ИЛИ столбец) Двумерный (строки И столбцы одновременно)
Логика Контент управляет раскладкой (элементы сами решают, сколько места занять) Раскладка управляет контентом (мы заранее чертим жесткий каркас)
Идеально для... Навигационное меню, группа кнопок, аватарка + имя автора Галерея товаров, макет всей страницы, шахматная доска

Синтез: собираем сложный компонент

В реальных проектах Flexbox и Grid почти всегда работают вместе. Давайте посмотрим, как знания из предыдущих глав объединяются с сегодняшними.

Представьте карточку товара.

  1. Вся страница магазина — это display: grid, где задано grid-template-columns: 1fr 1fr 1fr 1fr; (товары стоят в 4 колонки).
  2. Сама карточка товара (<div> с классом product-card) ложится в одну из ячеек этой сетки. Внутри нее есть картинка, заголовок и блок с ценой.
  3. Блок с ценой и кнопкой «Купить» должен выглядеть так: цена прижата к левому краю, кнопка — к правому. Для этого внутреннего блока нейросеть использует display: flex и justify-content: space-between.

Вы только что прочитали архитектуру реального веб-приложения. Вы понимаете, что теги создают структуру, классы дают имена, Box Model рисует рамки и фоны, Grid расставляет карточки по экрану, а Flexbox наводит порядок внутри самих карточек.

Мы научились жестко контролировать положение элементов в пространстве. Но экраны пользователей бывают разными: от огромных мониторов до узких смартфонов. Если наша сетка из 4 колонок сожмется до ширины телефона, контент превратится в нечитаемую кашу. О том, как заставить наши раскладки адаптироваться под любые устройства, мы поговорим в следующей главе.

Адаптивность и переменные: создание гибких интерфейсов под любые экраны

Адаптивность и переменные: создание гибких интерфейсов под любые экраны

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

Браузер не умеет угадывать ваши намерения. Если в прошлой главе мы задали сетке четыре колонки через CSS Grid, браузер будет честно пытаться втиснуть эти четыре колонки даже на узкий экран телефона. Чтобы интерфейс был по-настоящему современным, нам нужно научиться управлять его поведением в зависимости от условий среды.

Медиазапросы: условная логика в CSS

Главный инструмент адаптивного дизайна — это медиазапросы (Media Queries). Это способ сказать браузеру: «Применяй эти стили всегда, но если ширина экрана станет меньше определенного значения, включи вот эти дополнительные правила».

В коде, который выдает нейросеть, медиазапросы всегда начинаются с правила @media. Внутри круглых скобок пишется условие, а внутри фигурных — обычные CSS-правила, которые сработают только при выполнении этого условия.

/* Базовые стили для всех экранов (например, для десктопа) */
.dashboard-grid {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr; /* 4 колонки */
  gap: 20px;
}

/* Стили только для экранов уже 768 пикселей (планшеты и телефоны) */
@media (max-width: 768px) {
  .dashboard-grid {
    grid-template-columns: 1fr; /* 1 колонка */
  }
}

Точка, в которой происходит изменение дизайна (в нашем примере это 768 пикселей), называется брейкпоинтом (breakpoint — точка излома).

Читая нейросетевой код, обращайте внимание на то, как ИИ выстраивает брейкпоинты. Чаще всего используется подход Mobile First (сначала мобильные) или Desktop First (сначала десктоп).

  • Если вы видите @media (max-width: ...), значит базовый код написан для широких экранов, а в медиазапросах интерфейс «схлопывается» для мобильных.
  • Если вы видите @media (min-width: ...), значит базовый код написан для мобильных (одна колонка), а при расширении экрана добавляются новые колонки.

Относительные единицы измерения: отказ от жестких рамок

Медиазапросы решают проблему кардинальной смены макета (было 4 колонки, стала 1). Но чтобы элементы плавно подстраивались под экран между брейкпоинтами, нужно отказаться от жесткой привязки к пикселям (px). Пиксель — это абсолютная величина. Элемент шириной 400px всегда будет занимать 400px, даже если весь экран телефона имеет ширину 320px.

Нейросети часто используют относительные единицы, которые вычисляются динамически:

  1. Проценты (%) — размер вычисляется относительно родительского контейнера. Если блоку задать width: 50%, он займет ровно половину ширины того элемента, внутри которого находится.
  2. Viewport-единицы (vw и vh) — размер вычисляется относительно окна браузера (viewport). 1vw — это 1% от ширины экрана, 1vh — 1% от высоты экрана. Если задать секции min-height: 100vh, она всегда будет занимать ровно один полный экран в высоту, независимо от устройства.
  3. Единица rem — размер вычисляется относительно базового размера шрифта всего документа. Обычно в браузерах по умолчанию 1rem равен 16px.

Почему ИИ так любит rem для отступов и шрифтов? Представьте, что вы задали всем заголовкам, кнопкам и отступам размеры в rem. Если на маленьком экране вы решите чуть уменьшить весь интерфейс, вам не придется переписывать десятки правил. Достаточно в одном месте (в корне документа) слегка уменьшить базовый шрифт, и все элементы в rem пропорционально уменьшатся сами.

CSS-переменные: пульт управления вайбкодингом

Когда вы генерируете код через ИИ, вы часто просите: «Сделай интерфейс в темных тонах с неоново-зелеными акцентами». Нейросеть выдает CSS, где цвет #00FF00 повторяется двадцать раз: в фоне кнопок, в рамках карточек, в цвете ссылок и иконок.

Если через пять минут вы решите, что неоново-зеленый режет глаз и нужен мягкий фиолетовый, вам придется просить ИИ переписать весь код или вручную искать и заменять значение по всему файлу. Это долго и чревато ошибками.

Для решения этой проблемы существуют CSS-переменные (Custom Properties). Они позволяют сохранить значение (цвет, размер, шрифт) под понятным именем и использовать это имя везде в коде.

Переменные объявляются в специальном селекторе :root (это самый верхний уровень документа, родитель всего), а их имена всегда начинаются с двух дефисов:

:root {
  --primary-color: #8A2BE2; /* Фиолетовый */
  --bg-color: #121212;      /* Темный фон */
  --card-radius: 12px;      /* Скругление углов */
}

Чтобы применить переменную, используется ключевое слово var():

.action-button {
  background-color: var(--primary-color);
  border-radius: var(--card-radius);
}

.profile-card {
  background-color: var(--bg-color);
  border: 1px solid var(--primary-color);
  border-radius: var(--card-radius);
}

Синергия переменных и медиазапросов

Истинная мощь адаптивного дизайна раскрывается, когда мы объединяем переменные и медиазапросы.

Вместо того чтобы внутри @media переписывать стили для каждого отдельного класса (кнопки, карточки, меню), мы можем просто изменить значение переменной.

:root {
  /* На десктопе отступы большие */
  --global-padding: 40px;
}

.card { padding: var(--global-padding); }
.header { padding: var(--global-padding); }

@media (max-width: 768px) {
  :root {
    /* На мобильных мы просто меняем саму переменную */
    --global-padding: 16px;
  }
}

В этом примере при сужении экрана до 768 пикселей значение --global-padding автоматически обновится. Все элементы, которые ссылались на эту переменную, мгновенно «сожмутся» без необходимости писать для них отдельные правила.

Для вайбкодера понимание :root и переменных — это суперсила. Получив код от нейросети, вам больше не нужно вчитываться в сотни строк стилей. Вы просто находите блок :root в самом начале CSS-файла — это ваш пульт управления. Поменяв пару значений HEX-кодов или пикселей прямо там, вы мгновенно трансформируете весь визуальный стиль проекта.

В следующей главе мы разберемся, что делать, если сгенерированный код всё-таки сломался, и как использовать инструменты разработчика прямо в браузере, чтобы найти и исправить ошибку.

Отладка и рефакторинг: как исправлять ошибки нейросетей в браузере

Отладка и рефакторинг: как исправлять ошибки нейросетей в браузере

Нейросеть сгенерировала для вас отличный адаптивный макет, но одна кнопка почему-то наезжает на текст, а её цвет не совпадает с переменной, которую вы просили использовать. Вы пишете промпт: «Исправь кнопку». ИИ извиняется, выдает новый блок кода, кнопка становится идеальной, но... ломается сетка всей страницы. Знакомая ситуация? Это «рулетка вайбкодинга». Чтобы не играть в неё, нужно перестать переписывать весь код вслепую и научиться точечно оперировать результат.

Для этого в каждом современном браузере встроен хирургический инструмент — DevTools (инструменты разработчика).

Рентген для веб-страницы

Браузер не просто читает HTML и CSS, он рендерит (отрисовывает) их в визуальную картину. DevTools позволяет заглянуть «под капот» этой картины и увидеть, как именно браузер понял код нейросети.

Чтобы открыть DevTools, кликните правой кнопкой мыши по проблемному элементу на странице (например, по той самой съехавшей кнопке) и выберите «Исследовать элемент» (Inspect) или нажмите F12.

Откроется панель, в которой нас интересует вкладка Elements (Элементы). Она разделена на две главные части:

  1. Слева — живое DOM-дерево. Это HTML-структура страницы. Если навести курсор на любой тег <div> в этом дереве, браузер подсветит соответствующий ему прямоугольник прямо на странице, показывая его контент, внутренние (padding) и внешние (margin) отступы разными цветами.
  2. Справа — панель Styles (Стили). Здесь показаны абсолютно все CSS-правила, которые в данный момент применяются к выделенному слева HTML-тегу.

Главная сила DevTools в том, что это песочница. Вы можете дважды кликнуть по любому значению в панели Styles (например, изменить margin: 20px на margin: 50px) и мгновенно увидеть результат на странице. Вы можете удалять теги, менять классы и переписывать текст.

Как только вы обновите страницу, все изменения исчезнут — они происходят только в вашей оперативной памяти, исходный файл остается нетронутым. Это идеальное место для безопасных экспериментов.

Битва стилей: почему ИИ-код не применяется

Самая частая проблема при работе с ИИ-генерацией — вы просите изменить цвет элемента, ИИ дает вам новый CSS-код, вы его вставляете, но визуально ничего не меняется.

Если вы проинспектируете этот элемент через DevTools, то в панели Styles увидите добавленное правило, но оно будет перечёркнуто. Перечёркнутый текст в DevTools означает одно: браузер видит это правило, но игнорирует его, потому что нашел более сильное правило.

В CSS существует строгая иерархия, которая называется специфичностью (Specificity). Когда к одному и тому же элементу применяются противоречащие правила (например, одно говорит «будь красным», а другое — «будь синим»), браузер рассчитывает «вес» селекторов и применяет тот, что тяжелее.

Тип селектора Пример в коде Условный вес
Тег button { color: red; } 11
Класс .btn-primary { color: blue; } 1010
ID (уникальный идентификатор) #submit-btn { color: green; } 100100

Если нейросеть изначально задала стиль через класс (.btn-primary), а потом попыталась переопределить его через тег (button), браузер применит стиль класса, так как 10>110 > 1. Правило для тега окажется перечёркнутым в DevTools.

Иногда ИИ, отчаявшись перебить специфичность, добавляет к значению флаг !important (например, color: red !important;). Это «ядерная кнопка» CSS, которая ломает естественный каскад и перебивает вообще всё. Если в вашем коде много !important — это признак того, что ИИ запутался в структуре классов и пытается решить проблему грубой силой.

Цикл точечного рефакторинга

Понимание DevTools и специфичности меняет ваш подход к вайбкодингу. Вместо того чтобы скармливать нейросети весь файл и надеяться на чудо, вы переходите к циклу точечного рефакторинга:

  1. Локализация: Видите баг → Кликаете правой кнопкой «Исследовать элемент».
  2. Диагностика: Смотрите в панель Styles. Видите, что margin перечёркнут? Значит, проблема в специфичности. Видите огромный желтый блок вокруг элемента? Значит, ИИ задал слишком большой внешний отступ.
  3. Эксперимент: Прямо в браузере отключаете галочками подозрительные свойства или вписываете новые значения, пока элемент не встанет на место.
  4. Хирургический промпт: Копируете из DevTools точное название класса и пишете ИИ: "В классе .profile-card измени padding на 2rem, а свойство height удали полностью. Остальной код не трогай".

Такой подход гарантирует, что исправление одного элемента не разрушит соседние блоки, которые уже работают идеально. Вы выступаете в роли арт-директора, который точно указывает исполнителю, где и какой мазок кистью нужно поправить.

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

Синтез: сборка и кастомизация сложного проекта через диалог с ИИ

Синтез: сборка и кастомизация сложного проекта через диалог с ИИ

Самая частая ошибка начинающего вайбкодера — написать в чат нейросети: «Создай мне красивый интернет-магазин кроссовок с корзиной, отзывами и адаптацией под мобильные». В ответ ИИ выдает полотно из сотен строк кода. Вы копируете его в браузер, и вместо магазина видите съехавший текст, неработающие кнопки и «суп из дивов». Попытка попросить ИИ «исправить всё» делает только хуже: чиня одно, нейросеть ломает другое.

Проблема не в том, что ИИ плохо пишет код. Проблема в архитектуре диалога. Чтобы перейти от генерации случайных сниппетов к созданию полноценных проектов, нужно перестать просить нейросеть построить дом целиком, а стать прорабом, который заказывает и собирает детали по чертежам.

Ловушка контекстного окна

У любой нейросети есть «контекстное окно» — объем кратковременной памяти, который она способна удерживать в фокусе во время генерации ответа.

Когда вы просите написать сложную страницу целиком, ИИ начинает с энтузиазмом генерировать шапку сайта. К моменту, когда он доходит до подвала страницы, его внимание рассеивается. Он «забывает», какие CSS-переменные создал в начале, начинает плодить новые названия классов, дублировать стили и нарушать логику сеток. Это явление называется галлюцинацией кода.

Чем больше требований вы запихиваете в один промпт, тем выше шанс, что ИИ начнет срезать углы. Он может проигнорировать семантику, отказаться от Flexbox в пользу устаревших методов или забыть про мобильную адаптивность.

Компонентный подход к вайбкодингу

Решение проблемы контекстного окна — компонентный подход. Это принцип разработки, при котором сложный интерфейс разбивается на независимые, логически завершенные блоки (компоненты).

Вместо одного мега-запроса вы ведете с ИИ серию сфокусированных диалогов. Каждый компонент генерируется, проверяется и отлаживается отдельно, и только потом встраивается в общий проект.

Типичный лендинг можно разбить на следующие компоненты:

  1. Глобальные стили (шрифты, цвета, сброс отступов).
  2. Header (навигационная панель с логотипом).
  3. Hero-секция (главный экран с крупным заголовком и кнопкой призыва к действию).
  4. Features (сетка преимуществ продукта).
  5. Footer (подвал с контактами).

Такая декомпозиция позволяет ИИ на 100% сфокусироваться на конкретной задаче. Когда нейросеть пишет только Hero-секцию, она идеально выстраивает отступы, подбирает семантические теги и делает безупречную адаптивность.

Алгоритм сборки проекта

Процесс вайбкодинга сложного проекта состоит из трех этапов: закладка фундамента, генерация модулей и хирургическая интеграция.

Шаг 1. Фундамент (Глобальные переменные)

Никогда не начинайте с генерации блоков. Первый запрос к ИИ должен сформировать «правила игры» для всего будущего кода. Вы просите создать базовую структуру HTML и определить CSS-переменные в :root.

Пример промпта для фундамента:

Создай базовый HTML-каркас и CSS-файл. В CSS настрой сброс отступов (reset) и создай переменные в :root для проекта:

  • Основной цвет: глубокий синий.
  • Цвет акцента: яркий оранжевый.
  • Шрифты: без засечек, современный стиль.
  • Базовые отступы (padding/margin). Не пиши никакой контент в <body>, подготовь только фундамент.

Прочитайте сгенерированный код. Убедитесь, что ИИ создал переменные вида --primary-color. Теперь вы будете требовать от нейросети использовать именно их во всех последующих компонентах.

Шаг 2. Генерация и изоляция компонентов

Далее вы заказываете компоненты по одному. Главное правило на этом этапе — жестко задавать контекст и ограничения.

Плохой запрос:

Сделай блок с карточками товаров.

Хороший запрос:

Сгенерируй секцию товаров (используй тег <section>). Внутри создай сетку из 3 карточек, используя CSS Grid. Для цветов и отступов используй ТОЛЬКО существующие CSS-переменные из :root. Каждому элементу дай уникальный класс с префиксом product-, например product-card, product-title, чтобы они не конфликтовали с другими блоками.

Префикс в названиях классов (например, product-) — это ваша страховка. Если ИИ назовет кнопку просто .btn, а потом в другом чате сгенерирует шапку с кнопкой, которая тоже называется .btn, при их объединении стили перемешаются.

Шаг 3. Интеграция и аудит

Получив код компонента, не спешите вставлять его в основной файл. Сначала откройте его в пустом HTML-документе.

  1. Проверьте DOM-дерево: нет ли лишних контейнеров?
  2. Проверьте адаптивность: сузьте окно браузера.
  3. Если что-то не так — используйте DevTools для поиска проблемы и напишите ИИ точечный промпт на исправление (например: «У класса .product-grid на мобильных экранах сетка ломается, сделай 1 колонку через медиазапрос»).

Только когда компонент идеален, копируйте его HTML внутрь вашего основного <body>, а его CSS — в конец вашего файла стилей.

Управление контекстом диалога

В процессе сборки проекта чат с ИИ неизбежно разрастается. Нейросеть начинает «забывать» начало разговора. Как этим управлять?

  • Перезапуск контекста. Если вы переходите к совершенно новому, сложному блоку (например, от текстовой статьи к сложной галерее изображений), лучше начать новый чат.
  • Снабжение знаниями. В новом чате ИИ не знает о ваших глобальных стилях. Начните диалог так: «Я пишу сайт. Вот мои текущие CSS-переменные: [вставляете код :root]. Сгенерируй для меня Footer, используя эти цвета».
  • Использование ИИ для рефакторинга. Если после объединения 5 компонентов ваш CSS-файл стал похож на свалку, скопируйте его целиком, отправьте в ИИ и попросите: «Проведи рефакторинг этого CSS. Сгруппируй медиазапросы, удали дублирующиеся свойства и проверь, не перебивают ли классы друг друга».

Вайбкодинг — это не написание кода руками, но это и не слепое копирование. Это процесс системной инженерии, где вы выступаете в роли архитектора. Вы определяете структуру, задаете ограничения, требуете соблюдения стандартов (семантики, Grid/Flexbox) и контролируете качество интеграции. Именно понимание того, как устроен DOM и как работает каскад в CSS, позволяет вам уверенно управлять нейросетью и создавать проекты любой сложности.