Ответ 1
- Какой лучший способ указать дополнительный стиль?
- Поместите шаблон внутри подкласса (
my-custom-element
), как обычно. - Включите элемент
<shadow></shadow>
, где вы хотите, чтобы шаблон суперкласса отображался. - Поместите тег стиля в новый шаблон.
- Чтобы стилизовать элементы из шаблона суперкласса, используйте селектор, например:
:host::shadow .someclass { ... }
См. пример ниже.
- Можно ли обернуть базовый элемент в дополнительную разметку (например, другой контейнер)?
Да, вы можете поместить любую разметку вокруг <shadow></shadow>
.
<div>
<shadow></shadow>
</div>
- Можно ли выбрать элементы из базового элемента? Что-то вроде
<content select=".stuff">
, но для разметки базовой тени.
Нет. Вы не можете так проецироваться (это в обратном направлении от всех других проекций).
Если вы действительно хотите вырезать узлы из старого теневого корня, это можно сделать в коде, вытащив узлы непосредственно из this.shadowRoot.olderShadowRoot
. Но это может быть сложно, потому что у суперкласса могут быть ожидания относительно структуры.
Пример кода:
<polymer-element name="my-custom-element" extends="custom-element">
<template>
<style>
/* note that :host::shadow rules apply
to all shadow-roots in this element,
including this one */
:host::shadow #container {
color: blue;
}
:host {
/* older shadow-roots can inherit inheritable
styles like font-family */
font-family: sans-serif;
}
</style>
<p>
<shadow></shadow>
</p>
</template>
<script>
Polymer('my-custom-element', {
clickContainer: function() {
this.super();
}
});
</script>
</polymer-element>
Подсказки:
-
olderShadowRoot
будет существовать независимо от того, включаете ли вы тег<shadow></shadow>
или нет, но он не будет частью предоставленного DOM, если вы этого не сделаете. - Чтобы предотвратить создание
olderShadowRoot(s)
, вы можете переопределитьparseDeclarations
(источник). Любой изparseDeclarations
,parseDeclaration
,fetchTemplate
может быть переопределен для различных эффектов.