25 Модуль 5 Живой современный сайт 18 мин урок 25 из 25

Финальный проект: лендинг с нуля

От макета к коду: порядок работы, структура файлов, именование классов, проверка по чек-листу и публикация на GitHub Pages.

Что ты научишься делать

  • Разложишь любой макет на блоки и поймёшь, с чего начинать
  • Соберёшь лендинг по чек-листу из двадцати пунктов
  • Выложишь свой сайт в интернет и получишь на него ссылку

#С чего начинается вёрстка

Открыть макет и начать писать первый тег — плохая идея. Сначала пять минут на разбор, потом код: так получается быстрее.

  1. Раздели страницу на секции

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

  2. Найди повторяющиеся элементы

    Карточка преимущества, карточка тарифа, кнопка, поле формы. Это компоненты: свёрстаешь один раз, применишь везде.

  3. Определи, где какая раскладка

    Ряд элементов — флекс. Сетка карточек или раскладка страницы — грид. Отметь прямо на макете.

  4. Собери палитру и шрифты

    Выпиши цвета и размеры в переменные :root ещё до первой строки вёрстки. Потом не придётся переделывать.

  5. Напиши разметку целиком, без стилей

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

  6. Стилизуй сверху вниз

    Сначала базовые стили и типографика, потом секция за секцией. Не прыгай между блоками.

#Структура файлов

HTMLДостаточно для лендинга
my-landing/  index.html  styles/    style.css  images/    logo.svg    hero.webp  favicon.svg  README.md

Один файл стилей на лендинг — нормально. Внутри держи порядок и разделяй секции комментариями: переменные, сброс, типографика, компоненты, секции, медиазапросы.

CSSСкелет файла стилей
/* ===== Переменные ===== */:root {  --accent: #6544e0;  --text: #16181d;  --bg: #ffffff;  --radius: 14px;  --gap: 1.5rem;}/* ===== Сброс и база ===== */*, *::before, *::after { box-sizing: border-box; }body { margin: 0; font-family:; line-height: 1.7; }/* ===== Компоненты ===== */.btn {}.card {}/* ===== Секции ===== */.hero {}.features {}/* ===== Адаптив ===== */@media (min-width: 700px) {}

#Именование классов

Мы говорили про BEM в девятом уроке. На практике достаточно трёх правил.

  • Блок — самостоятельная штука: card, hero, btn.
  • Элемент — часть блока, через два подчёркивания: card__title.
  • Модификатор — вариант, через два дефиса: btn--ghost.

Главное — не вкладывать элементы друг в друга в именах. card__body__title — плохо, достаточно card__title: блок один, а на какой глубине лежит элемент, знает разметка.

#Что должно быть в лендинге

Каркас лендинга — начни отсюда
В песочницу

#Чек-лист из двадцати пунктов

Проверка перед публикацией

#Публикация на GitHub Pages

Бесплатно, за десять минут, с настоящим адресом вида имя.github.io/название. Ничего устанавливать не нужно — всё делается в браузере.

  1. Заведи аккаунт на github.com

    Бесплатный. Имя пользователя попадёт в адрес сайта — выбери что-то приличное.

  2. Создай репозиторий

    Кнопка New repository. Назови, например, my-landing, поставь галочку Public.

  3. Загрузи файлы

    На странице репозитория: Add file → Upload files. Перетащи index.html, папку со стилями и картинками. Нажми Commit changes.

  4. Включи Pages

    Settings → Pages. В разделе Branch выбери main и папку / (root), нажми Save.

  5. Подожди минуту

    Обнови страницу настроек — вверху появится ссылка на твой сайт. Первая сборка занимает до пары минут.

  6. Проверь на телефоне

    Открой ссылку с телефона. Это и есть настоящая проверка: на реальном устройстве, а не в эмуляторе.

#Что учить дальше

HTML и CSS ты знаешь. Этого достаточно, чтобы верстать настоящие сайты — и уже брать за это деньги. Дальше есть три направления.

  • JavaScript. Всё, что должно реагировать: меню-гамбургер, слайдер, отправка формы без перезагрузки, поиск по странице. Курс появится здесь же, отдельным разделом, и прогресс будет считаться так же.
  • Инструменты. Git для хранения истории проекта, препроцессоры и сборщики, готовые системы вёрстки.
  • Глубина в CSS. Анимации по прокрутке, вложенность, слои каскада, современные функции цвета. Спецификация растёт каждый год.

Где спотыкаются почти все

Вёрстка начинается со стилей

Почему Пока структура не готова, стили приходится переписывать при каждом изменении разметки.

Как надо Сначала весь HTML целиком, потом CSS сверху вниз.

Каждая секция верстается по-своему

Почему Получается пять разных кнопок и три вида карточек. Файл разрастается, правки становятся дорогими.

Как надо Выдели компоненты заранее и переиспользуй классы.

Адаптив оставлен на потом

Почему Переделывать готовую десктопную вёрстку под мобильную дольше, чем сразу писать mobile-first.

Как надо Проверяй узкий экран с самого начала, а не в конце.

Проект не выложен в интернет

Почему Сайт на диске нельзя показать, а без ссылки нет ни обратной связи, ни портфолио.

Как надо Публикуй сразу, ещё не доделав. GitHub Pages обновляется при каждой загрузке файлов.

Лендинг landing page
Одностраничный сайт, ведущий человека к одному действию.
Компонент component
Повторяющийся кусок интерфейса со своими стилями: карточка, кнопка, поле.
Репозиторий repository
Хранилище файлов проекта с историей изменений.
GitHub Pages GitHub Pages
Бесплатный хостинг статических сайтов прямо из репозитория.
Прогрессивное улучшение progressive enhancement
Подход, при котором базовая версия работает везде, а современные возможности добавляются сверху.

Проверь себя

  1. С чего начинать вёрстку макета?

    Пять минут на разбор экономят часы переделок. Структура сначала, оформление потом.

  2. Как правильно назвать заголовок внутри блока card по BEM?

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

  3. Почему на GitHub Pages пропадают картинки, которые открывались локально?

    Windows и macOS не различают регистр, сервер — различает. <code>Logo.svg</code> и <code>logo.svg</code> для него разные файлы.

  4. Что из чек-листа проверяется валидатором W3C?

    Валидатор проверяет соответствие разметки стандарту. Контраст и скорость смотрят другими инструментами.

  5. Что стоит делать, когда застрял на непонятном эффекте с чужого сайта?

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

Задание

Первый экран лендинга

Собери первый экран по требованиям:

  • семантичная разметка: header с nav, main, внутри section с классом hero;
  • ровно один h1;
  • кнопка-ссылка с классом btn, у неё есть переход и состояние :hover;
  • палитра вынесена в переменные :root;
  • включён box-sizing: border-box;
  • размер заголовка задан через clamp();
  • ни одного !important.
Открыть в песочнице
    Подсказка 1

    Начни с разметки: <main><section class="hero"><h1>…</h1><p>…</p><a class="btn" href="#">…</a></section></main>

    Подсказка 2

    Переменные: :root { --accent: #6544e0; --text: #16181d; --muted: #5b6070; }

    Подсказка 3

    Заголовок: h1 { font-size: clamp(1.6rem, 1.2rem + 3vw, 2.8rem); line-height: 1.15; }

    Показать решение
    HTMLindex.html
    <header class="header">  <a class="header__logo" href="#">Полка</a>  <nav class="header__nav">    <a href="#about">О нас</a>    <a href="#menu">Меню</a>  </nav></header><main>  <section class="hero">    <h1 class="hero__title">Кофе, ради которого стоит выйти из дома</h1>    <p class="hero__lead">Свежая обжарка каждую неделю. Тихо, светло, есть розетки.</p>    <a class="btn" href="#form">Забронировать столик</a>  </section></main>
    CSSstyle.css
    :root {  --accent: #6544e0;  --text: #16181d;  --muted: #5b6070;  --radius: 14px;}*, *::before, *::after { box-sizing: border-box; }body {  margin: 0;  font-family: system-ui, sans-serif;  line-height: 1.7;  color: var(--text);}.header {  display: flex;  align-items: center;  gap: 20px;  padding: 14px 20px;  border-bottom: 1px solid #eee;}.header__logo { font-weight: 700; color: var(--text); text-decoration: none; }.header__nav { display: flex; gap: 16px; margin-left: auto; font-size: 14px; }.header__nav a { color: var(--muted); text-decoration: none; }.hero {  padding: 48px 20px;  text-align: center;}.hero__title {  max-width: 16ch;  margin: 0 auto 12px;  font-size: clamp(1.6rem, 1.2rem + 3vw, 2.8rem);  line-height: 1.15;}.hero__lead {  max-width: 44ch;  margin: 0 auto 24px;  color: var(--muted);}.btn {  display: inline-block;  padding: 14px 28px;  color: #fff;  background: var(--accent);  border-radius: 999px;  text-decoration: none;  transition: transform 180ms ease-out, box-shadow 180ms ease-out;}.btn:hover {  transform: translateY(-2px);  box-shadow: 0 12px 24px -12px var(--accent);}