В браузерах на базе Chrome я бы ИМПОРТировал таблицу стилей через: -
Мой компонент -
import sheet from '/Vanilla/ScrollGrid.css' assert {type: 'css'};
или вызов веб-страницы пользователя -
if (userStyles != undefined && userStyles != null) {
if (typeof userStyles == "string") {
let userStylesURL;
try
{
userStylesURL = new URL(userStyles, baseURL);
} catch (err) {
console.info(err.message);
}
if (userStylesURL != undefined) {
userSheet = (userStylesURL.protocol == "http:" || "htps:")
}
}
}
if (userSheet)
{
myCSSMod = await import(userStyles, { assert: {type: "css"}});
}
var x = new sg.ScrollGrid("myTable", dimCols, options, myCSSMod.default);
Тогда это позволит мне загружать таблицы стилей во время выполнения: -
Мой компонент ScrollGrid: -
if (userStyles != undefined && userStyles != null) {
if (userStyles.type == "text/css") {
this.#shadowRoot.adoptedStyleSheets.push(userStyles);
}
}
Я могу легко заменить импорт модуля созданием динамического тега LINK: -
let link = document.createElement('link');
link.href = "./toggle.css";
link.rel = "stylesheet";
link.type = "text/css";
this.shadowRoot.appendChild(link);
Теперь я хочу поддерживать Safari и Firefox, поэтому рассматриваю альтернативы.
Но мне нужна помощь/совет: «Как заменить метод IMPORT в моем веб-компоненте?»
Я пробовал использовать атрибут .SHEET из элемента LINK, но наткнулся на правило «должен быть изготовленный CSSStylesheet()», поэтому знаю только три варианта. (Примечание: я бы хотел, чтобы мой компонент продолжал поддерживать необязательный параметр StyleSheet в виде CSSStylesheet, а не строкового URL-адреса.)
Попросите вызывающую страницу загрузить таблицу стилей с помощью FETCH или каким-либо другим способом в строку. Затем вызывающая сторона может вызвать конструктор CSSStylesheet(string) и передать мне результат. Это звучит привлекательно, поскольку позволяет жестко запрограммировать небольшие строки (с очень небольшим количеством правил), а также обрабатывать более крупные внешние файлы CSS.
Измените мой параметр на строку URL-адреса и создайте элемент LINK во время выполнения в моем компоненте.
Имейте «отключенный» тег STYLE, указывающий на внешний URL-адрес, а затем получите внутренний HTML в виде строки. Не знаю, заполняется ли внутренний HTML для отключенных тегов стиля или использование URL-адреса в теге стиля теперь устарело.
Веб-компонент -
if (userStyles != undefined && userStyles != null) {
if (userStyles.type == "text/css") {
this.#shadowRoot.adoptedStyleSheets.push(userStyles);
}
}
this.#shadowRoot.adoptedStyleSheets.push(sheet);
Есть еще варианты? Пожалуйста, не стесняйтесь озвучивать предпочтения.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Чтобы импортировать таблицу стилей, вы можете сделать это в теге стиля.
@import url(https://urltostylesheet);
Спасибо @slothscript, но если я попробую: -
let sheet = new CSSStyleSheet();
sheet.replaceSync("@import url(http://localhost/styles.css);")
Я получил: -
Правила @import здесь не разрешены. См. https://github.com/WICG/construct-stylesheets/issues/119#issuecomment-588352418.
В любом случае, это слишком запутанно, поэтому, пока Safari не поддерживает синтаксис «Assert», я буду использовать экземпляр, чтобы проверить, является ли параметр URL-адресом, и в этом случае я добавлю элемент LINK, или CSSStyleSheet, и в этом случае я продолжу : -
this.#shadowRoot.adoptedStyleSheets.push(userStyles);
Для любопытных: я делаю это, потому что мне все еще нужен пирог инкапсуляции, но я даю вызывающему компоненту большую гибкость, чем это доступно с :slot и :part и -css-variables.