Как использовать CSS "целевой" селектор в веб-компонентах, используя освещенный HTML

Я использую освещенный HTML для создания пользовательских веб-компонентов в моем проекте. И моя проблема в том, что когда я пытаюсь использовать селектор цели CSS в веб-компоненте, он не будет срабатывать, но когда я делаю это без пользовательского компонента, код работает отлично. Может ли кто-то пролить свет на то, почему это происходит, и на то, как обойти эту проблему? Вот мой код:

целевых испытаний element.js:

import { LitElement, html} from '@polymer/lit-element';

class TargetTest extends LitElement {

  render(){
    return html`
      <link rel="stylesheet" href="target-test-element.css">
        <div class="target-test" id="target-test">
        <p>Hello from test</p>
    </div>
    `;
  }
}
customElements.define('target-test-element', TargetTest);

со следующим стилем:

предназначаться-тест-element.css:

.target-test{
    background: yellow;
}

.target-test:target {
    background: blue;
}

и я создал ссылку в index.html:

index.html (с пользовательским компонентом):

<!DOCTYPE html>

<head>
 ...
</head>

<body>
    <target-test-element></target-test-element>
    <a href="#target-test">Link</a>
</body>

</html>

И вот рабочий:

index.html (без пользовательского компонента)

<!DOCTYPE html>
<head>
    ...
</head>
<body>
    <a href="#target-test">Link</a>
    <div class="target-test" id="target-test">
        Hello
    </div>
</body>
</html>

2 ответа

LitElement использует Shadow DOM для визуализации своего контента. Shadow DOM изолирует стиль CSS, определенный внутри, и предотвращает выбор внутреннего содержимого из внешнего источника с помощью селекторов CSS. По этой причине :target псевдокласс не сработает.

Вместо этого вы можете использовать стандартный (ванильный) пользовательский элемент без Shaodow DOM.

class TargetTest extends HTMLElement {
  connectedCallback() {
    this.innerHTML = `
      <div>
        <span class="test" id="target-test">Hello from test</span>
      </div>`
  }
}
customElements.define('target-test-element', TargetTest)
.test {
  background: yellow;
}

.test:target {
  background: blue;
}
<target-test-element></target-test-element>
<a href="#target-test">Link</a>

С другой стороны, если вы все еще хотите использовать Shadow DOM, вам следует установить id свойство самого пользовательского элемента.

Немного поздно, я испытал ту же проблему! Итак, я иду одним из двух путей:

  1. Используйте освещенный элемент, но без shadowDOM, для этого в вашем элементе Lit вызовите метод createRenderRoot()
      createRenderRoot () {
    return this
  }
  1. Вместо этого обрабатывайте логику CSS с помощью: target. Я обрабатываю атрибут элемента (это легко сделать с помощью Lit), например. active и используйте его в CSS:
      element[active] {
   /* CSS rules */
}

Это мои решения на данный момент! Надеюсь, это поможет ...

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