Вы просите агента поправить страницу, и в простом проекте появляются файлы с непонятными именами: index.html, style.css, script.js. Или они уже были, а в отчёте агента написано "поменял стили" - и по этой фразе непонятно, что именно он трогал.

Разберём три базовые технологии, которые получает браузер: HTML, CSS и JavaScript. Для наглядности возьмём простую статическую страницу без сборки. В реальном репозитории файлы могут называться и лежать иначе, поэтому перед правкой полезно попросить агента показать структуру проекта и найти файлы, отвечающие за нужный элемент. Верстать руками статья не учит, для этого у вас есть агент.

Страница это текст, который читает браузер

Начнём с простой статической страницы: её исходники - обычные текстовые файлы. Их можно открыть блокнотом и прочитать глазами. Дополнительная сборка здесь не нужна: браузер читает HTML, загружает связанные ресурсы и по ним рисует страницу на экране.

Отправной точкой такого проекта обычно служит файл index.html. Браузер открывает его, разбирает разметку и по ссылкам загружает стили, скрипты, картинки и шрифты.

Браузер читает три файла простого статического проекта и показывает готовую страницуindex.htmlstyle.cssscript.jsБраузерГотовая страница
Так может быть устроен простой статический проект: браузер загружает три связанных файла и показывает страницу

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

Для нашего простого примера возьмём три файла с разными ролями:

  • HTML - что на странице есть: заголовок, абзац, кнопка, картинка;
  • CSS - как это выглядит: цвета, шрифты, отступы, скругления, плавность;
  • JavaScript - что происходит: по клику, по вводу текста, по таймеру.

Дальше по одному.

HTML: из чего состоит разметка

HTML это разметка, а не рисование. Вы не описываете, как выглядит кнопка. Вы говорите "здесь кнопка" - и браузер рисует её сам, как умеет.

Основная единица разметки - тег. Почти всегда их два: открывающий и закрывающий, а между ними содержимое.

Строка button Играть разобрана на три части: открывающий тег, содержимое и закрывающий тег, а всё вместе подписано как HTML-элемент<button>Играть</button>HTML-элементоткрывающий тегзакрывающий тегсодержимое
В этом примере три части вместе образуют один элемент страницы

У каждой части своё имя, а всё вместе называется элементом. Слово пригодится: про страницу чаще говорят "элемент", имея в виду тег вместе с тем, что внутри.

Имена тегов - сокращения от английских слов: p от paragraph, a от anchor, img от image. Учить их наизусть незачем, но догадаться, за что отвечает незнакомый тег, это обычно помогает.

Закрывающий тег отличается косой чертой. Есть и элементы без закрывающего тега. Например, <img> не может содержать текст или вложенные теги, а адрес картинки получает через атрибут src.

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

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

<a href="https://example.com">Открыть сайт</a>
<img src="cover.png" alt="Обложка">
<button id="play" class="btn">Играть</button>

Атрибут class из последней строки пригодится через две минуты: по нему к кнопке применятся стили. Атрибут id="play" даёт ей уникальное имя, по которому кнопку найдёт скрипт.

Теперь целая страница. Она короче, чем можно подумать:

<!doctype html>
<html>
<head>
  <title>Моя страница</title>
</head>
<body>
  <h1>Первая страница</h1>
  <p>Обычный абзац текста.</p>
  <button id="play" class="btn">Играть</button>
</body>
</html>

Две части: <head> - служебная, туда идут заголовок вкладки и ссылки на стили; <body> - всё, что читатель видит на экране. Первая строка просто сообщает браузеру, что перед ним современный HTML.

Вложенность страницы: внутри html лежат head с заголовком вкладки и body со всем, что видно на экране<html></html><head></head><body></body><title>Моя страница</title><h1>, <p>, <button>, <img>
Коробка в коробке: head и body лежат внутри html, а всё остальное внутри них

Схема показывает главное свойство разметки: на странице всё лежит внутри чего-то. <body> внутри <html>, кнопка внутри <body>, текст внутри кнопки. Отсюда и лесенка отступов в файле: она не для красоты, а показывает, что во что вложено.

Практический вывод простой. Заголовок вкладки браузера и подключение стилей живут в <head>, и на экране их не видно вообще. Всё остальное - в <body>. Когда агент в отчёте пишет "добавил блок в body", это ровно про вторую коробку: новое встало на страницу, а не в служебную часть.

Тегов в языке больше сотни, но в реальной странице почти всегда крутятся одни и те же:

ТегЧто делает
<h1> ... <h6>заголовки, от главного к самым мелким
<p>абзац текста
<a>ссылка, адрес лежит в атрибуте href
<img>картинка, путь к файлу в атрибуте src
<button>кнопка
<ul> и <li>список и пункт списка
<div>блок-контейнер, коробка для других элементов
<span>кусочек текста внутри строки, чтобы выделить его отдельно

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

CSS: как страница получает вид

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

CSS состоит из правил. Правило это ответ на два вопроса: к чему применяем и что меняем.

.btn {
  background: #6c5ce7;    /* цвет фона */
  color: #ffffff;         /* цвет текста */
  padding: 12px 24px;     /* внутренние отступы */
  border-radius: 12px;    /* скругление углов */
}

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

Точка перед btn означает класс. Помните атрибут class="btn" у кнопки? Вот он и сработал: в разметке вы вешаете на элемент метку, а в стилях обращаетесь к ней. Одну метку можно повесить на десять кнопок - и все десять станут одинаковыми от одного правила.

Свойств в CSS сотни, но чтобы читать чужой файл и понимать, что там происходит, хватит нескольких:

  • color - цвет текста, background - цвет или картинка фона;
  • font-size и font-family - размер и гарнитура шрифта;
  • padding - отступ внутри элемента, margin - снаружи, между соседями;
  • border-radius - скругление углов, оно же половина ощущения "дорого";
  • transition - плавность: не прыжком, а за 0.2 секунды.

Чаще всего правила лежат в отдельном файле, а страница узнаёт о нём из одной строчки в служебной части:

<head>
  <link rel="stylesheet" href="style.css">
</head>

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

Одна и та же разметка дважды: слева без стилей, текст и серая прямоугольная кнопка, справа те же элементы с отступами, цветом и скруглёнными угламиТолько HTMLHTML плюс CSS
Элементы те же самые и в том же порядке. Изменились только цвет, отступы и форма

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

Это карта поиска, а не техническая стена. Для нового расположения агенту иногда нужно изменить классы или контейнеры в HTML, а неудачное CSS-правило может перекрыть кнопку и помешать клику. Поэтому после визуальной правки смотрят diff, открывают страницу и проверяют затронутые действия.

JavaScript: что происходит по действию

HTML и CSS уже умеют показать страницу и добавить ей плавные переходы или анимацию. Но у кнопки из нашего примера пока нет собственного действия: нажимаем - счёт не меняется.

Произвольную логику на странице обычно добавляет JavaScript. Кнопка уже получила в HTML уникальное имя id="play". Теперь схема простая: найти элемент, дождаться события, что-то изменить.

// находим кнопку по её id
const button = document.getElementById("play");
let score = 0;

// подписываемся на событие: что делать по клику
button.addEventListener("click", function () {
  score = score + 1;
  button.textContent = "Очки: " + score;
});

Первый клик меняет надпись на "Очки: 1", второй - на "Очки: 2". Если ничего не происходит, сначала проверьте, что в HTML написано id="play", а в скрипте - то же имя play.

Здесь три детали. const и let заводят переменную - именованную коробку со значением. addEventListener подписывает страницу на событие: клик, ввод текста, наведение мыши. А внутри фигурных скобок лежит функция - кусок кода, который выполнится, когда событие произойдёт.

Обратите внимание на последнюю строку: скрипт меняет текст кнопки. Это важный момент - JavaScript умеет менять и разметку, и стили прямо во время работы страницы. Он может добавить абзац, спрятать блок, перекрасить кнопку. Поэтому граница между слоями - не стена, а разделение труда.

На практике начинайте поиск в JavaScript, если элемент реагирует на данные, обрабатывает клик или что-то считает. Плавное появление, смену цвета и простое движение часто делает CSS. Это отправная точка, а не окончательный диагноз: после правки откройте страницу и сами проверьте внешний вид и действия - одного скриншота недостаточно.

Одна кнопка в трёх файлах

Соберём всё на одном элементе. Кнопка "Играть" живёт сразу в трёх файлах, и каждый отвечает за своё.

<button id="play" class="btn">Играть</button>
.btn {
  background: #6c5ce7;
  border-radius: 12px;
}
const playButton = document.getElementById("play");

playButton.addEventListener("click", function () {
  playButton.textContent = "Игра запущена";
});

Если файлы подключены, клик меняет надпись "Играть" на "Игра запущена". Теперь пример можно проверить, не придумывая отсутствующую функцию.

А теперь самое полезное - что будет, если убрать по одной строке:

  • убрали HTML - исчезло всё: стилизовать и оживлять больше нечего;
  • убрали CSS - кнопка на месте и работает, просто выглядит как системная серая кнопка из девяностых;
  • убрали JS - кнопка красивая, но мёртвая. Нажимается, и ничего не происходит.

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

Что лежит в папке проекта

Самый частый набор для простой страницы выглядит так:

index.html    разметка, точка входа
style.css     стили
script.js     поведение

Связаны они двумя строчками в разметке. Стили подключаются в служебной части, скрипт - в самом конце, перед закрытием </body>, чтобы к моменту его запуска все элементы уже существовали:

<head>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <!-- разметка страницы -->
  <script src="script.js"></script>
</body>

Бывает и иначе. В большом проекте файлов десятки, они разложены по папкам вроде css/ и js/, а рядом лежат картинки и шрифты. Бывает и наоборот, когда файл всего один, - про этот случай сразу ниже. Роли разметки, стилей и логики всё равно остаются, но имена файлов и способ их подключения могут отличаться.

Когда стили и скрипты лежат внутри страницы

Три файла - расклад самый частый, но не единственный. Один и тот же CSS можно положить в три разных места, и все три вам рано или поздно попадутся.

Первое вы уже видели: отдельный файл плюс строчка <link>. Второе - блок <style> прямо в разметке, без отдельного файла:

<head>
  <style>
    .btn {
      background: #6c5ce7;
      border-radius: 12px;
    }
  </style>
</head>

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

Третье место - встроенные стили, они же inline styles. Свойства висят прямо на элементе, в атрибуте style:

<button class="btn" style="background: #e17055; font-size: 20px">Играть</button>

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

Удобно это ровно один раз. Дальше начинаются минусы. Правило действует на один-единственный элемент: десять кнопок - десять копий, и менять потом придётся все десять. Обычный встроенный стиль обычно имеет приоритет над обычным правилом из файла. Покрасили кнопку через style, потом правите то же свойство в style.css и не понимаете, почему цвет не меняется. Поэтому атрибут style проверяют одним из первых; подробные правила приоритетов пока не нужны.

Со скриптом та же история, только мест два. Отдельный файл подключается через <script src="...">, а можно написать код прямо между тегами:

<script>
  document.getElementById("play").addEventListener("click", function () {
    alert("Игра запущена");
  });
</script>

Сведём в одну табличку, чтобы было где подсмотреть:

ЧтоГде лежитКак выглядит в HTML
стилиотдельный файл<link rel="stylesheet" href="style.css">
стилиблок в самой странице<style> ... </style>
стилипрямо на элементеstyle="color: red"
скриптотдельный файл<script src="script.js"></script>
скриптблок в самой странице<script> ... </script>

Крайний случай - когда сложено вообще всё: разметка, блок <style> и блок <script> живут в одном index.html. Ничего страшного тут нет, для небольшой страницы так даже проще: файл один, открыл в браузере и работает, ничего не потеряется по дороге. Неудобства начинаются позже, когда страница разрастается и в этой простыне надо что-то найти. Тогда содержимое обычно растаскивают по файлам, и получается та самая тройка.

Прежде чем просить агента "поменять стили", выясните, где они лежат. Если в проекте один index.html, файла style.css может не быть, и правка окажется внутри разметки. Если элемент не меняется, попросите проверить три вещи: подключён ли нужный файл стилей, подходит ли селектор и нет ли встроенного style или более сильного правила. Так поиск сужается без догадки о виновнике.

Как это работает в связке с Claude Code

Теперь понятно, что происходит, когда агент берётся за страницу:

  • в простом статическом проекте агент может сам написать и связать HTML, CSS и JavaScript. В другом проекте сначала попросите его показать структуру и назвать файлы, отвечающие за нужный элемент;
  • что именно видно до записи, зависит от настроек и режима работы. Если агент показывает предложение заранее, просмотрите его; после записи в любом случае изучите diff и итоговые файлы. Имя style.css подсказывает роль файла, но ещё ничего не гарантирует;
  • визуальную правку проверяйте глазами и кликом по затронутым элементам, правку поведения - реальными действиями. Скриншот не покажет, что счётчик перестал считать;
  • если что-то сломалось, описывайте наблюдаемый симптом, а не угаданный слой: "после правки кнопка видна, но клик ничего не делает". Тогда агент проверит связи между HTML, CSS и JavaScript.