Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

translation(CSS): web/css/_colon_where #2734

Merged
merged 4 commits into from
Dec 27, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 153 additions & 0 deletions files/uk/web/css/_colon_where/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
---
title: ":where()"
slug: Web/CSS/:where
page-type: css-pseudo-class
browser-compat: css.selectors.where
---

{{CSSRef}}

Функція-[псевдоклас](/uk/docs/Web/CSS/Pseudo-classes) [CSS](/uk/docs/Web/CSS) **`:where()`** (де) приймає як аргумент список селекторів і вибирає всі елементи, які можуть бути вибрані будь-яким з селекторів у цьому списку.

Різниця між `:where()` та {{CSSxRef(":is", ":is()")}} полягає в тому, що `:where()` завжди має [специфічність](/uk/docs/Web/CSS/Specificity) 0, тоді як `:is()` приймає специфічність найбільш специфічного селектора серед своїх аргументів.

{{EmbedInteractiveExample("pages/tabbed/pseudo-class-where.html", "tabbed-shorter")}}

## Синтаксис

Псевдоклас `:where()` вимагає [список селекторів](/uk/docs/Web/CSS/CSS_selectors/Selector_structure#spysok-selektoriv) — розділений комами список з одного чи більшої кількості селекторів — як його аргумент. Такий список не повинен містити [псевдоелементів](/uk/docs/Web/CSS/Pseudo-elements), але будь-які інші прості, складені та складні селектори допускаються.

```css-nolint
:where(<складний-список-селекторів>) {
/* ... */
}
```

### Поблажливий розбір селекторів

Специфікація визначає те, що `:is()` та `:where()` приймають [поблажливий список селекторів](https://drafts.csswg.org/selectors-4/#typedef-forgiving-selector-list).

У CSS, коли використовується список селекторів, то якщо будь-який з селекторів є недійсним, то весь список вважається недійсним. Проте коли використовується `:is()` або `:where()`, то замість того, щоб недійсним вважався весь список, якщо один з селекторів не виходить розібрати, то цей селектор, що має помилку або не підтримується, ігнорується, а інші використовуються.

```css
:where(:valid, :unsupported) {
/* … */
}
```

CSS вище все одно правильно розбирається і дає збіг з `:valid` навіть у браузерах, які не підтримують `:unsupported`, тоді як:

```css
:valid,
:unsupported {
/* … */
}
```

Ігнорується в браузерах, які не підтримують `:unsupported`, навіть якщо вони підтримують `:valid`.

## Приклади

### Порівняння :where() та :is()

Цей приклад показує, як працює `:where()`, а також ілюструє різницю між `:where()` та `:is()`.

Погляньмо на такий HTML:

```html
<article>
<h2>Посилання, оформлені за допомогою :is()</h2>
<section class="is-styling">
<p>
Ось мій головний вміст. Тут <a href="https://mozilla.org">є посилання</a>.
</p>
</section>

<aside class="is-styling">
<p>
Це мій побічний вміст. Тут
<a href="https://developer.mozilla.org">також є посилання</a>.
</p>
</aside>

<footer class="is-styling">
<p>
Це мій нижній колонтитул, у якому також є
<a href="https://github.com/mdn">посилання</a>.
</p>
</footer>
</article>

<article>
<h2>Посилання, оформлені за допомогою :where()</h2>
<section class="where-styling">
<p>
Ось мій головний вміст. Тут <a href="https://mozilla.org">є посилання</a>.
</p>
</section>

<aside class="where-styling">
<p>
Це мій побічний вміст. Тут
<a href="https://developer.mozilla.org">також є посилання</a>.
</p>
</aside>

<footer class="where-styling">
<p>
Це мій нижній колонтитул, у якому також є
<a href="https://github.com/mdn">посилання</a>.
</p>
</footer>
</article>
```

У цьому дещо штучному прикладі є дві статті, кожна з яких містить розділ, побічний вміст і нижній колонтитул. Вони відрізняються класами, які використовуються для позначення дочірніх елементів.

Аби згрупувати вибирання посилань, тим часом зберігаючи відмінні стилі `is-styling` та `where-styling`, _можна було б_ скористатися `:is()` або `:where()`, наступним чином:

```css
html {
font-family: sans-serif;
font-size: 150%;
}

:is(section.is-styling, aside.is-styling, footer.is-styling) a {
color: red;
}

:where(section.where-styling, aside.where-styling, footer.where-styling) a {
color: orange;
}
```

Проте що, якщо пізніше захочеться перевизначити колір посилань у нижніх колонтитулах за допомогою складеного селектора, що складається з селекторів типу низької специфічності?

```css
footer a {
color: blue;
}
```

Це не спрацює для червоних посилань, тому що селектори всередині `:is()` враховуються при розрахунку специфічності загального селектора, а класові селектори мають більшу специфічність, ніж селектори елементів.

Проте селектори всередині `:where()` мають специфічність 0, тому помаранчеве посилання в нижньому колонтитулі буде перевизначено нашим складеним селектором, що складається лише з типів.

> [!NOTE]
> Також цей приклад можна знайти на GitHub; див. [is-where](https://webdoky.github.io/css-examples/is-where/).

{{EmbedLiveSample('pryklady', '100%', 600)}}

## Специфікації

{{Specifications}}

## Сумісність із браузерами

{{Compat}}

## Дивіться також

- {{CSSxRef(":is", ":is()")}}
- [Список селекторів](/uk/docs/Web/CSS/Selector_list)
- [Вебкомпоненти](/uk/docs/Web/API/Web_components)
Loading