Псевдокласс CSS ":is()" с относительными селекторами

Я хочу стилизовать определенные «разделы, которые находятся непосредственно внутри тела» и «разделы, которые находятся непосредственно внутри элемента div непосредственно внутри тела» с помощью псевдокласса «:is()», без избыточности (с относительными селекторами).
У меня есть следующий код в файле index.html:

<!DOCTYPE html>
<html lang = "en">
  <head>
    <meta charset = "UTF-8" />
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0" />
    <link rel = "stylesheet" href = "style.css">
    <title>Test :is() Selector</title>
  </head>
  <body>
    <section>Section directly inside the body (styled).</section>
    <div>
      <section>Section directly inside a div which is directly inside the body (styled).</section>
    </div>
    <div>
      <div>
        <section>Section directly inside a div which is directly inside another div which is directly inside the body (not styled).</section>
      </div>
    </div>
  </body>
</html>

и следующий CSS в файле style.css:

body > :is(section, div > section) {
  background-color: lightblue;
  padding: 10px;
  border: 1px solid blue;
}

Я пробовал искать, но безуспешно, потому что все поиски с псевдоклассом «:is()» и относительными селекторами отправляют меня прямо к документации по относительным селекторам, поскольку «is» — очень распространенное слово без специальных символов. Это мой первый вопрос в стеке (хотя я читаю этот сайт каждый день в течение длительного времени), но мне нужен какой-то сложный селектор без избыточности, который имел бы тот же результат, что и этот CSS:

body > section, body > div > section {
  background-color: lightblue;
  padding: 10px;
  border: 1px solid blue;
}

Где избыточность? Ваш пример is() довольно прост. Вы могли бы сделать то же самое с вложением, но без особой выгоды.

ralph.m 06.06.2024 05:20

Мне не совсем понятно, в чем проблема. Это ваш :is не работает (не воспринимает дочерний раздел div)?

A Haworth 06.06.2024 08:58
:is(body, body > div) > section, кажется, работает.
CBroe 06.06.2024 09:38

@CBroe да, это сработало, я не был уверен насчет использования псевдокласса «:is()», но по ссылкам @Temani Afif ниже я смог понять, вероятно, с этого момента я буду использовать этот псевдокласс больше в родительских селекторах, а не в дочерних селекторах.

NineChu 07.06.2024 01:42

@CBroe Да, этот селектор действительно работает, я подробно изучил, почему в своем ответе, и теперь сам это понимаю лучше 😆

Zach Jensz 07.06.2024 06:15
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в 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. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
5
90
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать & и :is(), как показано ниже:

body {
   :is(&, & > div) > section {
    background-color: lightblue;
    padding: 10px;
    border: 1px solid blue;
  }
}
<section>Section directly inside the body (styled).</section>
<div>
  <section>Section directly inside a div wich is directly insdie the body (styled).</section>
</div>
<div>
  <div>
    <section>Section directly inside a div wich is directly inside another div which is directly inside the body (not styled).</section>
  </div>
</div>

Есть ли у вас идеи, почему :is(&, & > div) > section работает, а написано наоборот: & > :is(div > section, section) нет?

Zach Jensz 06.06.2024 10:11

@ZachJensz stackoverflow.com/a/76839554/8620333

Temani Afif 06.06.2024 10:12

Это именно мой случай: я использовал вложенные селекторы для создания своего CSS-кода, он идеально вписывается в мой код. Насколько я понял на странице bram.us, селектор :is(&, & > div) > section будет соответствовать чему-то вроде :is(:is(body), :is(body) > div) > section, верно? Или я ошибся?

NineChu 07.06.2024 01:54

Если вы переместите селектор, вы можете заставить его работать:

:is(body, body > div) > section {
  background-color: lightblue;
  padding: 10px;
  border: 1px solid blue;
}
<section>Section directly inside the body (styled).</section>
<div>
  <section>Section directly inside a div wich is directly insdie the body (styled).</section>
</div>
<div>
  <div>
    <section>Section directly inside a div wich is directly inside another div which is directly inside the body (not styled).</section>
  </div>
</div>

Если я правильно понимаю ваш вопрос (в противном случае отредактируйте свой вопрос для ясности):

Вы хотите добиться такого поведения:

body > section, body > div > section {
  background-color: lightblue;
  padding: 10px;
  border: 1px solid blue;
}

Но вы хотите сделать его более кратким, используя псевдокласс :is(), и когда вы говорите «без избыточности», вы имеете в виду сохранение селектора СУХИМ?

Текущий селектор DRY работает неправильно:

body > :is(section, div > section) {
  background-color: lightblue;
  padding: 10px;
  border: 1px solid blue;
}
<section>Section directly inside the body (styled).</section>
<div>
  <section>Section directly inside a div wich is directly insdie the body (styled).</section>
</div>
<div>
  <div>
    <section>Section directly inside a div wich is directly inside another div which is directly inside the body (not styled).</section>
  </div>
</div>

Думайте о :is() глобально, как будто он не видит остальную часть селектора вне себя.

Это ваш селектор:

body > :is(section, div > section)

Давайте запустим его для HTML-элемента, который дает неожиданные результаты:

<body>
  ...
  <div>
    <!-- Testing this section element -->
    <section>
      Section directly inside a div wich is directly insdie the body (styled).
    </section>
  </div>
  ...
</body>
  • Элемент является разделом или разделом и прямым дочерним элементом div ✅
  • Элемент является прямым дочерним элементом body ❌

Учитывая ваши требования к цели:

«Разделы, находящиеся непосредственно внутри тела» и «разделы, находящиеся непосредственно внутри элемента div непосредственно внутри тела»

Мы можем изменить селектор на:

:is(body, body > div) > section

Давайте запустим его с HTML-элементом, который дал неожиданные результаты:

<body>
  ...
  <div>
    <!-- Testing this section element -->
    <section>
      Section directly inside a div wich is directly insdie the body (styled).
    </section>
  </div>
  ...
</body>
  • Элемент представляет собой раздел ✅
  • Это прямой дочерний элемент body❌ или body > div✅.

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