HTML slot元素实现简易弹框实例页面

回到相关文章 »

效果:

基本

插槽执行成功!

按钮非子元素不显示

插槽执行成功!

包括取消按钮

插槽执行成功!

代码:

演示HTML代码:
<h4>基本</h4>
<zxx-alert>
    <p slot="alert">插槽执行成功!</p>
</zxx-alert>

<h4>按钮非子元素不显示</h4>
<zxx-alert>
    <p slot="alert">插槽执行成功!</p>
    <div>
        <button slot="button">取消</button>
    </div>
</zxx-alert>

<h4>包括取消按钮</h4>
<zxx-alert>
    <p slot="alert">插槽执行成功!</p>
    <button slot="button">取消</button>
</zxx-alert>
模板HTML代码:
<template id="alertTpl">
    <style>
        :host(:not([open])) {
            display: none;
        }
        :host {
            position: fixed;
            left: 0; top: 0;
            height: 100%; width: 100%;
            background-color: rgba(25, 28, 34, 0.88);
            z-index: 19;
            display: grid;
            place-items: center;
        }
        dialog {
            position: static;
            display: inherit;
        }
    </style>
    <dialog>
        <slot name="alert">暂无提示信息</slot>
        <p>
            <button>确定</button>
            <slot name="button"></slot>
        </p>
    </dialog>
</template>
                
JS代码:
customElements.define('zxx-alert', class extends HTMLElement {
    constructor() {
        super();
        let contentDoc = document.getElementById('alertTpl').content;

        const shadowRoot = this.attachShadow({
            mode: 'open'
        }).append(contentDoc.cloneNode(true));  
    }
    connectedCallback () {
        // 确定按钮点击关闭弹框
        this.shadowRoot.querySelector('button').onclick = () => {
            this.toggleAttribute('open', false);
        };
        // 取消按钮点击关闭弹框
        this.shadowRoot.querySelector('[name="button"]').onclick = () => {
            this.toggleAttribute('open', false);
        };
    }
});