惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
罗磊的独立博客
The GitHub Blog
The GitHub Blog
V
V2EX
Last Week in AI
Last Week in AI
博客园 - 聂微东
MyScale Blog
MyScale Blog
美团技术团队
L
LangChain Blog
博客园 - Franky
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园_首页
S
SegmentFault 最新的问题
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
量子位
小众软件
小众软件
宝玉的分享
宝玉的分享
J
Java Code Geeks
Google DeepMind News
Google DeepMind News
D
Docker
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

膨胀自留地

使用CloudFlare标记管理功能优雅的使用谷歌分析 四天轻松版北京旅游攻略 Adsense税务居住地证明申请教程:如何申请中国税收居民身份证明以及Google Adsense更新新加坡税务信息教程 常见的 VPS 优化措施 HTML实现table表格移动端自动转为卡片样式 个人网站接入 Google 登录 如何从 GitHub 永久删除泄露的 .env 文件 Cloudflare设置www的域名跳转到不带www的域名 顶级iOS神器!全面解开App Store限制,AssPP Pro保姆级教程 BroadcastChannel将你的 Telegram Channel 转为微博客 Medama开源轻量级网站统计(分析)系统 白嫖一个网站监控面板:uptime-kuma 部署TraffMonetizer利用闲置VPS挂机赚钱 Counterscale-使用CloudflareWorkers部署的免费网站数据统计工具,界面类似umami 封装一个最简单的Axios,避免过度封装! 如何使用Cloudflare Email Routing创建域名邮箱免费发送邮件 使用Cron定时更新Hosts解决Gihub无法访问问题 容器化MariaDB/Mysql实现定时备份 JetBrains全家桶许可证服务器怎么找,JetBrains激活教程 图片加速接口:缓存图片,加速访问,解决防盗链 MySQL模糊查询再也不用like+%了,全文索引介绍及使用简介 为什么这么多人推荐你办理流量卡?流量卡怎么赚钱?怎么避坑? 借助Cloudflare Worker实现Google Analytics反代加速,规避广告屏蔽插件的拦截 etcd入门之在Centos上安装部署 Grafana在linux下安装和基本使用入门 Prometheus介绍、安装和基本功能快速入门 无需加速器,油猴插件解锁xbox云游戏 阿里云盘自动每日签到,无需部署,无需服务器 自定义VSCode终端主题样式 一行 CSS 代码实现响应式布局 – 使用 Grid 实现的响应式布局
JS | 原生js仿ElementUI消息提示组件,含生命周期钩子
2023-03-04 · via 膨胀自留地

#编程技术 2023-03-04 11:17:48 | 全文 1019 字,阅读约需 3 分钟 | 加载中... 次浏览

👋 相关阅读


仿ElementUI消息提示组件,含生命周期钩子

先来看看 ElementUI 消息提示组件 官网:https://element.eleme.cn/#/zh-CN/component/message

图片alt

本文实现效果:

图片alt

代码:

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <title>Document</title>
        <style type="text/css">
            div,
            i,
            button {
                margin: 0;
                padding: 0;
            }
           
            /*预定义样式,通过js动态生成dom时,加上指定类名*/
            .dpn-message {
                font-family: "\5FAE\8F6F\96C5\9ED1", Helvetica, sans-serif;
                font-size: 12px;
                z-index: 99999;
            }
           
            .dpn-message {
                box-sizing: border-box;
                position: fixed;
                top: -200px;
                left: 50%;
                transform: translateX(-50%);
                z-index: 99999;
                padding: 15px;
                padding-right: 32px;
                min-width: 20%;
                max-width: 50%;
                border-radius: 4px;
                transition: top .3s;
            }
           
            /*info 消息*/
            .dpn-message.dpn-info {
                background: #EDF2FC;
                border: 1px solid #EBEEF5;
                color: #909399;
            }
           
            /*success消息*/
            .dpn-message.dpn-success {
                background: #f0f9eb;
                border: 1px solid #e1f3d8;
                color: #67C23A;
            }
           
            /*error消息*/
            .dpn-message.dpn-error {
                background: #fef0f0;
                border: 1px solid #fde2e2;
                color: #F56C6C;
            }
            /*warning消息*/
           
            .dpn-message.dpn-warning {
                background: #fdf6ec;
                border: 1px solid #faecd8;
                color: #E6A23C;
            }
           
            .dpn-message .dpn-close {
                position: absolute;
                right: 8px;
                top: 50%;
                transform: translateY(-50%);
                width: 16px;
                height: 16px;
                line-height: 16px;
                text-align: center;
                font-style: normal;
                cursor: pointer;
            }
        </style>
    </head>

    <body>
        <button id="submit1">info</button>
        <button id="submit2">success</button>
        <button id="submit3">error</button>
        <button id="submit4">warning</button>
    </body>

    <script type="text/javascript">
        class MessageBox {
            constructor(options) {
                // 把传递进来的配置信息挂载到实例上(以后可以基于实例在各个方法各个地方拿到这个信息)
                for(let key in options) {
                    if(!options.hasOwnProperty(key)) break;
                    this[key] = options[key];
                }

                // 开始执行
                this.init();
            }
            // 初始化:通过执行INIT控制逻辑的进行
            init() {
                if(this.status === "message") {
                    this.createMessage();
                    this.open();
                    return;
                }

            }
            // 创建元素
            createMessage() {
                this.messageBox = document.createElement('div');
                this.messageBox.className = `dpn-message dpn-${this.type}`;
                this.messageBox.innerHTML = `
                ${this.message}
                <i class="dpn-close">X</i>
            `;
                document.body.appendChild(this.messageBox);

                // 基于事件委托监听关闭按钮的点击
                this.messageBox.onclick = ev => {
                    let target = ev.target;
                    //判断点击的元素是否为关闭按钮
                    if(target.className === "dpn-close") {
                        // 点击的是关闭按钮
                        this.close();
                    }
                };

                // 钩子函数
                this.oninit();
            }

            // 控制显示
            open() {
                if(this.status === "message") {
                    let messageBoxs = document.querySelectorAll('.dpn-message'),
                        len = messageBoxs.length;
                    //计算新弹出的messageBox的Y轴偏移量
                    this.messageBox.style.top = `${len===1 ? 20:20+(len-1)*70}px`;

                    // 如果duration不为零,控制自动消失
                    this.autoTimer = setTimeout(() => {
                        this.close();
                    }, this.duration);

                    // 钩子函数
                    this.onopen();
                    return;
                }
            }
            // 控制隐藏
            close() {
                if(this.status === "message") {
                    clearTimeout(this.autoTimer);
                    this.messageBox.style.top = '-200px';
                    let anonymous = () => {
                        document.body.removeChild(this.messageBox);
                        // 钩子函数
                        this.onclose();
                    };
                    this.messageBox.addEventListener('transitionend', anonymous);
                    return;
                }

            }
        }

        //全局对象上挂载该方法
        window.messageplugin = function(options = {}) {
            //允许只传入字符串,对其进行对象格式处理
            if(typeof options === "string") {
                options = {
                    message: options
                };
            }
            //用户提供的配置覆盖默认配置项
            options = Object.assign({
                status: 'message',
                message: '我是默认信息',
                type: 'info',
                duration: 3000,
                //生命周期钩子
                oninit() {},
                onopen() {},
                onclose() {},
            }, options);
            return new MessageBox(options);
        };

        let submit1 = document.getElementById("submit1")
        let submit2 = document.getElementById("submit2")
        let submit3 = document.getElementById("submit3")
        let submit4 = document.getElementById("submit4")

        submit1.onclick = function() {
            messageplugin('我是info');
        };

        submit2.onclick = function() {
            messageplugin({
                message: "我是success",
                type: "success"
            });
        };

        submit3.onclick = function() {
            messageplugin({
                message: "我是error",
                type: "error"
            });
        };

        submit4.onclick = function() {
            messageplugin({
                message: "我是warning",
                type: "warning",
                oninit() { console.log('我被init 了') },
                onopen() { console.log('我被open 了') },
                onclose() { console.log('我被close 了') },
            });
        };
    </script>

</html>

via

原生js造轮子之—-仿ElementUI消息提示组件,含生命周期钩子 | 码农家园 https://www.codenong.com/cs106344142/


×