Web组件内容未呈现

时间:2018-11-28 15:57:14

标签: javascript html

我正在制作第一个Web组件,但是shadow dom部分阻止了内容的渲染。基本上,这是一个在右上角带有关闭按钮的框(尚不可用)。

问题在于,hello world文本会暂时出现,然后消失,大概是在渲染阴影dom时。我正在Chrome(70)中查看它。

JavaScript文件:

export class InfoBox extends HTMLElement {

    constructor() {

        super();

        this.sRoot = this.attachShadow({mode: 'open'});

        this.sRoot.innerHTML = `
        <style>
        .close{
            font-family: sans-serif;
            font-size: 24px;
            float: right;
            padding-top: 10px;
            padding-right: 10px;
        }
        </style>
        <div class="close">X</div>
        `;
    };
};

HTML:

<!DOCTYPE html>
<html>
    <head>

        <title>Web component test bed</title>

        <!-- Load the polyfil for Edge. -->
        <script src="./scripts/webcomponents-lite.js"></script>

        <script type=module>

            import { InfoBox } from './scripts/InfoBox.js';
            window.customElements.define('infobox-content', InfoBox);

        </script>

    </head>



    <body>

        <style>

            infobox-content{
                position: absolute;
                top: 100px;
                left: 100px;
                width: 300px;
                height: 100px;
                background-color: #333333;
                color: #ffffff;
            }

        </style>

        <infobox-content>Hello World</infobox-content>


    </body>

2 个答案:

答案 0 :(得分:0)

解决方案似乎是使用<slot>标签:

this.sRoot.innerHTML = `
        <style>
        .close{
            z-index: 20;
            position: relative;
            font-family: sans-serif;
            font-size: 24px;
            float: right;
            padding-top: 10px;
            padding-right: 10px;
            color: #ffffff;
        }
        </style>
        <slot class="user">Your content here</slot>
        <div class="close">X</div>
        `;

除非有人有更好的解决方案。 在许多其他任务中,我仍然必须弄清楚如何将默认样式应用于用户提供的内容。

答案 1 :(得分:0)

我不确定是否要设置shadowRoot的innerHTML,因此创建一个元素,然后使用appendChild进行添加。这应该起作用;

export class InfoBox extends HTMLElement {

constructor() {

    super();

    this.attachShadow({mode: 'open'});

};

connectedCallback() {
    console.log("heyo")
    let exampleDiv = document.createElement("div");
    exampleDiv.innerHTML = `
    <style>
    .close{
        font-family: sans-serif;
        font-size: 24px;
        float: right;
        padding-top: 10px;
        padding-right: 10px;
    }
    </style>
    <div class="close">X</div>
    `;

    this.shadowRoot.appendChild(exampleDiv);
}

};

window.customElements.define('infobox-content',InfoBox);