#svelte #shadow-dom
#стройный #shadow-dom
Вопрос:
Предполагается, что мое приложение svelte будет отображаться внутри теневого элемента. Это работает, но все стили добавляются в заголовок внешнего документа. Я пытался создать HTML-элемент в теневом dom, но стили по-прежнему добавляются в заголовок внешнего документа.
Есть ли какой-нибудь способ сообщить Svelte, куда добавлять стили? Наличие стилей во внешнем файле не является вариантом в моем случае использования.
На изображении показан стиль во внешнем заголовке и нет стиля в теневом корне.
Обходной путь
В качестве обходного пути я знаю, что добавьте слушателя в заголовок документа и переместите то, что добавляется в теневой корень. Это работает в моем приложении, где в данный момент есть только один shadow-dom, но это не универсальное решение.
const outerHead = document.getElementsByTagName('head')[0]
const config = { attributes: false, childList: true, subtree: false }
const callback = function (mutationsList, observer) {
mutationsList.forEach(mutation => {
mutation.addedNodes.forEach(n => shadowHtml.getElementsByTagName('head')[0].appendChild(n))
})
}
const headObserver = new MutationObserver(callback);
headObserver.observe(outerHead, config);
Комментарии:
1. Можете ли вы заставить Svelte создать
open
shadowRoot? Затем вы можете переместить его самостоятельно (на стороне клиента)2. Сегодня (или несколько месяцев назад, когда я проверял в последний раз) таблицы стилей в shadow DOM не могут быть в каждом браузере. Итак, вам нужно добавить строку стиля через JS. Кроме того, я попытался использовать «обычное» (в отличие от сборки CustomElement) приложение Svelte в теневом DOM, и это вроде сработало. Но на самом деле не полностью. Например, переходы были нарушены. Определенно не то, что я бы рекомендовал, в настоящее время :-/
3. Если я вручную скопирую стили из внешнего заголовка в теневой DOM, стиль будет выглядеть правильно. Так что, если бы я мог сказать svelte, куда добавлять стили, все бы сработало. С открытым теневым DOM я мог бы переместить их, как только они будут добавлены. Но это кажется довольно сложной задачей.
4. Возможно, вас заинтересует этот шаблон github.com/stefanonepa/svelte-component-ts Это взлом, но он позволяет вам обернуть стройное приложение в пользовательский элемент со встроенными стилями и переходами из стройного…