# mini-toastr **Repository Path**: xiao-shenghui/mini-toastr ## Basic Information - **Project Name**: mini-toastr - **Description**: 一个功能简单而有趣的,mini且好看的通知弹窗库。 使用纯js实现的类库,参考至toastr-jquery源码。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-10-13 - **Last Updated**: 2023-10-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: JavaScript, notify ## README # mini-toastr > 在深入使用[toastr]()后(一个基于Jquery生成弹窗的js类库) > 想开发一个纯js实现弹窗的类库。 > 因此在深入学习其源码后,编写了这个小类库, 暂时称为`mini-toastr`。 > 由于不算非常完善,暂时不发布到`npm`, 适用于需要`学习类库源码`的人群参考。 ## 实现的功能 - [x] 支持支持debug调试信息 - [x] 支持自定义弹窗的显示位置(4个位置) - [x] 支持自定义类名(弹窗和容器) - [x] 2种内置动画, 且支持自定义动画(1,2) - [x] 支持自定义延迟时间 - [x] 支持自定义动画持续时间 - [x] 支持自定义弹窗尺寸(宽高) - [x] 支持配置关闭按钮 - [x] 一键创建和自动移除,无需准备容器(弹窗和容器) - [x] 纯js, 无需引入任何第三方库 ## 待实现的功能 - [ ] 提示标题 -------待开发 - [ ] 提示icon ------待开发 ## 效果预览 - 右上角 - 左下角,hover - 移入和移出动画 ## 使用和测试 - Browser > 引入css和js文件即可。 ```html ``` - ESModule: ```html ``` ## 对`toastr`的源码解析 > 以下写的比较乱,综合了toastr的`使用`和`实现思路` ### toastr使用 ```js // // 设置消息提示的位置 // toastr.options.positionClass = "toast-top-right"; // // 显示进度条 // // toastr.options.progressBar = true; // //显示关闭按钮 // toastr.options.closeButton = true; // // 对于$.extend()的应用,一旦提供了,覆盖掉默认属性。 // toastr.options.iconClasses = { // success: 'mytips', //因此可以自定义类名,作为背景颜色 // } // console.log(toastr); // toastr.success('hello'); // toastr.warning('hello'); // toastr.options.positionClass = "toast-top-right"; // toastr.options.iconClasses = { // success: 'mytips', //因此可以自定义类名,作为背景颜色 // } // toastr.success('hello', '我是标题', '123'); ``` ### 配合源码 ```js // 鉴于源码中,notify中的合并操作,可以看出,第三个参数,是用来合并options的 // 所以上面toastr.options.xxx = xxx; // 可以全部写到第三个参数里面。 // 注意它合并时,合并的是iconClass, // 因此单独配置时,要配置iconClasses,指定成功类名。 // 而配置到第三个参数,直接写iconClass: '类名', // 因为iconClass在合并前,就是指代里面的success // (源码: iconClass: getOptions().iconClasses.success,) ``` ### 实现思路 ```js // 所以整个看下来, // 它支持两种配置,一种options打点配置,一种以第三个参数为主的配置。 // 实现思路是,先合并打点配置,再合并第三个参数optionsOverride。 // toastr.success('hello', '我是标题', { // positionClass: "toast-top-right", // iconClass: 'mytips', // progressBar: true, // // debug: true // // containerId: 'container' 指定容器id (源码createContainer(), $container = $('
').attr('id', options.containerId).addClass(options.positionClass); // // target: '#container' //指定容器的挂载节点,默认是body (源码createContainer(), $container.appendTo($(options.target));) // // closeHtml: 'x' // // 支持html创建关闭节点 // }); // jQuery链式调用 // toastr.success('hello', '我是标题').stop().fadeIn(); // debug // toastr.subscribe(function (res) { // console.log(res) // }) ``` ### 动画 ```js // toastr借用了jQuery的fadeIn和fadeOut动画方法 /* $toastElement[options.showMethod]( { duration: options.showDuration, easing: options.showEasing, complete: options.onShown } ); */ /* 所以toastr主要借用了jQuery的fadeIn和fadeOut动画方法, 以及jQuery创建节点,设置样式和移除节点的方法。 用纯js写,最大的难点还是在于这两个动画,并且还要支持传入参数。 可以写一个简版的 */ ``` ### 库设计思路 ```js /* toastr的设计者考虑了哪些点? 1. 使用的便利,toastr.success() 支持参数形式,或者单独设置形式配置。 2. debug的便利,支持使用subscribe的回调打印,或者配置项debug一键开启。 3. 支持绑定自定义类名,自定义容器,自定义挂载点 4. 支持默认配置和自定义配置合并 5. 支持Jquery的链式调用:为了方便通知后续使用jQuery操作,返回的依旧是一个通知节点jQuery节点, 注意:只支持Jquery后续操作,不支持toastr的链式通知。 6.1 支持节点按顺序创建,并且能按节点的状态,按顺序移除 6.2 支持点击删除,支持hover事件时保持不删除状态。 7. 事后的清理,比如将节点变量或者对象置为null或者undefined ``` ### 实现思路 ```js /* 如果用纯js手写toastr,要考虑什么? 基础实现 1. 移除掉链式调用 2. 使用方式不变和debug保留 3. 手写fadeIn和fadeOut的动画,仿造jQuery,支持自定义和默认配置。 4. 手写获取节点,删除节点和创建节点, 设置属性值,添加样式,添加类名,点击和hover移入和移出事件,隐藏节点的方法。 5. 将jQuery提供的$.extend()改为ES6中的Object.assign() 6. 整个系统的架构,可以保持不变,使用立即执行函数的形式,返回对象的格式。 改进 1. 修改系统的架构, 2. 改用createToastr()创建对象的方式,更符合库的用法。 3. 将默认配置放置到创建中,后续统一用这个配置 4. 并且支持随时更改单个对象的配置,在第三个参数。 */ ```