Spec-Zone.ru › CSS

Псевдоэлемент CSS `::slotted()`

Базовая поддержка Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с января 2020 года.

::slotted() CSS псевдоэлемент представляет любой элемент, помещённый в слот HTML-шаблона (подробнее см. в разделе Использование шаблонов и слотов).

Это работает только при использовании внутри CSS, размещённого в теневом DOM. Обратите внимание: этот селектор не выбирает текстовый узел, помещённый в слот; он предназначен только для реальных элементов.

Попробуйте

/* This CSS is being applied inside the shadow DOM. */

::slotted(.content) {
  background-color: aqua;
}

h2 ::slotted(span) {
  background: silver;
}
<template id="card-template">
  <div>
    <h2><slot name="caption">title goes here</slot></h2>
    <slot name="content">content goes here</slot>
  </div>
</template>

<my-card>
  <span slot="caption">Error</span>
  <p class="content" slot="content">Build failed!</p>
</my-card>
customElements.define(
  "my-card",
  class extends HTMLElement {
    constructor() {
      super();

      const template = document.getElementById("card-template");
      const shadow = this.attachShadow({ mode: "open" });
      shadow.appendChild(document.importNode(template.content, true));

      const elementStyle = document.createElement("style");
      elementStyle.textContent = `
        div {
          width: 200px;
          border: 2px dotted red;
          border-radius: 4px;
        }`;
      shadow.appendChild(elementStyle);

      const cssTab = document.querySelector("#css-output");
      const editorStyle = document.createElement("style");
      editorStyle.textContent = cssTab.textContent;
      shadow.appendChild(editorStyle);
      cssTab.addEventListener("change", () => {
        editorStyle.textContent = cssTab.textContent;
      });
    }
  },
);
/* Selects any element placed inside a slot */
::slotted(*) {
  font-weight: bold;
}

/* Selects any <span> placed inside a slot */
::slotted(span) {
  font-weight: bold;
}

Синтаксис

::slotted(<compound-selector>) {
  /* ... */
}

Примеры

Выделение элементов в слотах

В этом примере мы используем шаблон с тремя слотами:

<template id="person-template">
  <div>
    <h2>Personal ID Card</h2>
    <slot name="person-name">NAME MISSING</slot>
    <ul>
      <li><slot name="person-age">AGE MISSING</slot></li>
      <li><slot name="person-occupation">OCCUPATION MISSING</slot></li>
    </ul>
  </div>
</template>

Мы определяем пользовательский элемент <person-details>. В данном случае мы добавляем стили с помощью JavaScript, хотя можем добавить их в блоке <style> внутри <template>, получив тот же результат:

customElements.define(
  "person-details",
  class extends HTMLElement {
    constructor() {
      super();
      const template = document.getElementById("person-template");

      const shadowRoot = this.attachShadow({ mode: "open" });

      const style = document.createElement("style");
      style.textContent =
        "div { padding: 10px; border: 1px solid gray; width: 200px; margin: 10px; }" +
        "h2 { margin: 0 0 10px; }" +
        "ul { margin: 0; }" +
        "p { margin: 10px 0; }" +
        "::slotted(*) { color: gray; font-family: sans-serif; } " +
        "::slotted(span) {text-decoration: underline;} ";

      shadowRoot.appendChild(style);
      shadowRoot.appendChild(document.importNode(template.content, true));
    }
  },
);

При добавлении содержимого в элемент style вы увидите, что мы выбираем все элементы в слотах (::slotted(*)) и задаём им другой шрифт и цвет. Это отличает их от незаполненных слотов. Мы стилизуем все элементы <span> в слотах (::slotted(span)), чтобы отличить элементы <span> от элементов <p>.

В нашей разметке есть три пользовательских элемента, в том числе пользовательский элемент с недопустимым именем слота, расположенный в исходном порядке, отличном от <template>:

<person-details>
  <p slot="person-name">Wonder Woman</p>
  <span slot="person-age">Immortal</span>
  <span slot="person-occupation">Superhero</span>
</person-details>

<person-details>
  <p slot="person-name">Malala Yousafzai</p>
  <span slot="person-age">17</span>
  <span slot="person-occupation">Activist</span>
</person-details>

<person-details>
  <span slot="person-age">44</span>
  <span slot="not-a-slot-name">Time traveler</span>
  <p slot="person-name">Dr. Who</p>
</person-details>

Результат

Спецификации

Спецификация
Модуль CSS Shadow, уровень 1
# slotted-pseudo

Совместимость с браузерами

Настольные компьютеры Мобильные устройства
Chrome Edge Firefox Opera Safari Chrome для Android Firefox для Android Opera для Android Safari на iOS Samsung Internet WebView для Android WebView на iOS
slotted
50
79
63
37
10
50
63
37
10
5.0
50
10

См. также

  • :host
  • :host
  • :host-context()
  • :has-slotted
  • Область действия CSS — модуль
  • Атрибут HTML slot
  • Элемент HTML <slot>
  • Элемент HTML <template>
  • Веб-компоненты

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/::slotted

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API