<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[CSS first-child не работает: причины и как исправить быстро]]></title><description><![CDATA[<p dir="auto">Многим разработчикам знакома ситуация, когда селектор <strong>:first-child</strong> в CSS просто игнорируется. Элемент не стилизуется, хотя по логике должен быть первым. Эта статья разберет типичные ошибки и покажет, как правильно использовать псевдокласс.</p>
<p dir="auto">Разобраться в проблеме полезно, чтобы сэкономить часы на отладку. Вы узнаете, почему <strong>first-child</strong> считает все дочерние элементы родителя, а не только нужного класса. Плюс получите готовые решения для реальных задач в верстке.</p>
<h2>Как работает :first-child и почему он подводит</h2>
<p dir="auto">Селектор <strong>:first-child</strong> выбирает первый дочерний элемент внутри родителя, независимо от его класса или типа. Если перед вашим блоком стоит другой элемент - даже пустой div или пробел - first-child применится к нему, а не к тому, что вы ожидали. Это базовое поведение CSS, описанное в спецификациях.</p>
<p dir="auto">Представьте разметку с контейнером row, где первый div с классом col-6, а потом идут outer_box. Селектор .outer_box:first-child не сработает, потому что первый ребенок - col-6. Браузер парсит элементы строго по порядку в DOM. Поэтому стили игнорируются.</p>
<p dir="auto">Вот типичный пример кода, где все ломается:</p>
<pre><code class="language-html">&lt;div class="row"&gt;
  &lt;div class="col-6"&gt;Контент&lt;/div&gt;
  &lt;div class="col-2 outer_box"&gt;Первый бокс&lt;/div&gt;
  &lt;div class="col-2 outer_box"&gt;Второй бокс&lt;/div&gt;
&lt;/div&gt;
</code></pre>
<p dir="auto">CSS .outer_box:first-child { border-right: none; } не сработает - первый outer_box считается вторым ребенком.</p>
<ul>
<li><strong>Проверьте DOM в инспекторе</strong>: Откройте DevTools и посмотрите реальный порядок элементов. Часто там всплывают скрытые пробелы или лишние div.</li>
<li><strong>Учитывайте типы элементов</strong>: :first-child работает со всеми детьми, включая текст и комментарии.</li>
<li><strong>Тестируйте на чистой разметке</strong>: Уберите все лишнее, чтобы увидеть базовое поведение.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Селектор</th>
<th>Что выбирает</th>
<th>Пример проблемы</th>
</tr>
</thead>
<tbody>
<tr>
<td>.box:first-child</td>
<td>Первый ребенок с классом box</td>
<td>Если перед box стоит div - не сработает</td>
</tr>
<tr>
<td>.box:nth-child(2)</td>
<td>Второй ребенок любой разметки</td>
<td>Работает, но привязан к позиции</td>
</tr>
<tr>
<td>div.box:first-of-type</td>
<td>Первый div среди div’ов</td>
<td>Игнорирует другие теги</td>
</tr>
</tbody>
</table>
<h2>Отличия :first-child от :first-of-type и когда их юзать</h2>
<p dir="auto"><strong>:first-of-type</strong> смотрит только на элементы одного типа, игнорируя другие теги. Это решает проблему, когда перед вашим div стоят p или span. Но если несколько div подряд - он выберет первый div, а не первый с классом.</p>
<p dir="auto">В реальных проектах на Bootstrap или аналогах часто мешаются колонки разных размеров. :first-child ломается на первом попавшемся элементе, а :first-of-type может пропустить нужный, если типы смешаны. Поэтому комбинируйте с классами осторожно.</p>
<p dir="auto">Пример: в контейнере три div, но первый - без класса nevrolog. .nevrolog:first-child не сработает, а div.nevrolog:first-of-type может выбрать не тот.</p>
<ul>
<li><strong>:first-child</strong>: Идеален для списков с одинаковыми элементами, где нет мусора.</li>
<li><strong>:first-of-type</strong>: Подходит, когда тип элементов известен, но классы разные. <em>Нюанс: не работает с универсальными селекторами.</em></li>
<li><strong>nth-child(n)</strong>: Для точного позиционирования, когда first-child подводит.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Псевдокласс</th>
<th>Учитывает класс?</th>
<th>Учитывает тип?</th>
<th>Лучше для…</th>
</tr>
</thead>
<tbody>
<tr>
<td>:first-child</td>
<td>Нет</td>
<td>Все дети</td>
<td>Чистых списков</td>
</tr>
<tr>
<td>:first-of-type</td>
<td>Нет</td>
<td>Только тип</td>
<td>Смешанной разметки</td>
</tr>
<tr>
<td>:nth-child(1)</td>
<td>Нет</td>
<td>Все дети</td>
<td>Фиксированной позиции</td>
</tr>
</tbody>
</table>
<h2>Альтернативы :first-child для сложных случаев</h2>
<p dir="auto">Когда first-child не справляется из-за сложной структуры, переходите на <strong>:nth-child</strong> или JS. В CSS3 есть :nth-child(1), который точно бьет по первому ребенку. Для первого элемента с классом используйте комбинации или атрибуты.</p>
<p dir="auto">В мобильной верстке или гридах часто добавляются динамические элементы. Там :first-child ломается на пустых контейнерах. Лучше nth-child(2):first-of-type, если знаете структуру.</p>
<p dir="auto">Пример фикса для outer_box:</p>
<pre><code class="language-css">.row &gt; .outer_box:nth-child(2) { border-right: none; }
</code></pre>
<p dir="auto">Это гарантированно выберет второй outer_box, если он всегда на второй позиции.</p>
<ul>
<li><strong>nth-child с формулой</strong>: :nth-child(odd) для нечетных, an+b для паттернов. <em>Полезно в таблицах.</em></li>
<li><strong>Атрибуты data-first</strong>: Добавьте data-first=“true” к нужному и селектор [data-first].</li>
<li><strong>Flexbox/grid трюки</strong>: order: 0 на первом, чтобы переставить визуально.</li>
<li><strong>JS как запасной</strong>: querySelector(‘.outer_box’) и addClass, если CSS не тянет.</li>
</ul>
<h2>Тестирование и отладка в реальном проекте</h2>
<p dir="auto">Всегда проверяйте селекторы в инспекторе браузера - там видно, к какому элементу применяется стиль. Если :first-child не матчит, ищите предшественников в DOM. Часто проблема в пробелах между тегами или генерируемом контенте.</p>
<p dir="auto">В больших проектах используйте препроцессоры вроде Sass для вложенных селекторов. Но базовые правила CSS остаются - first-child не меняется годами. Тестируйте на разных разрешениях, особенно в responsive.</p>
<pre><code class="language-css">/* Универсальный фикс для первого видимого */
.outer_box { display: none; }
.row &gt; .outer_box:first-of-type { display: block; }
</code></pre>
<ul>
<li><strong>DevTools хак</strong>: Выделите элемент, inspect -&gt; Styles, смотрите specificity.</li>
<li><strong>Кроссбраузер</strong>: :first-child работает везде с IE9+, но тестируйте на мобильных.</li>
<li><strong>Производительность</strong>: Избегайте сложных nth в циклах - браузер тормозит.</li>
</ul>
<h2>Практические кейсы из верстки на каждый день</h2>
<p dir="auto">В Grid-системах первый блок часто без бордера, но с :first-child это ад. Решение - комбо nth-child и классов. Или используйте CSS custom properties для динамики.</p>
<p dir="auto">Остается тема родительских селекторов - их нет в CSS, но :has() в новых браузерах меняет игру. Пока полагайтесь на проверенные хаки. Подумайте о рефакторинге разметки - иногда проще почистить HTML, чем мучится с селекторами.</p>
]]></description><link>https://forum.exlends.ru/topic/806/css-first-child-ne-rabotaet-prichiny-i-kak-ispravit-bystro</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:25:40 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/806.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 27 Feb 2026 06:45:31 GMT</pubDate><ttl>60</ttl></channel></rss>