Добавляют ли псевдоэлементы узлы в DOM

Ответ

Псевдоэлементы (::before, ::after и др.) создаются CSS-движком и добавляются в виртуальное DOM-дерево, но не являются частью реального DOM. Они существуют только в области отображения (рендеринга) и не доступны через стандартные DOM-методы, такие как querySelector, если не указан их тип.

Пример:

.element::before {
  content: "→";
  color: red;
}

Хотя псевдоэлемент визуально присутствует, в DOM его нет. Однако, можно получить его стили через getComputedStyle().

Особенности:

  • Нельзя выбрать через JS без указания типа (::before)
  • Не участвуют в DOM-событиях
  • Не влияют на структуру DOM-дерева
  • Содержимое (content) доступно только для чтения через CSSOM

Ответ 18+ 🔞

А, слушай, вот эта вся хуйня с псевдоэлементами ::before и ::after — это вообще отдельный цирк, ёпта! Представь: CSS-движок, как какой-нибудь волшебник-хуёвник, на лету создаёт эти штуки и суёт их в виртуальное дерево для отрисовки. Но в реальный-то DOM, в эту нашу священную структуру, он их нихуя не добавляет! Они как призраки, блядь — вроде есть, а потрогать нельзя.

Вот смотри, пишешь ты в стилях:

.element::before {
  content: "→";
  color: red;
}

И в браузере эта красная стрелочка торчит, все её видят. А ты возьми и попробуй её через document.querySelector поймать — нихуя! Пустота! Она же в DOM-дереве не живёт, она только в рендере болтается, хитрая жопа.

Но есть же нюансы, ёбана!

  • Выбрать её наскоком не выйдет. Только если явно указать, что ты ловишь именно ::before, но и то — не везде и не всегда.
  • События на них не вешаются. Кликнул по такому псевдоблочку — а в ответ тишина, он же не в DOM-событиях участвует, мудак бестелесный.
  • Дерево DOM они не ломают. Никаких неожиданных детей у твоего элемента не появится, всё чисто.
  • А вот прочитать, что у него в content написано — можно, блядь! Через getComputedStyle() подкрадешься и вытащишь. Но только прочитать, ёпта, изменить — ни хуя. Только для чтения, через CSSOM.

Вот такие пироги с псевдокотятами. Выглядят как часть страницы, а на деле — просто рисованная хуйня на холсте браузера.