🔒 Ты не вошёл(вошла) в аккаунт — прогресс, работы и результаты теста не сохраняются. Что недоступно?

✅ Без входа можно

  • читать все 33 занятия, смотреть слайды и шпаргалку;
  • пробовать код в редакторе и песочнице.

⛔ Без входа нельзя

  • сохранять работы — черновик живёт только в этом браузере и пропадёт при очистке истории, в режиме инкогнито или на другом устройстве;
  • отмечать пройденные занятия и видеть свой прогресс;
  • выбрать тему итогового проекта и отмечать чек-лист;
  • отправить итоговый тест и сохранить результат.
Модуль 2. CSS и оформление Занятие 19

Ссылки и кнопки

Сегодня мы сделаем «живые» кнопки и меню, которые реагируют на наведение мыши и нажатие.

Изучаем: :hover, :active, :focus
Результат: Стильное меню и кнопки

🎬 Слайды для урока Листай стрелками ← →, F — весь экран, N — подсказки

👀 Сегодня сделаем вот такое

Показать код примера
<nav class="menu">
  <a href="#">Главная</a>
  <a href="#">Галерея</a>
  <a href="#">Контакты</a>
</nav>

<p><input type="text" placeholder="Поиск..."></p>
<button class="btn">Нажми меня</button>
body {
  font-family: sans-serif;
  padding: 20px;
}
.menu {
  display: flex;
  gap: 8px;
}
.menu a {
  padding: 10px 18px;
  border-radius: 8px;
  color: #2d3436;
  text-decoration: none;
  transition: 0.3s;
}
.menu a:hover {
  background: #fdcb6e;
}
input {
  padding: 10px;
  border: 2px solid #b2bec3;
  border-radius: 8px;
}
input:focus {
  border-color: #6c5ce7;
  outline: 3px solid #a29bfe;
}
.btn {
  padding: 14px 28px;
  font-size: 18px;
  color: white;
  background: #00b894;
  border: none;
  border-radius: 12px;
  box-shadow: 0 6px 0 #00795f;
  cursor: pointer;
  transition: 0.1s;
}
.btn:hover {
  background: #00cec9;
}
.btn:active {
  transform: translateY(6px);
  box-shadow: none;
}

💡 Объяснение

Элементы, которые «отвечают»

Хороший сайт реагирует на действия человека: кнопка слегка меняет цвет при наведении, «вдавливается» при нажатии, поле ввода подсвечивается, когда в нём курсор. Такие мелочи подсказывают: «на меня можно нажать», «я тебя слышу». Всё это делается на чистом CSS с помощью псевдоклассов.

Что такое псевдокласс

Псевдокласс описывает состояние элемента, а не его имя. Пишется через двоеточие сразу после селектора, без пробела:

a:hover {
  color: tomato;
}

Читается так: «ссылка, когда на неё навели мышь».

Главные псевдоклассы состояний

  • :hover — курсор мыши находится над элементом. На телефонах наведения нет, поэтому важное действие не должно зависеть только от hover.
  • :active — элемент нажимают прямо сейчас (кнопка мыши зажата).
  • :focus — элемент в фокусе: курсор в поле ввода или к кнопке перешли клавишей Tab.
  • :focus-visible — фокус, который нужно показать (при переходе с клавиатуры), но не при клике мышью.
  • :visited — ссылка, по которой уже переходили.
  • :checked — отмеченный checkbox или radio.
  • :disabled — отключённое поле или кнопка.

Если используешь несколько состояний ссылки, пиши их в порядке LoVe HAte: :link, :visited, :hover, :active — иначе одни перебьют другие.

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

  • li:first-child — первый ребёнок;
  • li:last-child — последний ребёнок (например, убрать линию после последнего пункта);
  • li:nth-child(2) — второй ребёнок;
  • tr:nth-child(even) — чётные строки (полосатая таблица), odd — нечётные.

Как сделать ссылку похожей на кнопку

.menu a {
  padding: 10px 18px;
  border-radius: 8px;
  color: #2d3436;
  text-decoration: none;   /* убираем подчёркивание */
}
.menu a:hover {
  background: #fdcb6e;
}

Ссылки строчные, поэтому padding у них раздвигает фон, но не соседние строки. Если нужна кнопка с фиксированной шириной — добавь display: inline-block.

Плавность: transition

Без плавности цвет меняется мгновенно — резко. Свойство transition делает изменение анимированным:

.btn {
  background: #00b894;
  transition: background 0.3s;
}
.btn:hover {
  background: #00cec9;
}
  • transition: 0.3s; — плавно менять все свойства за 0,3 секунды;
  • transition: background 0.3s, transform 0.2s; — разные свойства с разной скоростью.

Важно: transition пишут в обычное состояние, а не в :hover, — тогда плавным будет и появление эффекта, и его исчезновение. Хорошая длительность — 0,15–0,4 секунды. Дольше — сайт кажется медленным.

Эффекты с transform

  • transform: scale(1.05) — увеличить на 5%;
  • transform: translateY(-4px) — приподнять на 4 пикселя;
  • transform: rotate(3deg) — повернуть.

Transform не сдвигает соседей, поэтому отлично подходит для эффектов наведения.

Кнопка, которая «вдавливается»

.btn {
  box-shadow: 0 6px 0 #00795f;   /* «толщина» кнопки */
  transition: 0.1s;
}
.btn:active {
  transform: translateY(6px);    /* опускаем на толщину */
  box-shadow: none;
}

Не забывай о клавиатуре

Многие люди (с нарушениями моторики, опытные пользователи) управляют сайтом клавишей Tab. Браузер показывает рамку вокруг элемента в фокусе. Никогда не пиши outline: none без замены — человек потеряет, где находится. Лучше оформи фокус красиво: :focus-visible { outline: 3px solid #a29bfe; }.

Ещё правило: cursor: pointer (рука) — только для того, на что действительно можно нажать.

Частые ошибки

  • Пробел перед двоеточием: a :hover — это другой селектор, и он не работает как ожидается.
  • transition только в :hover — эффект исчезает резко.
  • Убран outline у фокуса — сайтом нельзя пользоваться с клавиатуры.
  • При hover меняется размер шрифта или padding — соседние элементы «прыгают». Используй transform.

Проверь себя

  1. Чем :hover отличается от :active?
  2. Куда нужно писать transition — в обычный стиль или в :hover? Почему?
  3. Как сделать полосатую таблицу?

⌨️ Практика

  1. Убери подчёркивание у ссылок меню и оформи их как кнопки.
  2. Сделай, чтобы при наведении менялся фон пункта меню.
  3. Сделай большую кнопку, которая «вдавливается» при нажатии.
  4. Добавь полю ввода яркую рамку при фокусе.
  5. Сделай все переходы плавными с transition.

🧪 Редактор

🪞 Рефлексия

  • Что нового я сегодня узнал(а)?
  • Что получилось лучше всего?
  • Где было трудно и что поможет в следующий раз?

🔒 Отметить занятие пройденным можно только после входа. Без аккаунта сайт не запомнит, до какого занятия ты дошёл(дошла). Регистрация · Вход