Цветовое оформление в CSS

Чтение — около 9 минут· без учёта практики

В уроке о размере шрифта мы задали размеры текста на сайте Тони. Цвета на нём тоже уже есть: фон linen, заголовки saddlebrown, подвал в формате hsl(). Пора разобраться, какие бывают записи цвета, чем они отличаются и как проверить, что текст хорошо читается на своём фоне.

Свойство color

Цвет текста элемента задаёт свойство color:

CSS
селектор {
  color: значение;
}

Те же значения принимают другие свойства с цветом, например цвет фона background-color и цвет рамки. Фон элемента подробнее рассмотрим в уроке «Работа с фоном элемента». Начнём с самой старой записи цвета — шестнадцатеричной (англ. hexadecimal, отсюда сокращение HEX).

Шестнадцатеричные значения

Шестнадцатеричное значение начинается со знака # и состоит из трёх пар цифр:

CSS
селектор {
  color: #RRGGBB;
}

/* RR — красный, GG — зелёный, BB — синий */

Каждая пара (RR, GG и BB) — число от 00 до FF, то есть от 0 до 255 в десятичной записи. В шестнадцатеричной системе счёт ведётся так: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Цвет получается смешиванием трёх составляющих: красной, зелёной и синей. Например, #0000FF — синий цвет: синяя составляющая на максимуме (FF), остальные на минимуме (00). Регистр букв не важен: #8B4513 и #8b4513 — один и тот же цвет.

Значение можно сократить до трёх цифр, если в каждой паре обе цифры одинаковы: #0000FF записывается как #00F, а #777777 — как #777:

CSS
p.intro {
  color: #777; /* тёмно-серый цвет для всех абзацев с классом intro */
}

Шестнадцатеричные значения: попробуйте сами

Заголовок окрашен в #8b4513 — тот же коричневый, что у заголовков на сайте Тони. Поменяйте местами пары цифр: #13458b даст синий цвет, потому что максимальной станет синяя составляющая.

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8">
    <title>Шестнадцатеричные значения цвета</title>
    <style>
      h2 {
        color: #8b4513; /* RR = 8b, GG = 45, BB = 13 — коричневый цвет заголовков Тони */
      }
      .blue {
        color: #0000ff; /* только синяя составляющая на максимуме */
      }
      .gray {
        color: #777; /* сокращённая запись #777777 */
      }
    </style>
  </head>
  <body>
    <h2>Моя любимая игрушка</h2>
    <p class="blue">Синий текст: #0000ff, коротко #00f.</p>
    <p class="gray">Тёмно-серый текст: #777777, коротко #777.</p>
  </body>
</html>

Функция rgb()

Функция rgb() задаёт те же три составляющие — R (англ. red — красный), G (green — зелёный), B (blue — синий) — десятичными числами:

CSS
селектор {
  color: rgb(R, G, B);
}

Каждое число задаёт яркость составляющей от 0 до 255. Например, rgb(0, 0, 255) — синий цвет: синяя составляющая на максимуме, красная и зелёная — на минимуме:

CSS
p {
  color: rgb(0, 0, 255); /* синий цвет для всех абзацев */
}

Составляющие можно задавать и в процентах, где 100% соответствует 255. Например, оранжевый цвет для всех заголовков второго уровня:

CSS
h2 {
  color: rgb(100%, 65%, 0%); /* оранжевый цвет для всех заголовков второго уровня */
}

В современном CSS числа в функциях цвета можно разделять пробелами без запятых: rgb(139 69 19). Обе записи работают во всех современных браузерах; в учебнике встретятся обе.

Функция rgb(): попробуйте сами

rgb(139, 69, 19) и #8b4513 — один цвет: 8b, 45 и 13 в шестнадцатеричной записи — это 139, 69 и 19 в десятичной. Задайте всем трём составляющим одинаковое значение, например rgb(120, 120, 120), — получится серый.

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8">
    <title>Функция rgb()</title>
    <style>
      h2 {
        color: rgb(139, 69, 19); /* тот же коричневый, что #8b4513 */
      }
      .blue {
        color: rgb(0, 0, 255); /* синий */
      }
      .orange {
        color: rgb(100%, 65%, 0%); /* оранжевый: составляющие в процентах */
      }
      .modern {
        color: rgb(139 69 19); /* современная запись: числа через пробел */
      }
    </style>
  </head>
  <body>
    <h2>Мой режим дня</h2>
    <p class="blue">rgb(0, 0, 255)</p>
    <p class="orange">rgb(100%, 65%, 0%)</p>
    <p class="modern">rgb(139 69 19)</p>
  </body>
</html>

Прозрачность и альфа-канал

Цвету можно добавить четвёртую составляющую — альфа-канал, который задаёт непрозрачность. Раньше для этого была отдельная функция rgba():

CSS
селектор {
  color: rgba(R, G, B, A);
}
  • R — красная составляющая;
  • G — зелёная составляющая;
  • B — синяя составляющая;
  • A (англ. alpha) — степень смешивания с фоном.

Альфа-канал принимает значения от 0 до 1 или от 0% до 100%, где:

  • 0 — цвет полностью прозрачный, невидимый;
  • 1 — цвет непрозрачный.

Сравним зелёный фон блоков с альфа-каналом от rgba(0, 255, 0, 0.1) до rgba(0, 255, 0, 1) с шагом 0.1:

Прозрачность цвета: попробуйте сами

Чем меньше альфа-канал, тем сильнее сквозь зелёный проступает фон страницы linen. Замените фон body на black — полупрозрачные блоки потемнеют, а непрозрачный последний блок не изменится.

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8">
    <title>Прозрачность цвета: rgba() и альфа-канал</title>
    <style>
      body {
        background-color: linen;
      }
      div {
        display: inline-block; /* блоки стоят в строку, но им можно задать размеры */
        width: 60px;
        height: 60px;
      }
      .a1 { background-color: rgba(0, 255, 0, 0.1); }
      .a2 { background-color: rgba(0, 255, 0, 0.2); }
      .a3 { background-color: rgba(0, 255, 0, 0.3); }
      .a4 { background-color: rgba(0, 255, 0, 0.4); }
      .a5 { background-color: rgba(0, 255, 0, 0.5); }
      .a6 { background-color: rgba(0, 255, 0, 0.6); }
      .a7 { background-color: rgba(0, 255, 0, 0.7); }
      .a8 { background-color: rgba(0, 255, 0, 0.8); }
      .a9 { background-color: rgba(0, 255, 0, 0.9); }
      .a10 { background-color: rgba(0, 255, 0, 1); }
      .modern { background-color: rgb(0 255 0 / 50%); } /* современная запись: прозрачность после косой черты */
      .hex { background-color: #00ff0080; } /* восемь цифр: последние две — прозрачность */
    </style>
  </head>
  <body>
    <div class="a1">0.1</div>
    <div class="a2">0.2</div>
    <div class="a3">0.3</div>
    <div class="a4">0.4</div>
    <div class="a5">0.5</div>
    <div class="a6">0.6</div>
    <div class="a7">0.7</div>
    <div class="a8">0.8</div>
    <div class="a9">0.9</div>
    <div class="a10">1</div>
    <p>Та же прозрачность 50% в другой записи:</p>
    <div class="modern">/ 50%</div>
    <div class="hex">#00ff0080</div>
  </body>
</html>

Чем меньше значение альфа-канала, тем прозрачнее цвет. Блоки стоят в строку благодаря свойству display со значением inline-block: такие элементы располагаются в строку, как текст, но им можно задать размеры. Блочную и строчную модель мы подробно рассмотрим в уроке «Блочная и строчная модель».

В современном CSS альфа-канал можно добавить в саму функцию rgb() после косой черты: rgb(0 255 0 / 0.5) или rgb(0 255 0 / 50%). Функция rgba() осталась для совместимости и работает так же. Шестнадцатеричная запись тоже поддерживает прозрачность: четвёртая пара цифр — альфа-канал, например #00ff0080 (80 в шестнадцатеричной системе — 128 из 255, около 50%).

Ноль перед точкой в дробных числах можно не писать: вместо 0.3 — .3, вместо 0.625 — .625. В учебнике я записываю ноль: так значение легче прочитать.

Альфа-канал и opacity

Если полупрозрачным нужен только фон карточки, задайте альфа-канал её цвету: background-color: rgb(139 69 19 / 30%). Текст внутри останется непрозрачным. Свойство opacity (непрозрачность элемента) действует на весь отрисованный элемент вместе с потомками: opacity: 0.3 сделает бледными и фон, и текст. Значение opacity: 1 у ребёнка этого не отменит. Контраст полупрозрачного текста проверяйте после смешивания с реальным фоном.

Прозрачный фон или весь блок: попробуйте сами

У первой карточки прозрачен только фон, у второй — также текст. Задайте второму абзацу opacity: 1: непрозрачность родителя всё равно действует на весь блок.

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Альфа-канал и opacity</title>
  </head>
  <body>
    <section class="alpha"><h2>Любимая игрушка</h2><p>Тони приносит канат.</p></section>
    <section class="whole"><h2>Любимая игрушка</h2><p>Тони приносит канат.</p></section>
  </body>
</html>
style.css
CSS
body { background: linen; color: black; }
.alpha { background-color: rgb(139 69 19 / 30%); }
.whole { background-color: rgb(139 69 19); opacity: 0.3; }

Функция hsl()

Функция hsl() описывает цвет не смесью составляющих, а тремя понятными человеку характеристиками. Название составлено из первых букв:

  • H (англ. hue) — тон;
  • S (англ. saturation) — насыщенность;
  • L (англ. lightness) — светлота.
CSS
hsl(тон от 0 до 360, насыщенность от 0% до 100%, светлота от 0% до 100%)

Тон задаётся углом на круге оттенков в градусах, единицу deg можно не писать:

Круг оттенков: красный 0°, жёлтый 60°, зелёный 120°, голубой 180°, синий 240°, фиолетовый 300°.

Красный цвет соответствует значениям 0 и 360, жёлтый — 60, зелёный — 120, голубой — 180, синий — 240, фиолетовый — 300.

Насыщенность определяет, насколько чистый цвет: 0% — серый без оттенка, 100% — чистый и яркий цвет.

Светлота меняется от 0% (чёрный) до 100% (белый); при 50% и насыщенности 100% получается чистый цвет. При нулевой насыщенности светлота 50% даёт серый.

Рассмотрим красный цвет (тон 0): в первом ряду растёт насыщенность, во втором — светлота.

Функция hsl(): попробуйте сами

В первом ряду насыщенность растёт от тусклого серо-красного к чистому красному, во втором светлота идёт от почти чёрного к белому. Замените тон 0 на 240 во всех правилах — ряды станут синими.

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8">
    <title>Функция hsl(): насыщенность и светлота</title>
    <style>
      div {
        display: inline-block;
        width: 60px;
        height: 60px;
        font-size: 12px;
      }
      /* Тон 0 — красный, светлота 50%, насыщенность растёт от 10% до 100% */
      .s1 { background-color: hsl(0, 10%, 50%); }
      .s2 { background-color: hsl(0, 20%, 50%); }
      .s3 { background-color: hsl(0, 30%, 50%); }
      .s4 { background-color: hsl(0, 40%, 50%); }
      .s5 { background-color: hsl(0, 50%, 50%); }
      .s6 { background-color: hsl(0, 60%, 50%); }
      .s7 { background-color: hsl(0, 70%, 50%); }
      .s8 { background-color: hsl(0, 80%, 50%); }
      .s9 { background-color: hsl(0, 90%, 50%); }
      .s10 { background-color: hsl(0, 100%, 50%); }
      /* Тон 0, насыщенность 100%, светлота растёт от 10% (почти чёрный) до 100% (белый) */
      .l1 { background-color: hsl(0, 100%, 10%); }
      .l2 { background-color: hsl(0, 100%, 20%); }
      .l3 { background-color: hsl(0, 100%, 30%); }
      .l4 { background-color: hsl(0, 100%, 40%); }
      .l5 { background-color: hsl(0, 100%, 50%); }
      .l6 { background-color: hsl(0, 100%, 60%); }
      .l7 { background-color: hsl(0, 100%, 70%); }
      .l8 { background-color: hsl(0, 100%, 80%); }
      .l9 { background-color: hsl(0, 100%, 90%); }
      .l10 { background-color: hsl(0, 100%, 100%); }
      .dark {
        color: white; /* на тёмных образцах белый текст читается лучше */
      }
    </style>
  </head>
  <body>
    <p>Насыщенность:</p>
    <div class="s1">10%</div>
    <div class="s2">20%</div>
    <div class="s3">30%</div>
    <div class="s4">40%</div>
    <div class="s5">50%</div>
    <div class="s6">60%</div>
    <div class="s7">70%</div>
    <div class="s8">80%</div>
    <div class="s9">90%</div>
    <div class="s10">100%</div>
    <p>Светлота:</p>
    <div class="l1 dark">10%</div>
    <div class="l2 dark">20%</div>
    <div class="l3 dark">30%</div>
    <div class="l4 dark">40%</div>
    <div class="l5">50%</div>
    <div class="l6">60%</div>
    <div class="l7">70%</div>
    <div class="l8">80%</div>
    <div class="l9">90%</div>
    <div class="l10">100%</div>
  </body>
</html>

HSL удобна, чтобы получить оттенки одного цвета: тон остаётся прежним, меняется только светлота. Так подобраны фоны на сайте Тони: вводный блок hsl(30, 80%, 95%) и подвал hsl(30, 50%, 90%) — один тёплый тон 30, разные насыщенность и светлота.

Как и в RGB, в HSL можно добавить альфа-канал: прежняя запись — функция hsla(), современная — hsl(300 100% 50% / 0.5). Рассмотрим фиолетовый цвет (тон 300) с прозрачностью от 0.1 до 1:

Прозрачность в hsl(): попробуйте сами

Фиолетовый становится всё плотнее с ростом альфа-канала. Последний блок записан современным синтаксисом: hsl(300 100% 50% / 0.5) — то же, что hsla(300, 100%, 50%, 0.5).

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8">
    <title>Прозрачность в hsl()</title>
    <style>
      div {
        display: inline-block;
        width: 60px;
        height: 60px;
      }
      /* Тон 300 — фиолетовый; прозрачность растёт от 0.1 до 1 */
      .a1 { background-color: hsla(300, 100%, 50%, 0.1); }
      .a2 { background-color: hsla(300, 100%, 50%, 0.2); }
      .a3 { background-color: hsla(300, 100%, 50%, 0.3); }
      .a4 { background-color: hsla(300, 100%, 50%, 0.4); }
      .a5 { background-color: hsla(300, 100%, 50%, 0.5); }
      .a6 { background-color: hsla(300, 100%, 50%, 0.6); }
      .a7 { background-color: hsla(300, 100%, 50%, 0.7); }
      .a8 { background-color: hsla(300, 100%, 50%, 0.8); }
      .a9 { background-color: hsla(300, 100%, 50%, 0.9); }
      .a10 { background-color: hsla(300, 100%, 50%, 1); }
      .modern { background-color: hsl(300 100% 50% / 0.5); } /* современная запись */
    </style>
  </head>
  <body>
    <div class="a1">0.1</div>
    <div class="a2">0.2</div>
    <div class="a3">0.3</div>
    <div class="a4">0.4</div>
    <div class="a5">0.5</div>
    <div class="a6">0.6</div>
    <div class="a7">0.7</div>
    <div class="a8">0.8</div>
    <div class="a9">0.9</div>
    <div class="a10">1</div>
    <div class="modern">/ 0.5</div>
  </body>
</html>

Попробуйте функции rgb() и hsl()

Настройте компоненты rgb() или hsl() и непрозрачность. При переключении функции устанавливается начальный образец для выбранной модели. Шахматный фон помогает увидеть прозрачность.

Компоненты цвета
Функция цвета

.sample {
  background-color: rgb(40 120 210 / 1);
}
HTML примера
HTML
<div class="sample"></div>

Именованные цвета

Кроме числовых записей, в CSS есть именованные цвета: linen, saddlebrown, dimgray и ещё около 150 названий. Каждое имя соответствует определённому значению: saddlebrown — это #8b4513, linen — #faf0e6. Полный перечень — в справочнике HTML в разделе HTML цвета.

CSS
p.intro {
  color: gray; /* серый цвет для всех абзацев с классом intro */
}
i {
  color: orange; /* оранжевый цвет для всех элементов <i> */
}
h2:first-child {
  color: red; /* красный цвет для заголовков <h2>, которые идут первыми в своём родителе */
}

Два особых ключевых слова не обозначают конкретный цвет. transparent — полностью прозрачный цвет, то же, что rgb(0 0 0 / 0). currentColor — текущее значение color элемента: например, рамка с currentColor всегда того же цвета, что текст.

Именованные цвета: попробуйте сами

Рамка второго абзаца взяла цвет текста через currentColor. Замените dimgray на saddlebrown в правиле .note — рамка поменяет цвет вместе с текстом.

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8">
    <title>Именованные цвета, currentColor и transparent</title>
    <style>
      body {
        background-color: linen; /* #faf0e6 */
      }
      h2 {
        color: saddlebrown; /* #8b4513 */
      }
      .note {
        color: dimgray; /* #696969 */
        border: 2px solid currentColor; /* рамка того же цвета, что текст */
      }
      .clear {
        background-color: transparent; /* полностью прозрачный фон */
      }
    </style>
  </head>
  <body>
    <h2>Где я гуляю</h2>
    <p class="note">Рамка этого абзаца взяла цвет текста через currentColor.</p>
    <p class="clear">Фон этого абзаца прозрачный — видно фон страницы.</p>
  </body>
</html>

Имена удобны в учебных примерах и для быстрых правок. Но набор имён ограничен, а близкие оттенки названы непредсказуемо (darkgray светлее, чем gray). Для палитры сайта обычно выбирают точные значения в HEX, rgb() или hsl().

Другие функции цвета

В современном CSS есть и другие функции цвета: hwb() (тон, примесь белого и чёрного), lab(), lch(), oklab() и oklch(). Последние описывают цвет так, как его воспринимает глаз: при одинаковой светлоте в oklch() жёлтый и синий выглядят одинаково светлыми, а в HSL — нет. Кроме того, они позволяют задать цвета ярче, чем умеют HEX и RGB, на экранах, которые их показывают. Перевести цвет между всеми этими записями можно в инструменте «Генератор цветов». В учебнике мы будем пользоваться HEX, rgb() и hsl(): их достаточно для оформления сайта.

Контраст текста и фона

Цвет текста выбирают не только по вкусу: текст должен читаться на своём фоне. Светло-серый на белом, бежевый на светло-бежевом могут выглядеть изящно, но людям со слабым зрением, на ярком солнце или на плохом экране такой текст не прочитать.

Контраст текста и фона рассчитывают по их относительной яркости. Отношение контрастности — число от 1:1 (относительная яркость одинакова, хотя цвета могут различаться) до 21:1 (чёрный на белом). Рекомендации по доступности WCAG (англ. Web Content Accessibility Guidelines — рекомендации по обеспечению доступности веб-контента) требуют для основного текста не меньше 4.5:1, для крупного — не меньше 3:1. Крупным считается текст от 24px или полужирный от 18.66px. Уровень повыше (AAA) требует 7:1 для обычного текста.

Проверим цвета сайта Тони на фоне linen:

Цвет Где используется Контраст на linen
#2b211b Основной текст 13.97:1 — подходит
saddlebrown Заголовки и меню 6.31:1 — подходит
dimgray Подписи к фотографиям, оглавление 4.88:1 — подходит, но холодный серый выбивается из тёплой палитры
tan Рамка оглавления 1.75:1 — для текста не годится, для декоративной рамки допустимо

Контраст в таблице посчитан по формуле WCAG. Проверьте его сами в виджете ниже.

Потренируйтесь

Введите цвет в любой записи — saddlebrown, #8b4513, rgb(139 69 19) или hsl(25 76% 31%) — и посмотрите, как он записывается в других форматах. Под образцом — контраст этого цвета как цвета текста на фоне linen. Проверьте dimgray, tan и #6b5d52: какие из них подходят для текста?

HEX, rgb(), hsl(), oklch() или имя

RGB
rgb(139, 69, 19)
HEX
#8B4513
HSL
hsl(25, 76%, 31%)
OKLCH
oklch(47.08% 0.112 50.85)

Текст на фоне #FAF0E6

Контраст: 6.31 : 1

  • Даобычный текст (от 4.5:1)
  • Дакрупный текст (от 3:1)
Открыть в инструменте «Генератор цветов»

Проверьте себя

Выберите ответ — объяснение появится сразу. Ответ можно менять.

1. Какой цвет задаёт значение #00FF00?
Показать ответ

Зелёный — Пары цифр — красная, зелёная и синяя составляющие. Максимум (FF) только у зелёной.

2. Как сократить значение #778899?
Показать ответ

#789 — В каждой паре цифры одинаковы (77, 88, 99), поэтому каждую пару можно записать одной цифрой.

3. Какая запись задаёт тот же цвет, что #8b4513?
Показать ответ

rgb(139, 69, 19) — 8b, 45 и 13 в шестнадцатеричной системе — это 139, 69 и 19 в десятичной. Это цвет saddlebrown.

4. Чему соответствует альфа-канал 0 в записи rgb(0 128 0 / 0)?
Показать ответ

Цвет полностью прозрачный — Альфа-канал 0 — полная прозрачность, 1 — полная непрозрачность.

5. Что изменится, если в hsl(30, 80%, 95%) уменьшить третье значение до 60%?
Показать ответ

Цвет станет темнее, а тон останется тёплым оранжево-бежевым — Третье значение — светлота. Тон 30 и насыщенность не меняются, поэтому получается более тёмный оттенок того же цвета.

6. Задано p { color: dimgray; border: 2px solid currentColor; }. Какого цвета рамка абзаца?
Показать ответ

dimgray, как текст — currentColor — текущее значение свойства color элемента.

7. Контраст цвета текста и фона — 3.5:1. Для какого текста это подходит по WCAG (уровень AA)?
Показать ответ

Только для крупного текста: от 24px или полужирного от 18.66px — Для крупного текста достаточно 3:1, для обычного нужно не меньше 4.5:1.

8. Почему цвет tan на сайте Тони подходит для рамки оглавления, но не для текста?
Показать ответ

Его контраст на фоне linen 1.75:1: текст плохо читается, а декоративной рамке высокий контраст не нужен — Требования к контрасту относятся к тексту и значимым элементам. Рамка оглавления — украшение, её можно сделать светлой.

9. Как сделать полупрозрачным фон карточки, сохранив непрозрачный текст?
Показать ответ

Задать альфа-канал цвету background-color — Альфа-канал действует только на заданный цвет.

Задание

Ожидаемый результат: подписи к фотографиям и пункты оглавления — тёплого серо-коричневого цвета, а фраза «Пожалуйста, не кормите меня со стола!» на главной — тёмно-коричневая. Контраст #6b5d52 на linen — 5.64:1, #6e3510 — 8.57:1 (на чуть более светлом фоне вводного блока — ещё выше): оба цвета подходят для основного текста.

Выполните задание

css/style.css
CSS
/* Общие стили сайта Тони */
body {
  background-color: linen;
  color: #2b211b; /* цвет для потомков без собственного значения */
  font-size: 1.0625rem; /* 17px при настройке браузера по умолчанию */
}

/* Общий цвет заголовков — групповой селектор */
h1,
h2 {
  color: saddlebrown;
}

/* Размеры заголовков в rem — от размера шрифта корня, а не родителя */
h1 {
  text-align: center;
  font-size: 2.5rem;
}

h2 {
  font-size: 1.75rem;
}

/* Вводный блок главной страницы */
.intro {
  background-color: hsl(30, 80%, 95%);
}

/* Оглавление главной страницы */
.toc {
  background-color: white;
  border: 1px solid tan;
}

/* Ссылки меню в шапке — селектор потомков */
nav a {
  color: saddlebrown;
  text-decoration: none;
}

/* Ссылки оглавления главной страницы */
.toc a {
  color: dimgray;
}

figcaption {
  color: dimgray;
  font-size: 0.95rem;
}

footer {
  background-color: hsl(30, 50%, 90%);
  text-align: center;
}

/* Ссылка в подвале берёт цвет текста подвала */
footer a {
  color: inherit;
}

/* Поля формы получают шрифт страницы вместо шрифта браузера */
input,
select,
textarea,
button {
  font: inherit;
}

/* Ссылки темнеют при наведении указателя */
a:hover {
  color: #5c2d0c;
}

/* Ссылки меню подчёркиваются при наведении и фокусе с клавиатуры */
nav a:hover,
nav a:focus-visible {
  text-decoration: underline;
}

/* Заметная рамка фокуса у ссылок, полей и кнопок при работе с клавиатуры */
:focus-visible {
  outline: 3px solid #1f6feb;
  outline-offset: 3px;
}
index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="Сайт карликового пинчера Тони: игрушки, режим дня и запись на прогулку.">
    <title>Сайт Тони</title>
    <link rel="stylesheet" href="css/style.css">
  </head>
  <body>
    <header>
      <!-- Меню сайта -->
      <nav>
        <ul>
          <li><a href="index.html">Главная</a></li>
          <li><a href="pages/toys.html">Мои игрушки</a></li>
          <li><a href="pages/signup.html">Запись на прогулку</a></li>
        </ul>
      </nav>
    </header>
    <main>
      <div class="intro">
        <h1 id="top">Привет! Меня зовут Тони</h1>
        <p>Я карликовый пинчер. Мне три года, я вешу 8&nbsp;кг и люблю гулять в любую погоду. Хозяин говорит: <q>Тони — лучший сторож в доме</q>.</p>
        <p>Мой день рождения — <time datetime="2023-09-22">22 сентября</time>. <strong>Пожалуйста, не кормите меня со стола!</strong></p>
        <p>Моя родословная записана в Российской кинологической федерации (<abbr title="Российская кинологическая федерация">РКФ</abbr>).</p>
      </div>
      <ul class="toc">
        <li><a href="#toy">Моя любимая игрушка</a></li>
        <li><a href="#commands">Команды, которые я знаю</a></li>
        <li><a href="#schedule">Мой режим дня</a></li>
        <li><a href="#walks">Где я гуляю</a></li>
        <li><a href="#song">Песня для прогулок</a></li>
      </ul>
      <section>
        <h2 id="toy">Моя любимая игрушка</h2>
        <p data-toy-id="17">Это канат с мячиком. Хозяин бросает его, а я приношу обратно — <em>почти</em> всегда. <a href="pages/toys.html">Посмотреть все игрушки Тони</a>.</p>
        <figure>
          <img src="assets/tony-toy.png" alt="Тони сидит и держит в зубах канат с красным мячиком" width="300" height="400" title="Мой канат &quot;Удав&quot;">
          <figcaption>Я и мой канат «Удав»</figcaption>
        </figure>
        <p><a href="assets/tony-toy.png" download>Скачать фотографию</a></p>
        <p>Подробнее о моей породе — в статье <a href="https://ru.wikipedia.org/wiki/Карликовый_пинчер" target="_blank">«Карликовый пинчер» в Википедии</a>.</p>
        <hr>
        <p>Вечером игра закончилась. Канат остался на полу, а я свернулся калачиком в кресле.</p>
      </section>
      <section>
        <h2>Мой стишок</h2>
        <p>
          Я маленький, но смелый,<br>
          Гуляю целый день,<br>
          А вечером на кресле<br>
          Сплю — и мне не лень.
        </p>
      </section>
      <section>
        <h2 id="commands">Команды, которые я знаю</h2>
        <p>Хозяин научил меня командам на немецком:</p>
        <dl>
          <dt lang="de">Sitz!</dt>
          <dd>сидеть</dd>
          <dt lang="de">Platz!</dt>
          <dd>лежать</dd>
          <dt lang="de">Fuß!</dt>
          <dd>рядом</dd>
        </dl>
        <details>
          <summary>Почему команды на немецком?</summary>
          <p>Карликовый пинчер — немецкая порода, и хозяину понравилась эта традиция.</p>
        </details>
      </section>
      <section>
        <h2 id="schedule">Мой режим дня</h2>
        <table>
          <caption>Режим дня Тони</caption>
          <thead>
            <tr>
              <th scope="col">Время</th>
              <th scope="col">Будни</th>
              <th scope="col">Выходные</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <th scope="row">07:00</th>
              <td>Прогулка, 20 минут</td>
              <td>Сплю</td>
            </tr>
            <tr>
              <th scope="row">08:00</th>
              <td colspan="2">Завтрак</td>
            </tr>
            <tr>
              <th scope="row">13:00</th>
              <td>Жду хозяина и сплю</td>
              <td>Прогулка в парке, 1 час</td>
            </tr>
            <tr>
              <th scope="row">19:00</th>
              <td colspan="2">Ужин</td>
            </tr>
            <tr>
              <th scope="row">21:00</th>
              <td colspan="2">Вечерняя прогулка</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section>
        <h2 id="progress">Мои успехи</h2>
        <p>Учу команду «Апорт»: пройдено 3 занятия из 5. <progress value="3" max="5">3 из 5</progress></p>
        <p>Прогулка сегодня: 40 минут. <meter value="40" min="0" max="90" low="30" high="60" optimum="75">40 из 90 минут</meter></p>
      </section>
      <section>
        <h2 id="walks">Где я гуляю</h2>
        <p>Я люблю гулять в сквере у дома.</p>
        <p>
          <a href="pages/walks.html" target="walk">Маршрут</a> |
          <a href="assets/tony.png" target="walk">Фото с прогулки</a>
        </p>
        <iframe src="pages/walks.html" name="walk" title="Маршрут и фото прогулки Тони" width="320" height="420"></iframe>
        <h3>Видео с прогулки</h3>
        <p>Субтитры помогут, если вы смотрите видео без звука.</p>
        <video width="180" height="320" poster="assets/walk.jpg" controls>
          <source src="assets/walk.mp4" type="video/mp4">
          <track src="assets/ru.vtt" kind="subtitles" srclang="ru" label="Русский" default>
          <p><a href="assets/walk.mp4">Скачать видео</a></p>
        </video>
        <h3>Как я лаю</h3>
        <p>Так я разговариваю с хозяином — у нас целый диалог!</p>
        <audio controls>
          <source src="assets/bark.mp3" type="audio/mpeg">
          <p><a href="assets/bark.mp3">Скачать запись</a></p>
        </audio>
      </section>
      <section>
        <h2 id="song">Песня для прогулок</h2>
        <p>Хозяин включает эту песню, когда мы выходим гулять.</p>
        <iframe width="480" height="270" src="https://www.youtube.com/embed/ojULkWEUsPs?start=17" title="Baha Men — Who Let the Dogs Out" loading="lazy" allow="fullscreen"></iframe>
        <p><a href="https://www.youtube.com/watch?v=ojULkWEUsPs">Baha Men — Who Let the Dogs Out на YouTube</a></p>
      </section>
      <section>
        <h2>Моя любимая книга</h2>
        <p>Хозяин читал мне вслух рассказ <cite>«Каштанка»</cite> Антона Чехова. Он начинается так:</p>
        <figure>
          <blockquote>
            <p>Молодая рыжая собака — помесь таксы с дворняжкой — очень похожая мордой на лисицу, бегала взад и вперёд по тротуару и беспокойно оглядывалась по сторонам.</p>
          </blockquote>
          <figcaption>— Антон Чехов, <cite>«Каштанка»</cite></figcaption>
        </figure>
      </section>
      <p><a href="#top">Наверх</a></p>
    </main>
    <footer>
      <p><small>&copy; 2026 Тони и его хозяин</small></p>
      <address>Написать хозяину Тони: <a href="mailto:tony@example.com">tony@example.com</a></address>
    </footer>
  </body>
</html>
pages/signup.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="Запишитесь на совместную прогулку с карликовым пинчером Тони.">
    <title>Запись на прогулку с Тони</title>
    <link rel="stylesheet" href="../css/style.css">
  </head>
  <body>
    <header>
      <nav>
        <ul>
          <li><a href="../index.html">Главная</a></li>
          <li><a href="toys.html">Мои игрушки</a></li>
          <li><a href="signup.html">Запись на прогулку</a></li>
        </ul>
      </nav>
    </header>
    <main>
      <h1>Запись на прогулку</h1>
      <p>Гуляйте вместе с Тони! Оставьте заявку, и хозяин Тони напишет вам, чтобы договориться о встрече.</p>
      <p><a href="../index.html#walks">Где мы гуляем</a></p>
      <form>
        <fieldset>
          <legend>О вас</legend>
          <p>
            <label for="owner">Ваше имя</label>
            <input type="text" id="owner" name="owner" autocomplete="name" required>
          </p>
          <p>
            <label for="email">Электронная почта</label>
            <input type="email" id="email" name="email" autocomplete="email" placeholder="anna@example.com" required>
          </p>
        </fieldset>
        <fieldset>
          <legend>Ваша собака</legend>
          <p>
            <label for="breed">Порода</label>
            <input type="text" id="breed" name="breed" list="breeds">
            <datalist id="breeds">
              <option value="Карликовый пинчер"></option>
              <option value="Такса"></option>
              <option value="Йоркширский терьер"></option>
              <option value="Беспородная"></option>
            </datalist>
          </p>
          <p>
            <label for="dogs">Сколько собак придёт</label>
            <input type="number" id="dogs" name="dogs" min="1" max="3" value="1">
          </p>
        </fieldset>
        <fieldset>
          <legend>Когда гулять</legend>
          <p>
            <label for="date">Дата</label>
            <input type="date" id="date" name="date" required>
          </p>
          <label><input type="radio" name="time" value="morning" checked> Утром</label>
          <label><input type="radio" name="time" value="evening"> Вечером</label>
        </fieldset>
        <fieldset>
          <legend>Прогулка</legend>
          <p>
            <label for="leader">Ведёт прогулку</label>
            <input type="text" id="leader" name="leader" value="Тони" readonly>
          </p>
          <p>
            <label for="route">Маршрут</label>
            <select id="route" name="route">
              <optgroup label="В городе">
                <option value="square">Сквер у дома</option>
                <option value="pond" selected>Пруд с утками</option>
              </optgroup>
              <optgroup label="За городом">
                <option value="forest">Лес</option>
                <option value="river" disabled>Берег реки — закрыт до весны</option>
              </optgroup>
            </select>
          </p>
          <p>
            <label for="wishes">Пожелания</label><br>
            <textarea id="wishes" name="wishes" rows="4" cols="40" maxlength="300" placeholder="Например: моя собака боится велосипедов"></textarea>
          </p>
        </fieldset>
        <fieldset>
          <legend>Что взять с собой</legend>
          <label><input type="checkbox" name="take" value="ball"> Мячик</label>
          <label><input type="checkbox" name="take" value="rope"> Канат</label>
        </fieldset>
        <p>
          <button type="submit">Записаться на прогулку</button>
          <button type="reset">Очистить форму</button>
        </p>
      </form>
    </main>
    <footer>
      <p><small>&copy; 2026 Тони и его хозяин</small></p>
      <address>Написать хозяину Тони: <a href="mailto:tony@example.com">tony@example.com</a></address>
    </footer>
  </body>
</html>
pages/toys.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="Любимые игрушки Тони и правила игры в канат.">
    <title>Игрушки Тони</title>
    <link rel="stylesheet" href="../css/style.css">
  </head>
  <body>
    <header>
      <nav>
        <ul>
          <li><a href="../index.html">Главная</a></li>
          <li><a href="toys.html">Мои игрушки</a></li>
          <li><a href="signup.html">Запись на прогулку</a></li>
        </ul>
      </nav>
    </header>
    <main>
      <h1>Мои игрушки</h1>
      <ul>
        <li>Канат с мячиком «Удав» — моя любимая игрушка</li>
        <li>Резиновая косточка — для вечеров, когда гулять уже поздно</li>
        <li>Пищащий ёжик — его я прячу <del>под диваном</del> <ins>в своей лежанке</ins></li>
      </ul>
      <img src="../assets/tony.png" alt="Тони сидит и смотрит в камеру" width="300" height="400">
      <h2>Как играть со мной в канат</h2>
      <ol>
        <li>Покажите мне канат.</li>
        <li>Бросьте его подальше.</li>
        <li>Подождите, пока я принесу его обратно.</li>
        <li>Похвалите меня — и всё сначала!</li>
      </ol>
      <section>
        <h2 id="album">Мой фотоальбом</h2>
        <ul>
          <li>
            <figure>
              <img src="../assets/album-puppy.png" alt="Тони-щенок сидит и смотрит в камеру" width="300" height="400">
              <figcaption>Я в детстве</figcaption>
            </figure>
          </li>
          <li>
            <figure>
              <img src="../assets/album-squirrel.png" alt="Тони лежит в обнимку с плюшевой белкой" width="300" height="400">
              <figcaption>С плюшевой белкой</figcaption>
            </figure>
          </li>
          <li>
            <figure>
              <img src="../assets/album-hoodie.png" alt="Тони стоит в бежевой толстовке с капюшоном" width="300" height="400">
              <figcaption>В худи для холодной погоды</figcaption>
            </figure>
          </li>
          <li>
            <figure>
              <img src="../assets/album-harness.png" alt="Тони в оранжевой шлейке ждёт прогулку" width="300" height="400">
              <figcaption>Шлейка надета — идём гулять!</figcaption>
            </figure>
          </li>
          <li>
            <figure>
              <img src="../assets/album-laugh.png" alt="Тони лежит, запрокинув голову, и широко открыл пасть, будто смеётся" width="300" height="400">
              <figcaption>Смеюсь над шуткой хозяина</figcaption>
            </figure>
          </li>
          <li>
            <figure>
              <img src="../assets/album-sleep.png" alt="Тони спит, положив голову на лапы" width="300" height="319">
              <figcaption>После прогулки</figcaption>
            </figure>
          </li>
        </ul>
      </section>
      <p><a href="../index.html#commands">Какие команды я знаю</a></p>
      <p><a href="../index.html">Вернуться на главную</a></p>
    </main>
    <footer>
      <p><small>&copy; 2026 Тони и его хозяин</small></p>
      <address>Написать хозяину Тони: <a href="mailto:tony@example.com">tony@example.com</a></address>
    </footer>
  </body>
</html>
pages/walks.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="Маршрут прогулки Тони: сквер, пруд и поляна для игры с канатом.">
    <title>Где гуляет Тони</title>
    <link rel="stylesheet" href="../css/style.css">
  </head>
  <body>
    <h1>Мой маршрут</h1>
    <ol>
      <li>Сквер у дома.</li>
      <li>Пруд с утками.</li>
      <li>Поляна для игры с канатом.</li>
    </ol>
  </body>
</html>

Продолжите в VS Code

Внесите те же изменения в css/style.css своей папки my-site, сохраните файл и откройте главную страницу в браузере. Если результат отличается, нажмите в редакторе «Показать решение» и сравните его со своим кодом.

Дополнительная задача

Оформите афишу «Ночь короткого кино» тремя цветами: красным, чёрным и белым. Хотя бы по одному разу используйте именованный цвет, шестнадцатеричное значение и функцию rgba().

Ожидаемый результат: на странице только красный, чёрный и белый цвета, а в CSS встречаются все три записи цвета. Выделите название события, сохранив читаемость описания и времени встречи. Сочетания могут быть любыми, но проверьте контраст: красный текст на чёрном фоне (5.25:1) читается, а красный на белом (4:1) подходит только для крупного заголовка. В решении — один из вариантов.

Выполните дополнительную задачу

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8">
    <title>Дополнительное задание</title>
    <style>

    </style>
  </head>
  <body>
    <h2>Ночь короткого кино</h2>
    <p>Пять коротких историй и один строгий кинокритик — Тони. Фильм про белку уже получил пять лап из пяти.</p>
    <p><b>Суббота, 19:00.</b> Малый зал. Вход свободный. Место у прохода занято: Тони ждёт, когда выведут главного героя.</p>
  </body>
</html>