← Назад к вопросам

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

1.0 Junior🔥 201 комментариев
#HTML и CSS

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

Псевдокласс в CSS — это ключевое слово, которое добавляется к селектору для определения специального состояния элемента. Это позволяет стилизовать элементы на основе их динамического состояния или положения в DOM, без использования JavaScript.

Синтаксис

Псевдокласс записывается через одинарное двоеточие (:):

селектор:псевдокласс {
  свойство: значение;
}

/* Пример */
a:hover {
  color: red;
}

Основные псевдоклассы

1. Состояния элементов

/* При наведении мышки */
a:hover {
  text-decoration: underline;
}

/* При клике (активное состояние) */
button:active {
  transform: scale(0.98);
}

/* Фокус (при табуляции или клике) */
input:focus {
  outline: 2px solid blue;
  border-color: blue;
}

/* Посещённая ссылка */
a:visited {
  color: purple;
}

/* Отключённый элемент */
button:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

/* Элемент в состоянии невалидности */
input:invalid {
  border-color: red;
}

/* Элемент в состоянии валидности */
input:valid {
  border-color: green;
}

2. Структурные псевдоклассы (положение в DOM)

/* Первый дочерний элемент */
li:first-child {
  font-weight: bold;
}

/* Последний дочерний элемент */
li:last-child {
  margin-bottom: 0;
}

/* N-ый элемент (нумерация с 1) */
li:nth-child(2) {
  background: yellow;
}

/* Чётные элементы */
li:nth-child(even) {
  background: #f0f0f0;
}

/* Нечётные элементы */
li:nth-child(odd) {
  background: white;
}

/* Только один дочерний элемент */
p:only-child {
  color: blue;
}

/* Первый элемент своего типа */
h1:first-of-type {
  margin-top: 0;
}

3. Логические псевдоклассы

/* Отрицание (противоположность) */
button:not(:disabled) {
  cursor: pointer;
}

/* Один из нескольких селекторов совпадает */
input:is(.required, .mandatory) {
  border: 2px solid red;
}

/* Все селекторы внутри должны совпадать */
a:where(.active, .current) {
  color: red;
}

4. Целевые псевдоклассы

/* Элемент, на который указывает якорь */
#section1:target {
  background: yellow;
  padding: 10px;
}

5. Форма и интерактивность

/* Пустое поле ввода */
input:empty {
  background: #f9f9f9;
}

/* Элемент, который может быть отмечен */
input:checked {
  background: blue;
}

/* Фокус виден пользователю (не через JavaScript) */
button:focus-visible {
  outline: 3px solid blue;
}

Практические примеры

Пример 1: Навигационное меню

navigation a {
  color: black;
  text-decoration: none;
  padding: 10px 15px;
  border-bottom: 2px solid transparent;
  transition: all 0.3s ease;
}

navigation a:hover {
  color: white;
  background: #333;
  border-bottom-color: blue;
}

navigation a:active {
  transform: translateY(1px);
}

navigation a:focus-visible {
  outline: 2px solid blue;
  outline-offset: 2px;
}

Пример 2: Форма с валидацией

input {
  border: 2px solid #ccc;
  padding: 8px;
  font-size: 16px;
}

input:focus {
  border-color: blue;
  outline: none;
  box-shadow: 0 0 5px rgba(0, 0, 255, 0.3);
}

input:valid {
  border-color: green;
}

input:invalid {
  border-color: red;
}

input:disabled {
  background: #f0f0f0;
  cursor: not-allowed;
}

Пример 3: Список с чередованием

ul {
  list-style: none;
  padding: 0;
}

li {
  padding: 10px;
  border-bottom: 1px solid #eee;
}

li:nth-child(odd) {
  background: white;
}

li:nth-child(even) {
  background: #f9f9f9;
}

li:first-child {
  border-top: 1px solid #eee;
  border-radius: 4px 4px 0 0;
}

li:last-child {
  border-bottom: 1px solid #eee;
  border-radius: 0 0 4px 4px;
}

li:hover {
  background: #e8f4f8;
}

Пример 4: Кнопка с интерактивностью

button {
  padding: 10px 20px;
  background: #007bff;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  transition: all 0.2s ease;
}

button:hover {
  background: #0056b3;
  transform: translateY(-2px);
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}

button:active {
  background: #003d82;
  transform: translateY(0);
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}

button:disabled {
  background: #ccc;
  cursor: not-allowed;
  transform: none;
}

button:focus-visible {
  outline: 2px solid blue;
  outline-offset: 2px;
}

Разница между :focus и :focus-visible

/* :focus — срабатывает при любом фокусе (включая клик мышкой) */
input:focus {
  border-color: blue;
}

/* :focus-visible — срабатывает только при фокусе через клавиатуру */
/* Рекомендуется для лучшей доступности */
input:focus-visible {
  outline: 2px solid blue;
}

Новые и прогрессивные псевдоклассы

/* Элемент в режиме чтения/просмотра */
.modal:fullscreen {
  background: black;
}

/* Соответствует состоянию медиа-запроса */
@media (prefers-color-scheme: dark) {
  body {
    background: #1a1a1a;
  }
}

/* Локальный якорь (новое в CSS) */
#target:target {
  scroll-margin-top: 100px;
}

Разница: псевдокласс vs псевдоэлемент

/* Псевдокласс (:) — состояние элемента */
a:hover { /* При наведении на ссылку */ }

/* Псевдоэлемент (::) — части элемента */
p::first-line { /* Первая строка параграфа */ }
p::before { /* До содержимого */ }

Доступность (Accessibility)

/* Важно: используй :focus-visible вместо :focus */
/* Это улучшает доступность для пользователей клавиатуры */
button {
  /* Не удаляй outline, а стилизируй его красиво */
}

button:focus-visible {
  outline: 3px solid #4A90E2;
  outline-offset: 2px;
}

Браузерная совместимость

/* :hover, :focus, :active — поддержка везде */
a:hover { }

/* :nth-child(), :last-child — поддержка везде */
li:nth-child(2n) { }

/* :focus-visible — поддержка в современных браузерах */
input:focus-visible { }

/* :where() — новое, требует проверки поддержки */
a:where(.active) { }

Вывод: псевдоклассы — это мощный инструмент CSS для стилизации элементов в зависимости от их состояния и положения, позволяющий создавать интерактивные и доступные веб-интерфейсы без JavaScript.

Что такое псевдокласс в CSS? | PrepBro