CSS · Урок 4

Введение в CSS

CSS отвечает за внешний вид. Учимся подключать стили и писать первые правила.

Что такое CSS

CSS (Cascading Style Sheets) — каскадные таблицы стилей. Ключевое слово здесь «каскад»: правила применяются по порядку и дополняют друг друга. Одно правило выглядит так:

селектор {
  свойство: значение;
  свойство: значение;
}
p {
  color: #38bdf8;
  font-size: 16px;
}

Каждое существующее правило — либо как есть, либо «каскадом» передаётся потомкам.

Три способа подключения

СпособПримерКогда применять
Отдельный файл<link rel="stylesheet" href="style.css">Всегда, в продакшене
Тег <style>в <head>Прототипы, одноразовые страницы
Атрибут style<p style="color:red">Почти никогда
💡
Такой порядок приоритета: атрибут style перебивает тег <style>, а тот — внешний файл. Лучший подход — внешний файл и минимум «инлайна».

Базовые свойства

Самые частые инструменты оформления текста:

header {
  background-color: #1e293b;
  color: #e2e8f0;
}

h1 {
  font-family: "Segoe UI", sans-serif;
  font-size: 32px;
  font-weight: 700;
  text-align: center;
}

.link {
  color: #38bdf8;
  text-decoration: none;
}

.link:hover {
  text-decoration: underline;
}

Раскроем каждое:

Цвета в CSS

p { color: red; }              /* по имени */
p { color: #ff0000; }          /* hex */
p { color: rgb(255, 0, 0); }   /* rgb */
p { color: rgba(255, 0, 0, 0.5); } /* + прозрачность */

Единицы измерения

ЕдиницаОт чего зависитПример
pxпиксели экранаграницы, бордеры
%размер родителяширина блоков
remразмер корневого font-sizeшрифты, отступы
emразмер родительского шрифтавнутренние отступы
vh / vwвысота/ширина окнагерой-секции
ℹ️
В реальных проектах сейчас почти всегда выставляют базовый font-size: 16px на <html> и дальше работают в rem — так размеры масштабируются при изменении шрифта пользователем.

Живой пример

Стилизуем карточку за один шаг. Слева «голый» HTML, справа — то же, но с CSS:

Просто карточка без стилей
Та же карточка
с CSS 🎨

Наследование и каскад

Некоторые свойства передаются от родителя детям автоматически. Классика — цвет и шрифт:

body {
  color: #e2e8f0;          /* унаследуется всеми текстами */
  font-family: Arial, sans-serif;
}

А вот margin, padding, border и background не наследуются — просто потому, что иначе отступы «поехали» бы по всей странице.

СвойствоНаследуется?
color, font-*, text-align, line-heightда
margin, padding, width, heightнет
border, background, displayнет

Reset и Normalize

У браузеров разные стили «по умолчанию»: у одних у <ul> большие отступы, у других маленькие. Чтобы стартовать с чистого листа, подключают сброс:

/* Классический reset — решительно всё обнуляем */
*, *::before, *::after {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  font-family: sans-serif;
}
ℹ️
Полный сброс стирает и полезные вещи (например, акценты кнопок). Готовая библиотека Normalize.css, наоборот, выравнивает стили браузеров и ничего лишнего не ломает. Её часто используют в стартап-шаблонах.

CSS-переменные (custom properties)

В CSS можно объявлять собственные переменные — они задаются в двойном дефисе и работают везде ниже по дереву:

:root {
  --accent: #38bdf8;
  --gap: 16px;
  --radius: 12px;
}

.card {
  color: var(--accent);
  border-radius: var(--radius);
  padding: var(--gap);
}
💡
Главная сила переменных — палитру меняют в одном месте :root, и вся страница перекрашивается. На этом строятся переключатели «тёмная тема».

Адаптивные размеры: clamp()

Функция clamp() задаёт размер с минимумом, желаемым значением и максимумом. Идеальна для шрифтов, растущих с шириной окна:

h1 {
  font-size: clamp(1.5rem, 3vw + 1rem, 3rem);
}

Это означает: не меньше 1.5rem, стремиться к 3vw + 1rem, но не больше 3rem. Никаких media queries для одного заголовка.

⚠️
vw старается подстроиться под ширину окна. Но ставить огромные clamp() значения легко перестараться на огромных мониторах — всегда ограничивайте максимум.

Приоритет правил и !important

Когда два правила спорят, побеждает: инлайн-стиль > селектор по id > класс > тег. Если результат всё равно не тот, в ход идёт !important:

p { color: #38bdf8 !important; }  /* перебьёт класс и id */
⚠️
Помните: если что-то отбить !important можно, то отбить уже нечем, кроме !important же. В проектах его стараются сводить к нулю — это признак запутанных стилей.

Кастомные шрифты: @font-face и Google Fonts

Свои шрифты подключают директивой @font-face, а готовые — одной строкой из Google Fonts:

@font-face {
  font-family: "MyFont";
  src: url("../fonts/myfont.woff2") format("woff2");
  font-weight: 400;
}

/* или в head: */
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap" rel="stylesheet">
💡
Формат woff2 самый лёгкий, а display=swap (в Google Fonts) заставляет текст показаться сразу, а шрифт «догрузиться» фоном. Так страница не выглядит пустой, пока грузятся буквы.

Типографика: line-height, letter-spacing, text-decoration

Комфортное чтение — это не шутки. Три настройки решают 90% проблем с текстом:

body {
  line-height: 1.6;            /* межстрочный интервал */
  letter-spacing: 0.3px;      /* разрядка букв */
}

a { text-decoration: none; }   /* убрать подчёркивание */
.overline { text-decoration: overline; } /* линия сверху */
ℹ️
Оптимум для чтения: line-height между 1.4 и 1.8, а строки текста не длиннее примерно 70–80 символов.

@media: screen, print и брейкпоинты

Запросы можно открывать на любой тип устройства. Например, для печати страница делается компактной:

@media screen and (min-width: 768px) {
  .menu { display: flex; }
}

@media print {
  nav, .ad { display: none; }   /* не печатаем меню и рекламу */
}
💡
Пишите стили «мобайл-фёрст»: сначала узкие экраны, потом добавляйте min-width-правила для широких. Так базовый код проще и легче.

Группировка селекторов

Одно правило для нескольких элементов записывают через запятую:

h1, h2, h3 {
  color: #e2e8f0;
  font-weight: 700;
}

Псевдоклассы состояния

Стили «по событию»: :hover, :focus, :active:

a:hover  { color: #7dd3fc; }
a:focus  { outline: 2px solid #38bdf8; }
a:active { opacity: 0.7; }
ℹ️
:focus — «попал в поле клавиатурой», :focus-visible — видимое фокусирование. Не убирайте обводку фокуса совсем — доступность страдает.

Структурные псевдоклассы

Порядковые номера среди братьев: первый, последний, каждый чётный:

li:first-child  { color: #34d399; }
li:last-child   { font-weight: bold; }
li:nth-child(3)     { text-decoration: underline; }
li:nth-child(even)  { background: #1e293b; }
💡
Формула nth-child(2n+1) = нечётные, (odd) и (even) — сокращения. Полосатая таблица — пара строк.

Атрибутные селекторы

Стиль по наличию атрибута или его значению:

input[type="text"] { border-color: #38bdf8; }
a[href^="https://"] { color: #7dd3fc; }  /* ^= начало */
a[href$=".pdf"] { color: #f87171; }       /* $= конец */

Каскад: кто победит

При одинаковой специфичности побеждает правило, объявленное позже (ниже в файле):

p { color: red; }
p { color: blue; }   /* победит: объявлено позже */
⚠️
Не «чините» перекрытия тяжёлыми селекторами и !important. Лучше — больше классов, меньше важности.

background: сокращённая запись

Одно свойство вместо четырёх:

.hero {
  background: #0f172a url("../img/bg.jpg") center / cover no-repeat;
  /* цвет | картинка | позиция / размер | повтор */
}

border: стили и стороны

Границы разделяются по сторонам, стилям и цветам:

.card {
  border: 1px solid #334155;       /* все стороны */
  border-left: 4px solid #38bdf8;  /* акцент слева */
  border-radius: 8px;
}
💡
Стили: solid, dashed, dotted, double. Пунктирные границы — удобная разметка «набросков».

Прозрачность: opacity и rgba

Полупрозрачность бывает для всего блока или только для цвета:

.ghost  { opacity: 0.5; }            /* блеклый весь блок, включая детей */
.bg-fade{ background: rgba(15, 23, 42, 0.8); } /* прозрачный фон, текст чёткий */
ℹ️
Нужен «стеклянный» текст поверх изображения? Дайте ему background: rgba(...) — текст останется контрастным.

Шрифтовые стеки

Перечисляйте шрифты через запятую: если первого нет, возьмётся следующий:

body {
  font-family: "Segoe UI", Roboto, Arial, sans-serif;
}

code {
  font-family: "Cascadia Code", Consolas, monospace;
}

line-height без единиц

Пишите межстрочный интервал числом без единицы — он унаследуется пропорционально:

body { line-height: 1.6; }   // 1.6 × размер шрифта
💡
1.6 без px масштабируется вместе с font-size любого потомка. С px фиксированная высота ломается при смене размера шрифта.

Выравнивание текста: text-align

Слева, по центру, справа или по ширине — куда прижимать строки:

h1    { text-align: center; }
.left { text-align: left; }
.right{ text-align: right; }
.just { text-align: justify; }

font: универсальная запись

Одно свойство, все настройки шрифта сразу:

.btn {
  font: 16px/1.4 Arial, sans-serif;   /* размер/строка шрифт */
  font-style: italic;
  font-weight: 600;
}

CSS-комментарии

Примечания к правилам — пишите их, когда логика не очевидна:

/* Тёмная зона не должна дотрагиваться до шапки */
.hero {
  padding-top: 0;
}

/* ===== Раздел: карточки ===== */
.card { ... }

Палитра в DevTools

Подбирайте цвета с пипетки и копируйте в код:

💡
Если цвет в проекте повторяется — уносите в CSS-переменную --accent. Тема-лавка и палитра станут управляемыми.

Тренировка

  1. Вынесите стили в отдельный файл css/style.css и подключите его через <link>.
  2. Задайте фон страницы, цвет заголовков и уберите подчёркивание у ссылок.
  3. Сделайте кнопку-ссылка с :hover-эффектом.
  4. Поиграйте с font-size в px, rem и em — почувствуйте разницу.