16. offer.html — коммерческое предложение
Самая крупная страница сайта. По скелету — та же схема, что у предыдущих: partials, SSI-инклюды, кнопка «Наверх», два скрипта. Отличие — шесть смысловых разделов внутри одной секции и использование классов, которых больше нигде нет.
Появляется Секция 10 в style.css — она обслуживает только эту страницу. Новые классы: .price-grid, .price-item, .price-amount, .price-note, .legal-note. Ни на одной другой странице сайта они не используются.
Уникальные мета
offer.html — уникальные мета<title>Коммерческое предложение – Ефимов Андрей Михайлович</title>
<meta name="description" content="Комплексное коммерческое предложение по оцифровке службы безопасности, аудиту и внедрению регламентов." />
<meta property="og:title" content="Коммерческое предложение – Ефимов Андрей Михайлович" />
<meta property="og:description" content="Комплексное предложение по оцифровке службы безопасности, аудиту и внедрению регламентов." />
<meta property="og:url" content="https://secserpr.ru/offer.html" />
Технические детали:
- title и og:title совпадают полностью.
- description и og:description отличаются: у og-версии отброшено слово «коммерческое». Это второе расхождение между обычными и og-мета на сайте (первое — на
about.html). - og:url —
https://secserpr.ru/offer.html. - meta robots отсутствует — страница индексируется.
Скелет страницы
Между header и footer — одна секция. Но внутри неё шесть смысловых блоков, каждый со своим h3.section-subtitle, плюс тарифы и юридическая оговорка.
<body>
<div class="container">
<header class="header">
SSI: header.html
SSI: nav.html
</header>
<section>
h2 Коммерческое предложение
p.text-block (вступление)
h3.section-subtitle 1. Проблемы
p.text-block
ul
h3.section-subtitle 2. Мой подход
p.text-block
div.highlight-box
h3.section-subtitle 3. Состав работ
ul (шесть этапов)
h3.section-subtitle 4. Стоимость
p.text-block
div.grid-3.price-grid
div.card.price-item × 3
p.price-note
h3.section-subtitle 5. Мои преимущества
ul
h3.section-subtitle 6. Условия сотрудничества
ul
div.cta-block
div.legal-note
p
</section>
SSI: footer.html
</div>
button#scrollToTopBtn
script.js
scroll-top.js
</body>
Заголовок и вступление
offer.html — начало секции<section>
<h2>Коммерческое предложение</h2>
<p class="text-block">
Уважаемый клиент, предлагаю вам комплексное решение...
</p>
h2 без класса — стили из правила для тега. p.text-block — вступление с красной строкой. Тот же приём, что на всех предыдущих страницах.
Разделы 1–3: подзаголовки и выноска
Каждый раздел открывается h3.section-subtitle. Это единый визуальный маркер: синяя полоса слева, единый размер. Шесть раз подряд.
<h3 class="section-subtitle">1. Проблемы, которые я решаю</h3>
<p class="text-block">В современных условиях бизнес сталкивается...</p>
<ul>
<li><strong>Риски экономической безопасности</strong> – ...</li>
...
</ul>
Структура повторяется для разделов 2, 3, 5 и 6. Технически это пять одинаковых каркасов внутри одной секции. Никаких дополнительных классов — используются уже описанные .section-subtitle, .text-block, ul, li, strong.
Особняком стоит раздел 2 — там после вводного абзаца идёт выноска:
offer.html — раздел 2, выноска<div class="highlight-box">
<p><strong>Ключевая особенность:</strong>
Вы получаете не набор бумажных инструкций, а
<strong>работающую экосистему</strong>, ...</p>
</div>
.highlight-box уже знаком по about.html. Здесь он выполняет ту же роль — смысловой акцент внутри секции. Обратите внимание: внутри выноски два тега strong: первый — метка «Ключевая особенность:», второй — выделение фразы «работающую экосистему» в середине текста.
Раздел 4: тарифы — сердце страницы
Это единственное место, где применяется Секция 10 из style.css. Разбираем подробно.
Обёртка .grid-3.price-grid
offer.html — тарифная сетка
<div class="grid-3 price-grid">
<div class="card price-item">...</div>
<div class="card price-item">...</div>
<div class="card price-item">...</div>
</div>
Два класса через пробел: .grid-3 и .price-grid. Первый даёт раскладку (три колонки из Секции 4), второй — только отступы:
.price-grid { margin: 20px 0 25px 0; }
Зачем нужен отдельный класс для одной строчки? Потому что .grid-3 — общий, его margin-top: 15px одинаков для всех сеток. А тарифной сетке нужны другие отступы: сверху 20, снизу 25. Переопределяем через отдельный класс.
Карточка тарифа .card.price-item
offer.html — одна карточка тарифа
<div class="card price-item">
<h4>Базовый<br />(Стандарт)</h4>
<p class="price-amount">2,5 – 3,5 млн ₽</p>
<ul>
<li>Экспресс-аудит</li>
<li>Типовой сайт-портал</li>
<li>Готовые регламенты</li>
<li>Базовая настройка</li>
</ul>
</div>
Снова два класса: .card (общий стиль карточки из Секции 4) и .price-item (модификатор).
.price-item {
text-align: center;
}
.price-item h4 {
margin-bottom: 8px;
}
.price-item ul {
text-align: left;
padding-left: 20px;
margin-top: 10px;
}
Что здесь происходит технически:
- text-align: center — вся карточка центрируется. Заголовок и ценник встают по центру.
- .price-item h4 { margin-bottom: 8px } — сжимаем отступ под заголовком. По умолчанию
h4имеетmargin: 15px 0 5px 0, но нам нужен плотный блок. - .price-item ul { text-align: left } — переопределяем центрирование для списка. Список фич читается лучше с выравниванием влево. Заголовок и цена — по центру, список — по левому краю. Разная логика для разных элементов.
- .price-item ul { padding-left: 20px } — уменьшаем стандартный
padding-left: 25pxуul, чтобы список внутри карточки не «съезжал» вправо.
Мы не создаём новый класс для списка внутри тарифа. Мы пишем селектор .price-item ul — «все ul внутри price-item». Так работают каскады: общий стиль задан для ul, но внутри конкретного контекста мы его уточняем. Это одна из сильных сторон CSS.
Заголовок тарифа
<h4>Базовый<br />(Стандарт)</h4>
Внутри h4 — тег br. Он переносит строку между названием тарифа и его типом. Визуально получается:
Базовый
(Стандарт)
Без br было бы «Базовый (Стандарт)» одной строкой — не так читаемо в узкой колонке.
Ценник .price-amount
style.css — .price-amount
.price-amount {
font-weight: 700;
font-size: 1.3rem;
color: #0b1a2b;
background: #e7eff7;
display: inline-block;
padding: 4px 16px;
border-radius: 20px;
margin: 8px 0;
}
Технические детали:
- font-weight: 700 — самый жирный текст на странице. Ценник должен бросаться в глаза.
- background + border-radius: 20px — тот же приём «капсулы», что у
.badgeвabout.htmlи у.post-categoryв блоге. Единый язык бренда. - display: inline-block — элемент ведёт себя как строчный (стоит в потоке текста), но можно задавать
paddingсверху-снизу. Обычныйinlineне даёт этого. - margin: 8px 0 — небольшие отступы сверху и снизу. Ценник «отбит» от заголовка и от списка.
Обратите внимание: .price-amount — это p. Технически ценник не абзац, а выделенная строка. Но p с классом — обычный приём для такой роли. Использование span тоже подошло бы, но p даёт блочную обёртку без лишних тегов.
Примечание под тарифами .price-note
offer.html — примечание
<p class="price-note">
* Точная стоимость определяется после предварительного
анализа и утверждения технического задания.
Возможна поэтапная оплата.
</p>
style.css — .price-note
.price-note {
font-size: 0.95rem;
color: #4d6885;
text-align: justify;
text-indent: 1.5em;
margin-top: 10px;
}
Мелкий текст приглушённого цвета. Стилистически — как .text-block, но с уменьшенным размером и margin-top: 10px (не 0.8em). Звёздочка в начале текста — просто символ, не разметка сноски.
Юридическая оговорка .legal-note
Финальный блок страницы. Отделён горизонтальной линией и содержит юридически важный текст.
offer.html — юр. оговорка<div class="legal-note">
<p>
Настоящее коммерческое предложение носит информационный
характер и не является офертой...
</p>
</div>
style.css — .legal-note
.legal-note {
margin-top: 30px;
padding-top: 20px;
border-top: 1px solid #dce5ef;
font-size: 0.95rem;
color: #4d6885;
}
.legal-note p {
text-align: justify;
text-indent: 1.5em;
margin: 0;
}
Технические детали:
- border-top: 1px solid #dce5ef — тонкая линия-разделитель над блоком. Визуально отделяет юридическую часть от коммерческой.
- margin-top: 30px + padding-top: 20px — двойной отступ: 30 до линии, 20 после. Тот же приём, что у футера.
- .legal-note p { margin: 0 } — снимаем нижний отступ у единственного абзаца внутри блока. Без него был бы лишний «хвост» внизу.
- text-indent: 1.5em — красная строка. Юридический текст оформлен как обычный абзац книги.
section
Юридическая оговорка — это div.legal-note, не section. Причина: это часть той же секции «Коммерческое предложение», а не отдельный смысловой блок. Если бы завернули в section, она получила бы белую подложку, скругление и тень — визуально «выпрыгнула» бы из основной секции.
CTA-блок перед оговоркой
offer.html — CTA<div class="cta-block">
<strong>Готовы обсудить ваш проект?</strong><br />
Свяжитесь со мной для получения детального расчёта...
</div>
Тот же .cta-block, что на главной и на «Услугах». Стили не менялись. Обратите внимание на порядок: CTA стоит до юридической оговорки. Логика — сначала призыв, потом мелкий шрифт.
Сравнение по классам
Все страницы сайта по классам index services about projects offer
------------------------ ----- -------- ----- -------- -----
секций 3 1 2 1 1
.grid-2 - + - - -
.grid-3 - - - + +
.grid-4 - - + - -
.card - + + + +
.card .badge - - + - -
.price-grid / .price-item - - - - +
.price-amount - - - - +
.price-note - - - - +
.legal-note - - - - +
.highlight-box - - + - +
.cta-block + + - - +
.section-subtitle + - + - + (× 6)
.hero-title + - - - -
.text-block + + + + +
Что видно из таблицы:
- По числу секций —
offer.htmlближе кservices.htmlиprojects.html: одна секция. Но внутри неё — самый богатый набор блоков. - По
.section-subtitle— рекорд: шесть раз. Наindex.htmlон один, наabout.htmlодин, здесь — шесть. - Секция 10 в style.css обслуживает только эту страницу. Если
offer.htmlкогда-нибудь уедет в архив — Секция 10 тоже станет «мёртвым» кодом. - Единственная страница, где одновременно используются
.highlight-box,.cta-blockи.legal-note.
Итог
- Скелет — как у эталона: partials, SSI-инклюды, кнопка «Наверх», два скрипта.
- Уникальные мета — пять строк. Расхождение между
descriptionиog:description. - Одна секция с шестью смысловыми блоками внутри.
- Шесть раз используется
h3.section-subtitle— рекорд сайта. - Новые классы:
.price-grid,.price-item,.price-amount,.price-note,.legal-note. Все — из Секции 10style.css. - Тарифная сетка —
.grid-3.price-gridс тремя.card.price-item. Техника переопределения:.price-item ul { text-align: left }перебиваетtext-align: centerкарточки. - Юридическая оговорка —
div, неsection. С тонкой линией-разделителем сверху. - CTA стоит до юридической части: сначала призыв, потом мелкий шрифт.
- Адаптив — медиа-запрос переводит
.grid-3в одну колонку.
Следующий раздел — contacts.html. Одна секция, но с двумя колонками: блок «как связаться» и блок «реквизиты». Плюс кликабельные ссылки tel: и mailto:.