Используйте удаленную таблицу стилей внутри тега шаблона (с тенью dom)
Я пытаюсь создать полуразрушаемый виджет, но у меня проблема. Я пытаюсь инкапсулировать некоторый CSS-код внутри теневого корня, чтобы он не влиял на остальную часть веб-страницы, но этот CSS используется в нескольких виджетах, поэтому я пытаюсь включить удаленную таблицу стилей. Ни один из примеров, которые я нашел, не использовал удаленную таблицу стилей, и мне было интересно, возможно ли это.
Пример:
<template id="templateContent">
<head>
<link rel="stylesheet" href="css/generalStyle1.css">
</head>
<body>
<div class="affectedByGeneralStyle1"></div>
</body>
</template>
script включить шаблон:
<div id="host"></div>
<script>
var importedData = (html_import_element).import.getElementById("templateContent");
var shadow = document.querySelector('#host').createShadowRoot();
var clone = document.importNode(importedData.content, true);
shadow.appendChild(clone);
</script>
Ответы
Ответ 1
В последнее время я столкнулся с одной и той же проблемой: в итоге я использовал:
<template id="templateContent">
<style> @import "css/generalStyle.css"; </style>
</template>
Дополнительная информация: это сработало отлично, за исключением того, что теперь у меня проблемы с кешем, поскольку Chrome, похоже, не перезагружает эти ресурсы после жесткой перезагрузки.
Ответ 2
Позвольте добавить к ответу. Прямой тег теперь поддерживается в теневом домике.
Вы можете напрямую использовать
<link rel="stylesheet" href="yourcss1.css">
<link href="yourcss2.css" rel="stylesheet" type="text/css">
Проверьте, что они были обновлены Whatwg и W3C
Полезная ссылка для использования CSS в Shadow Dom.
https://w3c.github.io/webcomponents/spec/shadow/#inertness-of-html-elements-in-a-shadow-tree https://github.com/whatwg/html/commit/43c57866c2bbc20dc0deb15a721a28cbaad2140c
https://github.com/w3c/webcomponents/issues/628
Прямую ссылку CSS можно использовать в теневой дом
Благодарю.
Ответ 3
На самом деле у полимера есть внутренняя утилита для загрузки ссылок css, я реализовал функцию javascript, использующую внутренний процессор css, поэтому, если вы хотите добавить ссылки css во время выполнения, вы можете использовать его:
Polymer('my-element', {
ready: function () {
this.importCss("path/myfile.css");
},
importCss: function (path) {
var $shadow = $(this.shadowRoot);
var $head = $("<div></div>");
var $link = $("<link rel='stylesheet' type='text/css'>");
$link.attr("href", path);
$head.append($link);
var head = $head[0];
this.copySheetAttributes = Polymer.api.declaration.styles.copySheetAttributes;
Polymer.api.declaration.styles.convertSheetsToStyles.call(this, head);
var styles = Polymer.api.declaration.styles.findLoadableStyles(head);
if (styles.length) {
var templateUrl = this.baseURI;
Polymer.styleResolver.loadStyles(styles, templateUrl, function () {
var $style = $shadow.find("style");
if ($style.length > 0){
$shadow.find("style").append($head.find("style").html());
}else{
$shadow.append($head.html());
}
});
}
}
});
Примечание: для этого кода требуется jquery для запуска
Ответ 4
Я добавил элемент ссылки таблицы стилей непосредственно в теневой корень следующим образом:
let link = document.createElement('link');
link.setAttribute('rel', 'stylesheet');
link.setAttribute('href', 'whatever.css');
this.shadowRoot.appendChild(link);
Кажется, работает нормально. (Я вызвал это из конструктора компонента.)