Выберите самый первый элемент с классом на странице

Проблема очень проста: Я не могу найти способ выбрать (только с помощью css) самый первый элемент на странице с определенным классом.

Например, с помощью этого HTML-кода я хотел бы выбрать первый элемент с классом .elem:

.elem:nth-of-type(1) {
  background-color: yellow;
}
<div class = "wrapper">
  <div class = "elem">elem that I'd like to select</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
</div>

<div class = "wrapper">
  <div class = "elem">Unfortunately, this elem is selected too</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
</div>

Текущее поведение похоже на функцию js querySelectorAll, но ожидаемое поведение — это querySelector:

document.querySelectorAll('.elem:nth-of-type(1)') // Current behavior is like this
document.querySelector('.elem:nth-of-type(1)') // Expected behavior is like this

Существуют ли приемы CSS, которые могут делать то, что я хочу?

Обновлено:

В реальном случае я не знаю HTML-код. Единственное, что я знаю: «Мне нужно выбрать самый первый .elem на странице с помощью CSS».

.elem:first-child?
Roy Bogado 08.04.2019 14:32
«Есть ли приемы CSS, которые могут делать то, что я хочу?» — нет.
04FS 08.04.2019 14:36

@Roy То же поведение, что и в примере, который я написал

Victor Castro 08.04.2019 14:36
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
3
3
168
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Используйте тот же селектор для элемента .wrapper. Или вы можете использовать родителя элемента-оболочки и использовать селектор :first-child.

Также обратите внимание, что nth-of-type будет работать только в том случае, если теги совпадают, а не для классов, как упоминается в других ответах. Если вы всегда хотите выбрать первый элемент внутри первого элемента, тогда body > :first-child > :first-child будет работать для вас.

body > :first-child > :first-child {
  font-size: 24px;
}

.wrapper:nth-of-type(1) .elem:nth-of-type(1) {
  background-color: yellow;
}

.outer-wrapper>.wrapper2:first-child > .elem:first-child {
  background-color: yellow;
}
<div class = "wrapper">
  <div class = "elem">elem that I'd like to select</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
</div>

<div class = "wrapper">
  <div class = "elem">Unfortunately, this elem is selected too</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
</div>

<section class = "outer-wrapper">

  <div class = "wrapper2">
    <p class = "elem">Can be selected if you knowonly the class name</p>
    <p class = "elem">elem</p>
    <p class = "elem">elem</p>
    <p class = "elem">elem</p>
    <p class = "elem">elem</p>
    <p class = "elem">elem</p>
  </div>

  <div class = "wrapper2">
    <p class = "elem">Dont worry this wont be affected</p>
    <p class = "elem">elem</p>
    <p class = "elem">elem</p>
    <p class = "elem">elem</p>
    <p class = "elem">elem</p>
  </div>

</section>

Это работает с этим очень простым примером, но реальный случай заключается в том, что я не знаю HTML-код. Я просто хочу самый первый .elem на странице.

Victor Castro 08.04.2019 14:35

Добавил еще один пример. Если у вас есть класс, вы можете выбрать этот элемент. Вам не нужен тип элемента в этом.

AshTyson 08.04.2019 14:49

Добавлен еще один пример, если вы всегда хотите выбирать первый элемент. Если вы хотите использовать любой другой элемент, используйте n-й ребенок

AshTyson 08.04.2019 15:00

.wrapper:first-child .elem:nth-of-type(1) {
  background-color: yellow;
}
<div class = "wrapper">
  <div class = "elem">elem that I'd like to select</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
</div>

<div class = "wrapper">
  <div class = "elem">Unfortunately, this elem is selected too</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
</div>

выберите с помощью div выберите первый div с классом-оболочкой, используя псевдо: первый дочерний элемент

Только что увидел вашу правку. В этом случае вариант, который будет работать:

.wrapper:first-child .elem:first-child {
  background-color: red;
}

Решение уже предоставлено выше @Mohammed

Вы можете взглянуть на мое упоминание «EDIT» в конце поста :)

Victor Castro 08.04.2019 14:41
Ответ принят как подходящий

Проблема с nth-of-type, first-child, last-child и так далее в том, что отсчет всегда начинается с родителя.

Итак, в вашем примере у вас есть два родительских (.wrapper) класса.

Таким образом, без специального селектора, такого как .wrapper:first-child .elem:first-child, вы не сможете выбрать его универсально.

Вам нужно знать макет страницы, если вы хотите использовать чистый css, чтобы вы могли встроить пути, чтобы выбрать только первый элемент на вашей странице.

Я провел несколько экспериментов с *:first-child > .elem:first-child { border:5px solid red } и body > *:nth-of-type(1) .elem:nth-of-type(1), и они выглядели многообещающе, но у всех есть оговорки. где вам все еще нужно знать макет страницы. Двойные вложенные элементы, несколько слоев вложенных элементов рядом друг с другом могут быть допустимы для css, поэтому я отбросил эти параметры и вернул этот ответ к моему начальному. Самая безопасная ставка — одна строка JavaScript.

Теперь решения, которые вы могли бы реализовать, двояки:

Если вы используете что-то вроде php или node-js для создания своей страницы, вы можете использовать одноразовый переключатель при рендеринге страницы.

$first = true;
foreach($listitem as $item) {
   $output[] = '<div class = "elem';
   if ($first) {
      $first = false;
      $output[] = ' first';
   }
   $output[] = '>elem</div>';
   } 
}

Если вам разрешено использовать одну строку JavaScript, вы можете использовать что-то вроде этого:

document.querySelector('.elem').classList.add('ello');

Но с чистым CSS и без использования очень определенного пути на странице, где появляется первый класс elem, это становится почти невозможным.

document.querySelector('.elem').classList.add('first');
.elem.first {
  background-color: yellow;
}
<div class = "wrapper">
  <div class = "elem">elem that I'd like to select</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
</div>

<div class = "wrapper">
  <div class = "elem">Unfortunately, this elem is selected too</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
  <div class = "elem">elem</div>
</div>

Другие вопросы по теме