К содержанию

Правила и селекторы CSS

Как подключить CSS, выбрать элементы и понять, какое правило применится.

На этой странице

CSS (Cascading Style Sheets, «каскадные таблицы стилей») описывает внешний вид HTML-страницы: цвет, размер текста, рамки, отступы и расположение элементов. Браузер находит элементы по селекторам и применяет к ним CSS-правила.

Из чего состоит правило

styles.css
p {
  color: #243447;
  font-size: 18px;
}
  • p - селектор, который выбирает элементы.
  • color и font-size - свойства.
  • #243447 и 18px - значения свойств.
  • Строки внутри { } - объявления. В курсе завершаем каждое точкой с запятой, хотя у последнего объявления она необязательна.

Одно правило может задавать несколько объявлений. Пока записывайте каждое свойство отдельно: так проще понять, что именно меняет оформление.

Как подключить стили

Отдельный файл - основной способ

Создайте styles.css рядом с index.html и подключите его в <head>:

index.html
<head>
  <link rel="stylesheet" href="styles.css" />
</head>
styles.css
body {
  font-family: Arial, sans-serif;
}
 
h1 {
  color: #174ea6;
}

rel="stylesheet" сообщает браузеру, что подключён файл стилей, а href задаёт путь к нему. Если файл лежит в папке css, путь будет css/styles.css. Внешний файл удобно переиспользовать на нескольких страницах и редактировать отдельно от разметки.

Блок <style> внутри HTML

Для небольшого примера правило можно написать в <style> внутри <head>:

index.html
<head>
  <style>
    h1 {
      color: #174ea6;
    }
  </style>
</head>

Атрибут style у элемента

Такой способ задаёт стиль прямо элементу:

index.html
<p style="color: #174ea6;">Синий текст</p>

Синтаксис позволяет задать стиль так, но оформление сложнее переиспользовать, искать и менять. Для страницы выносите правила в отдельный CSS-файл.

Селекторы

Селектор описывает, какие элементы получат правило.

ЗаписьЧто выбираетПример в HTML
pВсе элементы этого типа<p>Абзац</p>
.noticeВсе элементы с классом notice<p class="notice">Сообщение</p>
#page-titleЭлемент с id="page-title"<h1 id="page-title">Заголовок</h1>
[type="email"]Элементы с таким атрибутом и значением<input type="email">
.menu aСсылки внутри элемента с классом menu<nav class="menu"><a href="/">Главная</a></nav>
.notice, .warningЭлементы, совпавшие хотя бы с одним селектором<p class="warning">Важно</p>

Класс записывают в HTML как class="notice", а в CSS перед его именем ставят точку: .notice. Один класс можно назначить многим элементам, а элемент может иметь несколько классов:

index.html
<p class="notice">Первое сообщение</p>
<p class="notice warning">Важное сообщение</p>

Для повторяющихся компонентов обычно используйте классы. id предназначен для конкретного уникального элемента на странице; в CSS перед ним ставят #.

Состояния и части элемента

Псевдокласс выбирает элемент в определённом состоянии или по его месту среди соседей. Например, :hover срабатывает при наведении, а :first-child выбирает первый дочерний элемент:

styles.css
.menu-link:hover {
  color: #174ea6;
}
 
.menu-link:focus-visible {
  outline: 2px solid #174ea6;
  outline-offset: 3px;
}
 
li:first-child {
  font-weight: bold;
}

:hover описывает состояние при наведении указателя. :focus-visible показывает заметный фокус, обычно когда пользователь перешёл к элементу клавишей Tab. Поэтому интерактивная ссылка должна быть заметна не только при наведении мыши.

Псевдоэлемент выбирает условную часть элемента. Например, ::before добавляет оформляемое содержимое перед текстом. Для видимого содержимого свойству content нужно задать значение:

styles.css
.required::before {
  content: "НОВОЕ";
  margin-right: 8px;
}
 
.required::after {
  content: " *";
  color: #c5221f;
}

Не используйте псевдоэлементы для важной информации или управления: такое содержимое лучше добавить в HTML.

Классы, каскад и наследование

Одному элементу можно назначить несколько классов через пробел. Правило .notice.warning сработает только на элементе, у которого есть оба класса:

index.html
<p class="notice">Обычное сообщение</p>
<p class="notice warning">Важное сообщение</p>
styles.css
.notice {
  color: #1769aa;
  border-left: 4px solid currentColor;
}
 
.notice.warning {
  color: #a33b20;
}

Оба абзаца получают рамку из .notice. У второго текста другой цвет: более точное правило .notice.warning переопределило color, но не удалило рамку. Вложенный текст обычно наследует цвет родителя:

Попробуйте примеры: наведите указатель на ссылку, перейдите к ней клавишей Tab и сравните два сообщения.

Псевдокласс :hover

Состояние ссылки или кнопки изменилось, но сам элемент остался тем же.

Псевдоэлементы ::before и ::after

Поле обязательно

CSS добавил метку до текста и звёздочку после него. Это оформление, а не новая разметка HTML.

Класс и уточняющее правило

Обычное сообщение

Вложенный текст наследует цвет текста.

Важное сообщение

Класс warning меняет цвет, остальные стили остаются.

Наследуются только некоторые свойства, например color и font-family. Рамка, фон, ширина и отступы не наследуются автоматически. Поэтому отдельно различайте два механизма: каскад выбирает правило для самого элемента, а наследование передаёт ему отдельные свойства от предка, когда своего значения нет.

Если несколько правил подходят

К одному элементу часто подходят сразу несколько правил. Каскад CSS выбирает итоговое значение с учётом важности и источника правила, специфичности селектора и порядка объявлений. Для первых примеров достаточно таких ориентиров:

  • если правила пришли из одного источника и имеют одинаковую важность, более точный селектор выигрывает: #page-title точнее, чем .title, а .title точнее, чем h1;
  • если у правил одинаковая специфичность, обычно применяется то, которое записано позже;
  • !important меняет обычный порядок каскада, поэтому не используйте его как универсальное средство исправления стилей.
styles.css
p {
  color: #333;
}
 
.notice {
  color: #174ea6;
}

Абзац с class="notice" будет синим: селектор класса точнее селектора типа.

Часто используемые свойства

Свойство отвечает за одну сторону оформления. Ниже собраны те, которые чаще всего встретятся в первых макетах:

СвойствоЧто меняетПример
colorЦвет текстаcolor: #202124;
font-sizeРазмер текстаfont-size: 18px;
background-colorЦвет фонаbackground-color: white;
borderГраницу: толщину, вид линии и цветborder: 1px solid #dadce0;
border-radiusСкругление угловborder-radius: 12px;
paddingРасстояние между содержимым и границейpadding: 16px;
marginРасстояние снаружи границы до соседних элементовmargin: 24px 0;

Посмотрите, как эти свойства работают вместе на одной карточке:

styles.css
.card {
  color: #202124;
  background-color: white;
  border: 1px solid #dadce0;
  border-radius: 12px;
  padding: 16px;
  margin: 8px 0;
}

Карточка курса

Фон, рамка, скругление и внутренний отступ.

Оранжевое поле вокруг карточки - внешний отступ margin. Он не является частью её фона.

Подробно устройство padding, border и margin разобрано в статье «Блочная модель».