Е

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

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

04. style.css — философия и базовые секции

style.css — самый большой файл проекта. Он отвечает за всё, что вы видите на странице: цвета, шрифты, отступы, сетки, адаптив. Разберём его сначала как систему, потом — построчно.

Философия CSS проекта

Мы не используем никакие методологии вроде БЭМ, OOCSS или Atomic CSS. И не используем препроцессоры (Sass, Less). Причины простые:

Зато у нас есть своя система: файл поделён на секции, каждая секция с блоком-паспортом. Разберём эту систему.

Структура файла: десять секций

style.css поделён на десять частей. Каждая часть отвечает за свой блок сайта.

СЕКЦИЯ 1. БАЗОВЫЕ СБРОСЫ И КАРКАС *, html, body, .container СЕКЦИЯ 2. ШАПКА И НАВИГАЦИЯ .header, .header-left, .burger, .nav СЕКЦИЯ 3. ОБЩИЕ ЭЛЕМЕНТЫ section, h2, h3, h4, p, li, .btn, .cta-block, .highlight-box СЕКЦИЯ 4. СЕТКИ И КАРТОЧКИ .grid-2, .grid-3, .grid-4, .card, .badge СЕКЦИЯ 5. ФУТЕР .footer, .copyright СЕКЦИЯ 6. КОНТАКТЫ .contacts-grid, .contacts-block, .contacts-line СЕКЦИЯ 7. БЛОГ .blog-list, .blog-post, .post-title, .pagination СЕКЦИЯ 8. СТИЛИ ПОЛНОЙ СТАТЬИ .article-full, .article-body, .article-tags СЕКЦИЯ 9. АДАПТИВ @media (max-width: 768px) — мобильный вид СЕКЦИЯ 10. КОММЕРЧЕСКОЕ ПРЕДЛОЖЕНИЕ .price-grid, .price-item, .price-amount, .price-note, .legal-note

Порядок секций не случаен. Он идёт от «общего» к «частному»: сбросы → каркас → компоненты → адаптив → специфика конкретной страницы. Такая последовательность облегчает отладку: если что-то не то с отступами — ищешь в первых трёх секциях, если с кнопками — в четвёртой, если с тарифами — в десятой.

Почему Секция 10 — в конце, а не в середине

Первые девять секций — универсальные. Они работают на всём сайте. Секция 10 (.price-*, .legal-note) обслуживает только одну страницу — offer.html. По правилу «от общего к частному» специфичное идёт в конец: если однажды КП уедет в архив, секцию можно будет удалить одним куском, не трогая остальное.

Секция 1: базовые сбросы и каркас

Разберём первую секцию целиком, построчно.

style.css — Секция 1
* { margin: 0; padding: 0; box-sizing: border-box; }

html {
  overflow-y: scroll;
  scroll-behavior: smooth;
}

body {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
               Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans",
               "Helvetica Neue", Arial, sans-serif;
  background: #f5f7fa;
  color: #1e2a3a;
  line-height: 1.6;
  min-height: 100vh;
}

.container {
  max-width: 1100px;
  margin: 0 auto;
  padding: 40px 20px;
}

Строка 1: универсальный селектор *

CSS
* { margin: 0; padding: 0; box-sizing: border-box; }

Звёздочка * — это универсальный селектор. Он значит «применить правило ко всем элементам на странице без исключения».

Внутри правила три свойства. Разберём каждое.

margin: 0 — обнуляет внешние отступы у всех элементов. В браузерах по умолчанию у <h1>, <p>, <ul> есть отступы «по вкусу разработчика браузера». Мы их убираем, чтобы контролировать отступы сами.

padding: 0 — обнуляет внутренние отступы. Тот же смысл, что и с margin.

box-sizing: border-box — самое важное свойство здесь. Оно меняет способ расчёта ширины.

Сравним два варианта на конкретном примере. Скажем, у нас есть блок с width: 300px, padding: 20px, border: 1px.

box-sizing: content-box (по умолчанию) Итоговая ширина = 300 + 20 + 20 + 1 + 1 = 342px (padding и border прибавляются к width) box-sizing: border-box (наш выбор) Итоговая ширина = 300px (padding и border входят внутрь)

С border-box всё предсказуемо: сказали 300 — получили 300, независимо от padding. Без него пришлось бы считать в голове или в калькуляторе.

Одна строка, меняющая всё

box-sizing: border-box — правило №1 любого современного проекта. Оно применяется ко всем элементам через *. Так делают Bootstrap, Tailwind, почти все фреймворки.

Отступы в правиле: три свойства в одну строку, разделены ;. Можно было бы каждое на новой строке — было бы то же самое. Одна строка короче и, для такого простого правила, читается лучше.

Строка 3: html

CSS
html {
  overflow-y: scroll;
  scroll-behavior: smooth;
}

Селектор html выбирает корневой элемент документа. Он существует всегда, вокруг всего.

overflow-y: scroll — самое неочевидное свойство проекта. Оно говорит: всегда показывать вертикальную полосу прокрутки, даже если контент короткий и прокрутка не нужна.

Зачем это? Чтобы устранить «дёргание» страницы при переходах. Посмотрим на проблему:

БЕЗ overflow-y: scroll Открыли короткую страницу «Контакты» Полоса прокрутки не нужна — её нет Ширина экрана = 100% Перешли на длинную «Главную» Полоса прокрутки появилась Ширина контента = 100% − 17px (ширина полосы) → Всё содержимое сдвинулось влево на 17px → Пользователь видит «прыжок» страницы С overflow-y: scroll На всех страницах полоса есть всегда Ширина контента всегда 100% − 17px → Переходы без сдвигов

scroll-behavior: smooth — плавная прокрутка. Когда пользователь кликает по внутренней ссылке-якорю (например, в оглавлении), страница не «прыгает» мгновенно к нужной секции, а плавно съезжает. Приятный визуальный эффект.

Строка 7: body

CSS
body {
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
               Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans",
               "Helvetica Neue", Arial, sans-serif;
  background: #f5f7fa;
  color: #1e2a3a;
  line-height: 1.6;
  min-height: 100vh;
}

Пять свойств. Разберём каждое.

font-family — самое длинное правило в файле. Это системный стек шрифтов. Как он работает: браузер идёт по списку слева направо и берёт первый доступный шрифт.

font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", Arial, sans-serif; | | 1. -apple-system -> шрифт San Francisco на macOS/iOS | 2. BlinkMacSystemFont -> альтернатива для старых Chrome на Mac | 3. "Segoe UI" -> шрифт на Windows | 4. Roboto -> на Android | 5. Oxygen, Ubuntu, -> Linux | Cantarell, | Fira Sans, Droid Sans | 6. "Helvetica Neue" -> старая macOS | 7. Arial -> везде есть | 8. sans-serif -> запасной на крайний случай +->

То есть каждая система получит свой родной шрифт — тот, к которому привык пользователь. На Mac — San Francisco, на Windows — Segoe UI, на Android — Roboto. Сайт выглядит «естественно» везде, без загрузки внешних шрифтов.

Почему отказались от Google Fonts

Вначале проекта использовался Roboto через Google Fonts. Но при загрузке страницы шрифт сначала подменялся системным, потом — перерисовывался на Roboto. Пользователь видел «дёргание» текста. Системный стек устраняет проблему: шрифт уже есть в браузере, подмены не происходит.

background: #f5f7fa — светло-серый фон сайта. Именно на нём «висят» белые секции с тенью.

color: #1e2a3a — цвет текста по умолчанию. Тёмно-синий, почти чёрный. Не чистый чёрный #000 — потому что чёрный на белом выглядит жёстко, а тёмно-синий мягче для глаз.

line-height: 1.6 — межстрочный интервал. Значение 1.6 означает «высота строки = 1.6 от размера шрифта». Для шрифта 16 пикселей строка будет 25.6 пикселя. Оптимум для чтения — от 1.4 до 1.7. Меньше — тесно, больше — рыхло.

min-height: 100vh — минимальная высота body — 100% высоты окна браузера. vh = viewport height. Это гарантирует, что даже на коротких страницах body займёт весь экран, и футер не «всплывёт» на середину.

Строка 15: .container

CSS
.container {
  max-width: 1100px;
  margin: 0 auto;
  padding: 40px 20px;
}

Класс .container — обёртка вокруг всего контента страницы. Он решает задачу центрирования и ограничения ширины.

max-width: 1100px — контент не станет шире 1100 пикселей, даже на огромном мониторе. Иначе строки текста были бы слишком длинными, глазам тяжело читать.

margin: 0 auto — классический приём центрирования блочного элемента. 0 сверху и снизу, auto слева и справа. Браузер автоматически распределяет свободное пространство по бокам, и блок встаёт по центру.

padding: 40px 20px — внутренние отступы. Сверху и снизу по 40 пикселей, слева и справа по 20. Верхний отступ отодвигает контент от верхнего края окна, боковые — не дают тексту липнуть к краям на мобильных.

Что мы получили после Секции 1

+------------------------------------------+ | <- край окна браузера | | | | +------------------------------------+ | | | <- max-width: 1100px | | | | | | | | padding: 40px 20px | | | | | | | | +---- содержимое ----+ | | | | | .container | | | | | | | | | | | +--------------------+ | | | | | | | +------------------------------------+ | | | +------------------------------------------+

Всё содержимое сайта живёт внутри .container. На широком мониторе — по центру, не шире 1100 пикселей. На узком — прижато к краям с небольшим отступом.

Итог

В следующем разделе — Секции 2 и 3: шапка сайта, навигация и общие элементы вроде заголовков, кнопок и CTA-блоков.