Е

Техническое руководство проекта secserpr.ru

Как собирался сайт — по шагам, с кодом и пояснениями
← На сайт
Руководство › Часть II. Стили › 05. Секции 2–3

05. style.css: шапка и общие элементы

Разбираем две следующие секции — 2 (шапка и навигация) и 3 (общие элементы). Здесь появляются те самые «кирпичи» интерфейса, из которых собирается каждая страница: шапка с логотипом, меню, бургер, заголовки, кнопки.

Секция 2: шапка и навигация

Шапка — визитная карточка сайта. Она одинакова на всех страницах, потому что целиком собрана из двух partials (header.html и nav.html). А вот стили для неё живут здесь, в Секции 2.

2.1. Контейнер шапки — .header

style.css — .header
.header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  border-bottom: 4px solid #2b6f9c;
  padding-bottom: 15px;
  margin-bottom: 40px;
  position: relative;
}

Восемь свойств. Разбираем каждое — они тут все важные.

display: flex — включает flexbox. Это режим раскладки, при котором дочерние элементы становятся гибкими: их можно выстроить в строку, развести по краям, выровнять по вертикали. Почти вся современная вёрстка — на flexbox.

align-items: center — выравнивание по поперечной оси. Здесь flex-направление — строка (по умолчанию flex-direction: row), значит поперечная ось — вертикаль. Свойство говорит: «выровняй все элементы по центру по вертикали». Логотип, текст и бургер встанут на одной высоте.

justify-content: space-between — распределение по главной оси (горизонталь). Значение space-between означает: «первый элемент прижми к левому краю, последний — к правому, между остальными раздели пространство поровну».

+----------------------------------------------------+ | [лого] Название Меню1 Меню2 Меню3 ... | | ^ ^ | | прижат к левому прижато к правому | | краю краю | | | | <- space-between распределяет по краям -> | +----------------------------------------------------+

flex-wrap: wrap — разрешение переноса. Если элементы не помещаются в одну строку — они переносятся на следующую. Без этого свойства flex-контейнер пытался бы втиснуть всё в одну строку, сжимая элементы до нечитаемости.

border-bottom: 4px solid #2b6f9c — нижняя граница. Это та самая синяя полоска под шапкой. Свойство — сокращённая запись трёх:

Развёрнутая запись
border-bottom-width: 4px;
border-bottom-style: solid;
border-bottom-color: #2b6f9c;

Читается как «снизу — граница толщиной 4 пикселя, сплошная, цвет — акцентный синий».

padding-bottom: 15px — внутренний отступ снизу. Отодвигает содержимое шапки от синей линии, чтобы логотип не «прилипал» к границе.

margin-bottom: 40px — внешний отступ снизу. Отодвигает следующие секции от шапки. Без этого отступа первая белая секция наехала бы прямо на синюю линию.

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

2.2. Левая группа — .header-left

style.css — .header-left
.header-left {
  display: flex;
  align-items: center;
  gap: 20px;
}

Обёртка вокруг логотипа и текстовой группы. Тоже flex — чтобы логотип и текст выстроились в строку и выровнялись по вертикальному центру.

gap: 20px — расстояние между дочерними элементами. Это современная альтернатива старым трюкам с margin-right у каждого элемента. Одно свойство — и все промежутки одинаковые, без «лишнего» отступа справа у последнего элемента.

Почему gap лучше margin

Старый способ: .header-left > * { margin-right: 20px; } — но тогда справа у последнего элемента тоже 20 пикселей, которые «выпирают». Приходилось писать :last-child { margin-right: 0; }. Свойство gap решает это изящно: промежуток только между элементами.

2.3. Логотип — .header .icon

style.css — .header .icon
.header .icon {
  width: 48px;
  height: 48px;
  flex-shrink: 0;
}

Селектор .header .icon — это не «класс .header .icon» (такого не бывает), а «элемент с классом .icon внутри элемента с классом .header». Читается справа налево: «найди все .icon, у которых есть предок .header».

width: 48px; height: 48px; — размеры квадрата. Логотип-SVG без явных размеров попытался бы занять всю доступную ширину — а нам нужен аккуратный квадрат.

flex-shrink: 0 — запрет на сжатие. По умолчанию flex-элементы могут сжиматься, если места не хватает. Логотип сжиматься не должен — он либо есть в нормальном размере, либо пусть лучше переносится на следующую строку (у нас же flex-wrap: wrap).

2.4. Текстовая группа — .header-text

style.css — .header-text
.header-text h1 {
  font-weight: 700;
  font-size: 1.4rem;
  color: #0b1a2b;
  letter-spacing: -0.5px;
  margin: 0;
}

.header-text .sub {
  font-weight: 300;
  font-size: 0.85rem;
  color: #4d6885;
}

Разбираем два селектора.

.header-text h1 — заголовок первого уровня внутри шапки. Свойства:

.header-text .sub — подзаголовок. Тонкий (300), маленький (0.85rem ≈ 13.6px), приглушённый цвет #4d6885. Визуально «уходит на второй план» — так и должно быть, это пояснение.

2.5. Бургер-кнопка — .burger

style.css — .burger
.burger {
  display: none;
  flex-direction: column;
  gap: 5px;
  background: none;
  border: none;
  cursor: pointer;
  padding: 5px;
  order: 2;
}

.burger span {
  display: block;
  width: 28px;
  height: 3px;
  background: #1a3a5c;
  border-radius: 2px;
  transition: all 0.3s ease;
}

Ключевое здесь — display: none в первой строке. Бургер скрыт по умолчанию. Он показывается только в медиа-запросе для мобильных — это разберём в Секции 9.

Остальные свойства сработают, когда бургер станет видимым:

.burger span — три полоски. Каждая — display: block (то есть занимает свою строку, не пытается встать рядом), ширина 28, высота 3, цвет тёмно-синий, скругление углов 2 пикселя.

transition: all 0.3s ease — плавные переходы. Когда позже бургер превратится в «крестик» (при клике), полоски будут поворачиваться не мгновенно, а за 0.3 секунды. Это приятнее глазу.

Состояние «крестика»:

style.css — .burger.active
.burger.active span:nth-child(1) {
  transform: rotate(45deg) translate(6px, 6px);
}
.burger.active span:nth-child(2) { opacity: 0; }
.burger.active span:nth-child(3) {
  transform: rotate(-45deg) translate(6px, -6px);
}

Класс active добавляет JavaScript при клике. Тогда:

Вместе первые две наклонные полоски образуют «галочку» крестика.

Почему nth-child, а не классы

Можно было бы каждой полоске дать класс .line-1, .line-2, .line-3. Но полоски — чисто декоративные, у них нет семантики. :nth-child(1) — «первый дочерний элемент». Работает без лишних классов в HTML.

2.6. Навигация — .nav и .nav a

style.css — .nav
.nav {
  display: flex;
  gap: 18px;
  flex-wrap: wrap;
  order: 1;
}

Тот же flex, что и в шапке. Расстояние между ссылками — 18 пикселей. flex-wrap: wrap — если ссылки не помещаются в строку, перенесутся. order: 1 — меню стоит раньше бургера (у которого order: 2) в порядке флекс-элементов.

style.css — .nav a
.nav a {
  font-weight: 400;
  font-size: 0.95rem;
  color: #1a3a5c;
  text-decoration: none;
  border-bottom: 2px solid transparent;
  padding-bottom: 4px;
  transition: border 0.2s;
}

.nav a:hover { border-bottom-color: #33ff33; }
.nav a.active {
  border-bottom-color: #33ff33;
  font-weight: 500;
}

Каждая ссылка меню — как «мини-кнопка» с зелёным подчёркиванием при наведении и у активного пункта.

text-decoration: none — убирает стандартное подчёркивание ссылок. Оставили бы — выглядело бы как куча синих подчёркнутых строк.

border-bottom: 2px solid transparent — очень важная деталь. Ссылка получает нижнюю границу толщиной 2 пикселя, но прозрачную. Зачем? Затем, чтобы при наведении сменить только цвет границы, но не её толщину.

Если бы мы не поставили прозрачную границу сейчас, а просто добавили её при ховере — при наведении текст бы «дёрнулся» вниз на 2 пикселя, потому что появился бы новый элемент.

padding-bottom: 4px — расстояние от текста до границы. Без отступа подчёркивание прилипло бы к буквам.

transition: border 0.2s — плавно меняем border, а не all. Точное указание свойства чуть производительнее, чем all. При наведении цвет границы меняется за 0.2 секунды.

И наконец:

Пример: класс active ставится автоматически

В HTML нет ни одного class="active". Его добавляет JavaScript-модуль из script.js — по совпадению location.pathname с href. Так что если вам когда-нибудь попадётся страница, где подсветка активной ссылки не работает — ищите причину в скрипте, а не в CSS.

Секция 3: общие элементы

Это стили, которые работают почти на всех страницах. Секции, заголовки, абзацы, кнопки, CTA-блоки. Именно их использует HTML-разметка внутри каждой страницы.

3.1. Секция section

style.css — section
section {
  margin-bottom: 60px;
  background: #ffffff;
  border-radius: 12px;
  padding: 40px 50px;
  box-shadow: 0 4px 20px rgba(0,0,0,0.05);
}

Пять свойств — и обычный HTML-тег <section> превращается в красивую «карточку».

background: #ffffff — белый фон. На светло-сером фоне сайта (#f5f7fa) белые секции «выделяются» и выглядят как отдельные карточки.

border-radius: 12px — скругление углов радиусом 12 пикселей. Небольшое, но достаточное, чтобы блок не выглядел «брутальным прямоугольником».

padding: 40px 50px — внутренние отступы. Сверху и снизу 40, слева и справа 50. Содержимое не липнет к краям секции, есть «воздух».

box-shadow: 0 4px 20px rgba(0,0,0,0.05) — тень. Разберём запись:

margin-bottom: 60px — расстояние между секциями. Не 10, не 20 — 60 пикселей. Секции должны «дышать».

3.2. Заголовки h2, h3, h4

style.css — заголовки
h2 {
  font-weight: 500;
  font-size: 1.8rem;
  color: #1a3a5c;
  border-left: 6px solid #2b6f9c;
  padding-left: 18px;
  margin-bottom: 25px;
}

h3 {
  font-weight: 500;
  font-size: 1.3rem;
  color: #2c3e50;
  margin: 20px 0 10px 0;
}

h4 {
  font-weight: 500;
  font-size: 1.1rem;
  color: #1a3a5c;
  margin: 15px 0 5px 0;
}

Все три заголовка используют font-weight: 500 — «средняя жирность». Не 400 (обычный) и не 700 (жирный). Такой выбор — фирменный приём, делает заголовки заметными, но не «кричащими».

Разница между уровнями — в размере и отступах.

h2 — самый крупный, с синей вертикальной полосой слева:

Эта полоса — визуальный маркер: «здесь начинается крупный раздел».

| | Что дальше? <- h2 с полосой слева | +- Внутри секции идёт текст... Потом внутри появляется: Что-то поменьше <- h3 без полосы

h3 — без полосы, меньше размером. margin: 20px 0 10px 0 — сокращённая запись:

Развёрнутая запись
margin-top: 20px;
margin-right: 0;
margin-bottom: 10px;
margin-left: 0;

Читается: «20 пикселей сверху, 0 справа, 10 снизу, 0 слева». Сокращение из четырёх значений идёт по часовой стрелке: верх, право, низ, лево.

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

3.3. Абзацы и списки

style.css — p, li, ul
p, li {
  font-weight: 300;
  font-size: 1.05rem;
  color: #2d3f54;
}

ul, ol { padding-left: 25px; margin-bottom: 18px; }
li { margin-bottom: 6px; text-align: justify; }

Селектор p, li через запятую означает: «применить правило и к абзацам, и к пунктам списка». Одна запись — два типа элементов. Так короче, чем два отдельных правила.

font-weight: 300 — «тонкий». Обратите внимание: весь основной текст сайта — тонкий, а не обычный 400. Это создаёт «лёгкий» вид страниц.

text-align: justify — выравнивание по ширине. Абзац растягивается так, чтобы левый и правый край были ровными. Браузер добавляет дополнительные пробелы между словами. Спорный приём (иногда создаёт «рваные» интервалы), но для делового сайта — уместен.

3.4. Класс .text-block

style.css — .text-block
.text-block {
  text-align: justify;
  text-indent: 1.5em;
  margin-bottom: 0.8em;
}

Класс для «классического» абзаца с красной строкой.

text-indent: 1.5em — отступ первой строки. em — «относительно текущего размера шрифта». То есть 1.5 размера шрифта. Для 16-пиксельного текста это ~24 пикселя. Так делают в книгах и документах.

margin-bottom: 0.8em — небольшой отступ между абзацами. Тоже в em, чтобы отступ «подстраивался» под размер шрифта.

3.5. Специальные заголовки

style.css — .hero-title и др.
.hero-title {
  border-left: none;
  padding-left: 0;
  font-size: 2.4rem;
  margin-bottom: 25px;
}

.hero-lead { font-size: 1.2rem; }

.section-subtitle {
  border-left: 6px solid #2b6f9c;
  padding-left: 18px;
  font-weight: 500;
  margin-bottom: 18px;
}

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

.hero-title — главный заголовок на первой странице. Это h2, но без полосы слева (border-left: none) и крупнее (2.4rem ≈ 38px). Используется на главной и на странице 404.

.hero-lead — лид-абзац. Первый абзац после главного заголовка. Крупнее обычного (1.2rem против 1.05rem) — визуально «вводит в тему».

.section-subtitle — подзаголовок внутри секции с полосой слева. Отличается от h3 тем, что имеет ту самую синюю полосу. Применяется там, где по структуре нужен h3, но хочется визуально выделить его как «мини-h2».

3.6. Кнопка .btn

style.css — .btn
.btn {
  display: inline-block;
  background: #2b6f9c;
  color: #ffffff;
  padding: 12px 35px;
  font-weight: 500;
  font-size: 1.1rem;
  text-decoration: none;
  border-radius: 6px;
  transition: background 0.2s;
  border: none;
  cursor: pointer;
}

.btn:hover { background: #1f5479; }

Один класс — два тега. .btn навешивается и на <a> (ссылки-кнопки, «Получить консультацию»), и на <button> (формы). Поэтому в правиле есть свойства и для одного, и для другого.

display: inline-block — «строчный блок». С одной стороны, ведёт себя как строчный — стоит рядом с текстом. С другой, у него можно задавать padding и width как у блочного. Обычный inline (у <a> по умолчанию) этого не позволяет.

padding: 12px 35px — просторные внутренние отступы. По бокам 35 пикселей — чтобы кнопка была «широкой», удобной для клика.

border: none — для тега <button> убираем стандартную рамку браузера. Если забыть это свойство, кнопки-button будут выглядеть иначе, чем кнопки-ссылки.

cursor: pointer — курсор-палец. Для <a> это по умолчанию, для <button> тоже. Но дублируем — на всякий случай.

.btn:hover — при наведении цвет меняется на более тёмный #1f5479. Тот же синий, но темнее на 15%. Классический приём: «кнопка нажалась».

3.7. CTA-блок .cta-block

style.css — .cta-block
.cta-block {
  margin: 30px 0 20px;
  padding: 20px 30px;
  background: #f5f9fe;
  border-radius: 8px;
  border-left: 4px solid #2b6f9c;
  font-weight: 400;
  font-size: 1.05rem;
  text-align: center;
  color: #1a3a5c;
}

CTA = Call To Action, «призыв к действию». Визуально — врезка с призывом связаться или обсудить проект.

background: #f5f9fe — очень светлый синеватый оттенок. Отличается от белого фона секции, но едва заметно — CTA не «кричит», а мягко приглашает.

border-left: 4px solid #2b6f9c — синяя полоса слева. Тот же приём, что у h2, — единый визуальный язык.

text-align: center — центрируем текст. Обычно текст в проекте выровнен по ширине, а CTA — по центру. Так привлекает внимание.

3.8. Блок-выноска .highlight-box

style.css — .highlight-box
.highlight-box {
  background: #f0f6fc;
  border-left: 6px solid #2b6f9c;
  padding: 20px 28px;
  margin: 25px 0;
  border-radius: 0 8px 8px 0;
}
.highlight-box p { margin: 0; }

«Выноска» — блок для важной мысли. Применяется на страницах «Обо мне», «КП» и «Политика конфиденциальности».

border-radius: 0 8px 8px 0 — четыре значения по часовой стрелке: верх-лево, верх-право, низ-право, низ-лево. То есть у левых углов радиус 0 (прямые), у правых — 8px (скруглённые). Левая сторона плоская, потому что там полоса, правые углы скруглены.

.highlight-box p { margin: 0 } — последний абзац внутри выноски не имеет отступа снизу. Иначе был бы лишний «пустой» отступ внутри блока.

Итог

Следующий раздел — Секции 4–6: сетки, карточки, футер, блок «Контакты».