Как использовать Tippy в теневом DOM с CSS-областью?

Я хочу использовать Tippy.js в моем теневом DOM.

Так как сценарии могут получить доступ к моей теневой DOM, а стили - нет, я попытался вставить CSS Tippy в теневой DOM и связать JS Popper и Tippy снаружи. Вот демонстрация того, что это не работает.

Мне нужно, чтобы CSS был ограничен, поэтому у меня есть следующее ограничение:

<style>
    :host {
      all: initial; /* 1st rule so subsequent properties are reset. */
      display: block;
      contain: content; /* Boom. CSS containment FTW. */
      /* any other CSS, so this is where I inlined the Tippy's */
    }
</style>

2 ответа

Для людей, попавших сюда из Google и блуждающих, каков текущий процесс помещения Типпи в теневой дом (например, для использования с расширением браузера). Для меня работает следующее:

      
const shadowRoot = initShadowRoot()

function initShadowRoot() {
    const shadowContainer = document.createElement("div")

    const shadowRoot = shadowContainer.attachShadow({mode: "open"})
    let style = document.createElement('style')
    style.innerText = shadowCss // inline or use a bundler to give you a string representation 

    shadowRoot.appendChild(style)
    document.body.appendChild(shadowContainer)

    return shadowRoot
}

//---
//elsewhere when initializing tippy:

tippy(elment, {
    // ...
    // in shadow dom to avoid affecting the page styles
    appendTo: () => shadowRoot,
    //...
})

Получить целевой элемент, создать style тег для хранения встроенного CSS и добавления тега style как дочернего элемента.

const anchor = document.querySelector('#blog-header')
const style = document.createElement('style')
style.type = 'text/css'
const stylesheet = // inline Tippy.js CSS here or fetch it from somewhere else
style.appendChild(document.createTextNode(stylesheet))

anchor.content.prepend(style)
Другие вопросы по тегам