В чем разница между Псевдоклассом и Псевдоэлементом в CSS

Ответ

Псевдоклассы (:hover, :active, :nth-child()) применяют стили к элементам в определенном состоянии или позиции в DOM. Псевдоэлементы (::before, ::after, ::first-line) создают виртуальные элементы, которых нет в разметке.

/* Псевдокласс - стиль при наведении */
button:hover {
  background: red;
}

/* Псевдоэлемент - создает контент перед элементом */
button::before {
  content: "★";
}

Ключевые отличия:

  1. Псевдоклассы — одно двоеточие (:), псевдоэлементы — два (::), хотя старые браузеры поддерживают и : для псевдоэлементов.
  2. Псевдоклассы меняют существующие элементы, псевдоэлементы добавляют новые.
  3. Псевдоэлементы могут иметь content, псевдоклассы — нет.

Ответ 18+ 🔞

А, слушай, про эти ваши псевдоклассы и псевдоэлементы! Ну, это ж классика, блядь, хуй запутаешься, если не понимать, в чём подвох.

Смотри, вот представь: псевдокласс — это как состояние твоей башки в пятницу вечером. Вот элемент есть, он лежит себе в разметке, нормальный такой button. А ты на него наводишь курсор — и он, сука, меняется! Становится красным, потому что у него сработал псевдокласс :hover. То есть это не новый элемент, это он сам, просто в другом, ебучем, состоянии. :active — это когда ты на него уже кликнул и держишь, :nth-child(3) — это когда он третий по счёту у своей мамки-родителя. Всё просто, блядь.

А псевдоэлементы — это уже, ёпта, чистая магия, нахуй. Их в разметке-то вообще нет! Это как призраки, которых ты материализуешь стилями. Вот есть у тебя та же кнопка. А ты такой: «А добавь-ка ты, сука, перед собой звёздочку!». И она, блядь, добавляет! Через ::before { content: "★"; }. Или после текста (::after) какую-нибудь хуйню. Или первой строке параграфа (::first-line) цвет меняет. Это уже новые, виртуальные элементы, их CSS породил из ниоткуда, ядрёна вошь!

Короче, запомни две главные вещи, чтобы не быть, прости господи, полупидором на собеседовании:

  1. Синтаксис, блядь. Псевдоклассы — одно двоеточие (:), типа :hover. Псевдоэлементы — в идеале два (::), типа ::before. Хотя старые браузеры жрут и одно, но ты-то будь умнее, пиши правильно.
  2. Суть, ебать. Псевдокласс — это состояние существующего элемента. Псевдоэлемент — это новый элемент, которого изначально не было. И да, только у псевдоэлементов может быть свойство content, иначе они, блядь, не появятся!

Вот и вся разница. Не усложняй, а то голова заболит.

/* Это псевдокласс - кнопка СТАЛА красной при наведении */
button:hover {
  background: red;
}

/* А это псевдоэлемент - кнопка СОЗДАЛА звёздочку перед собой */
button::before {
  content: "★";
}