
Псевдокласс :first-child применяется для выбора элемента, который является первым дочерним узлом своего родителя. Он не учитывает тип тега, класс или назначение элемента – решающим фактором остается его позиция в структуре DOM. Это делает :first-child чувствительным к разметке и порядку элементов, включая текстовые узлы и комментарии.
Частая ошибка при использовании :first-child связана с ожиданием, что он выберет первый элемент определенного типа. На практике псевдокласс срабатывает только тогда, когда целевой элемент действительно стоит первым среди всех дочерних узлов. Если перед ним находится другой тег, текст или перенос строки, правило не применится, даже если визуально элемент выглядит первым.
Псевдокласс активно используется при стилизации списков, навигационных меню, таблиц и форм, где важно задать отдельные правила для начального элемента без добавления лишних классов в HTML. Однако для корректной работы требуется точное понимание вложенности и реального порядка узлов, который браузер формирует при разборе разметки.
Грамотное применение :first-child упрощает CSS-код и снижает зависимость от дополнительной семантики в HTML, но требует аккуратной верстки и проверки структуры документа. В сложных макетах его часто комбинируют с другими селекторами, чтобы избежать неожиданного поведения.
Псевдокласс CSS :first-child – что это и как работает

При анализе структуры браузер учитывает все типы узлов, включая текст, пробелы и комментарии. Даже один перенос строки между открывающим тегом контейнера и первым элементом может привести к тому, что нужный элемент перестанет считаться первым. Поэтому для предсказуемой работы :first-child разметка должна быть компактной и лишенной случайных текстовых узлов.
Селектор используется как часть более сложного выражения и всегда зависит от контекста родителя. Например, правило ul li:first-child будет применяться к первому элементу каждого списка, а не ко всем элементам на странице. Это позволяет управлять стилями внутри повторяющихся блоков без дублирования классов.
Псевдокласс подходит для задач, где важен именно порядок элементов: убирание отступов у первого пункта, изменение границы первой ячейки или настройка внешнего вида начального блока в контейнере. При необходимости выбора первого элемента конкретного типа следует учитывать, что :first-child не проверяет имя тега и не предназначен для таких сценариев.
Как :first-child определяет первый дочерний элемент в DOM
Псевдокласс :first-child проверяет позицию элемента внутри списка дочерних узлов родителя, сформированного браузером при разборе HTML. В расчет берется реальный порядок узлов в DOM-дереве, а не визуальное расположение на странице или логика верстальщика. Элемент считается подходящим только при полном совпадении условия – он должен идти первым без каких-либо узлов перед ним.
DOM-структура включает не только элементы, но и текстовые узлы. Любой пробел, перенос строки или комментарий между открывающим тегом родителя и первым вложенным элементом создает отдельный узел. Если такой узел присутствует, следующий за ним элемент теряет статус первого дочернего, и правило с :first-child не применяется.
Проверка выполняется для каждого родительского элемента отдельно. При использовании селектора вида .container p:first-child браузер анализирует содержимое каждого контейнера и выбирает абзац только в том случае, если он расположен первым среди всех узлов внутри конкретного блока. Это поведение не распространяется на соседние контейнеры.
Для стабильной работы псевдокласса рекомендуется минимизировать пустые текстовые узлы в разметке и внимательно контролировать вложенность элементов. При работе с шаблонами или компонентами следует учитывать, что автоматическое форматирование HTML может повлиять на порядок узлов и изменить результат применения :first-child.
Чем :first-child отличается от :first-of-type на практике

Если внутри блока первым идет, например, span, а за ним p, то селектор p:first-child не применится, так как абзац не является первым узлом. В аналогичной ситуации p:first-of-type будет выбран, поскольку он первый элемент своего типа среди других абзацев, независимо от наличия тегов другого вида перед ним.
На практике :first-child подходит для сценариев, где важен строгий порядок элементов, например, при управлении отступами или границами в списках. :first-of-type чаще используется в контентных блоках, где структура не гарантирует однородность тегов, но требуется стилизовать начальный элемент определенного типа.
При выборе псевдокласса рекомендуется заранее анализировать состав контейнера. Если разметка может изменяться или дополняться новыми элементами, использование :first-of-type снижает зависимость от порядка узлов, тогда как :first-child требует полного контроля над структурой DOM.
Вопрос-ответ:
Почему :first-child не применяется к элементу, который визуально расположен первым?
Псевдокласс ориентируется не на отображение, а на порядок узлов в DOM. Если перед элементом есть текстовый узел, перенос строки или комментарий, браузер считает его первым дочерним, из-за чего правило не срабатывает. Для проверки нужно посмотреть структуру DOM в инструментах разработчика и убедиться, что перед целевым элементом нет других узлов.
Можно ли использовать :first-child для выбора первого элемента определённого тега?
Нет, :first-child не анализирует тип тега. Он проверяет только позицию среди всех дочерних узлов. Если требуется выбрать первый элемент конкретного типа, следует использовать :first-of-type или комбинировать селектор с более строгими условиями разметки.
Почему переносы строк в HTML влияют на работу :first-child?
Перенос строки между тегами интерпретируется браузером как текстовый узел. Такой узел становится первым дочерним элементом родителя, смещая остальные. Это типичная причина, по которой :first-child не срабатывает в аккуратно отформатированном, но не уплотнённом HTML-коде.
Как правильно применять :first-child в списках меню?
Селектор вида ul li:first-child применяется к первому пункту каждого списка. При этом важно, чтобы внутри ul не было текстовых узлов перед первым li. Лучший вариант — размещать элементы списка без пробелов и переносов перед ними либо проверять результат через DOM-инспектор.
Подходит ли :first-child для работы с динамически добавляемыми элементами?
Да, псевдокласс обрабатывается браузером автоматически при изменении DOM. Если новый элемент добавляется в начало контейнера, именно он станет первым дочерним, и стили с :first-child будут применены к нему без дополнительного кода.
Почему селектор .block p:first-child не срабатывает, хотя абзац идет первым в коде?
Чаще всего причина связана с наличием текстового узла между открывающим тегом .block и тегом p. Перенос строки или пробел создают отдельный узел, который браузер размещает перед абзацем. В результате p перестает быть первым дочерним элементом. Решение — убрать лишние пробелы в разметке или проверить структуру DOM через инструменты разработчика.
Можно ли комбинировать :first-child с псевдоклассами состояний, например :hover?
Да, такие комбинации поддерживаются. Например, li:first-child:hover применяется только к первому элементу списка при наведении курсора. При этом сначала проверяется позиция элемента среди дочерних узлов, и только после этого учитывается состояние. Если элемент перестает быть первым, правило не будет работать независимо от наведения.
