Финальный проект: лендинг с нуля
От макета к коду: порядок работы, структура файлов, именование классов, проверка по чек-листу и публикация на GitHub Pages.
Что ты научишься делать
- Разложишь любой макет на блоки и поймёшь, с чего начинать
- Соберёшь лендинг по чек-листу из двадцати пунктов
- Выложишь свой сайт в интернет и получишь на него ссылку
#С чего начинается вёрстка
Открыть макет и начать писать первый тег — плохая идея. Сначала пять минут на разбор, потом код: так получается быстрее.
Раздели страницу на секции
Обычно их пять-семь: шапка, первый экран, преимущества, отзывы, цены, форма, подвал. Каждая —
sectionс заголовком.Найди повторяющиеся элементы
Карточка преимущества, карточка тарифа, кнопка, поле формы. Это компоненты: свёрстаешь один раз, применишь везде.
Определи, где какая раскладка
Ряд элементов — флекс. Сетка карточек или раскладка страницы — грид. Отметь прямо на макете.
Собери палитру и шрифты
Выпиши цвета и размеры в переменные
:rootещё до первой строки вёрстки. Потом не придётся переделывать.Напиши разметку целиком, без стилей
Сначала весь HTML — семантичный, с заголовками по уровням. Проверь, читается ли страница без CSS.
Стилизуй сверху вниз
Сначала базовые стили и типографика, потом секция за секцией. Не прыгай между блоками.
#Структура файлов
my-landing/ index.html styles/ style.css images/ logo.svg hero.webp favicon.svg README.mdОдин файл стилей на лендинг — нормально. Внутри держи порядок и разделяй секции комментариями: переменные, сброс, типографика, компоненты, секции, медиазапросы.
/* ===== Переменные ===== */: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/название. Ничего устанавливать не нужно — всё делается в браузере.
Заведи аккаунт на github.com
Бесплатный. Имя пользователя попадёт в адрес сайта — выбери что-то приличное.
Создай репозиторий
Кнопка New repository. Назови, например,
my-landing, поставь галочку Public.Загрузи файлы
На странице репозитория: Add file → Upload files. Перетащи
index.html, папку со стилями и картинками. Нажми Commit changes.Включи Pages
Settings → Pages. В разделе Branch выбери
mainи папку/ (root), нажми Save.Подожди минуту
Обнови страницу настроек — вверху появится ссылка на твой сайт. Первая сборка занимает до пары минут.
Проверь на телефоне
Открой ссылку с телефона. Это и есть настоящая проверка: на реальном устройстве, а не в эмуляторе.
#Что учить дальше
HTML и CSS ты знаешь. Этого достаточно, чтобы верстать настоящие сайты — и уже брать за это деньги. Дальше есть три направления.
- JavaScript. Всё, что должно реагировать: меню-гамбургер, слайдер, отправка формы без перезагрузки, поиск по странице. Курс появится здесь же, отдельным разделом, и прогресс будет считаться так же.
- Инструменты. Git для хранения истории проекта, препроцессоры и сборщики, готовые системы вёрстки.
- Глубина в CSS. Анимации по прокрутке, вложенность, слои каскада, современные функции цвета. Спецификация растёт каждый год.
Где спотыкаются почти все
Вёрстка начинается со стилей
Почему Пока структура не готова, стили приходится переписывать при каждом изменении разметки.
Как надо Сначала весь HTML целиком, потом CSS сверху вниз.
Каждая секция верстается по-своему
Почему Получается пять разных кнопок и три вида карточек. Файл разрастается, правки становятся дорогими.
Как надо Выдели компоненты заранее и переиспользуй классы.
Адаптив оставлен на потом
Почему Переделывать готовую десктопную вёрстку под мобильную дольше, чем сразу писать mobile-first.
Как надо Проверяй узкий экран с самого начала, а не в конце.
Проект не выложен в интернет
Почему Сайт на диске нельзя показать, а без ссылки нет ни обратной связи, ни портфолио.
Как надо Публикуй сразу, ещё не доделав. GitHub Pages обновляется при каждой загрузке файлов.
- Лендинг landing page
- Одностраничный сайт, ведущий человека к одному действию.
- Компонент component
- Повторяющийся кусок интерфейса со своими стилями: карточка, кнопка, поле.
- Репозиторий repository
- Хранилище файлов проекта с историей изменений.
- GitHub Pages GitHub Pages
- Бесплатный хостинг статических сайтов прямо из репозитория.
- Прогрессивное улучшение progressive enhancement
- Подход, при котором базовая версия работает везде, а современные возможности добавляются сверху.
Проверь себя
Пять минут на разбор экономят часы переделок. Структура сначала, оформление потом.
Два подчёркивания отделяют элемент от блока. Вкладывать элементы в имена не нужно: глубину знает разметка.
Windows и macOS не различают регистр, сервер — различает. <code>Logo.svg</code> и <code>logo.svg</code> для него разные файлы.
Валидатор проверяет соответствие разметки стандарту. Контраст и скорость смотрят другими инструментами.
Инструменты разработчика показывают все стили любого сайта. Это самый быстрый способ учиться дальше.
Задание
Первый экран лендинга
Собери первый экран по требованиям:
- семантичная разметка:
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; }
Показать решение
<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>: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);}