popup.js
window.Popup = (function(d) { var _instance = null, _progressInstance = null, doc = d.body, docWidth = doc.clientWidth, docHeight = doc.clientHeight; function Dialog() { this.title = '标题'; this.content = '内容'; this.btns = [ {name : '确定', ac : function() {}}, {name : '取消', ac : function() {}} ]; this.type = 'alert'; this.hasTitle = true; this.timeout = 500; this.dialogWrapper = null; this.mask = null; this.fadeTime = 250; this.fadeInTime = 0; this.hasDialog = false; // loading this.loadingText = '正在加载'; this.hasLoadingText = false; this.spinNumber = 8; // 菊花瓣数 this.loadingRadius = 18; // 菊花半径 this.startAngle = 90; // 正上方菊花角度 this.spinMargin = 2; } Dialog.prototype = { /** * 创建mask * * @return {[type]} [description] */ _createMask : function() { var _this = this; if (!this.mask) { this.mask = document.createElement('div'); this.mask.className = 'ui-mask fade'; doc.appendChild(this.mask); // 在创建了mask之后250ms,给其设置透明度为1,达到动画效果 setTimeout(function() { _this.mask.className = 'ui-mask fade in'; }, this.fadeInTime); } }, /** * 移除mask * * @return {[type]} [description] */ _removeMask : function() { var _this = this; if (this.mask) { // 移除dom之前,给其设置className,达到动画过渡效果 this.mask.className = 'ui-mask fade'; setTimeout(function() { _this.mask.remove(); _this.mask = null; }, this.fadeTime); } }, /** * 创建弹窗的容器 * * @return {[type]} [description] */ _createWrapper : function() { if (!this.dialogWrapper) { this.dialogWrapper = document.createElement('div'); } }, /** * 移除弹窗的容器 * * @return {[type]} [description] */ _removeWrapper : function() { var _this = this; if (this.dialogWrapper) { if (this.type === 'toast') { this.dialogWrapper.className = 'ui-dialog ui-toast fade'; } else if(this.type === 'loading') { this.dialogWrapper.className = 'ui-dialog ui-loading fade'; } else if(this.type === 'progress') { this.dialogWrapper.className = 'ui-dialog ui-progress fade'; } else { this.dialogWrapper.className = 'ui-dialog fade'; } setTimeout(function() { _this.dialogWrapper.remove(); _this.dialogWrapper = null; _this.hasDialog = false; }, this.fadeTime); } }, /** * 如果存在标题,则创建标题容器 * * @return {[type]} [description] */ _createTitle : function() { var title = document.createElement('div'); title.className = 'ui-title'; title.textContent = this.title; return title; }, /** * 创建内容区域 * * @return {[type]} [description] */ _createContent : function() { var content = document.createElement('div'); content.className = 'ui-content'; content.textContent = this.content; return content; }, /** * 创建按钮组 * * @return {[type]} [description] */ _createBtns : function() { var buttons = document.createElement('div'), _this = this; buttons.className = 'ui-btns'; this.btns && this.btns.forEach(function(btn, index) { var link = document.createElement('a'); link.href = 'javascript:void(0)'; link.textContent = btn.name; buttons.appendChild(link); link.addEventListener('click', function() { _this.close(); btn.ac && btn.ac(); }); }); return buttons; }, /** * 创建loading文字 * * @return {[type]} [description] */ _createLoadingText : function() { var text = document.createElement('div'); text.className = 'ui-text'; text.textContent = this.loadingText; return text; }, /** * 创建loading菊花 * * @return {[type]} [description] */ _createLoadingContent : function() { var content = document.createElement('div'), lineSpin = document.createElement('div'), deltaAngle = 360 / this.spinNumber; content.className = 'ui-content'; if (!this.hasLoadingText) { content.style.height = '86px'; content.style.borderRadius = '5px'; } lineSpin.className = 'ui-line-spin'; lineSpin.style.width = (this.loadingRadius * 2 + this.spinMargin * 2) + 'px'; lineSpin.style.height = (this.loadingRadius * 2 + this.spinMargin * 2) + 'px'; for (var i = 0; i < this.spinNumber; i++) { var div = document.createElement('div'); var angle = this.startAngle + i * (-deltaAngle), rotateAngle = i * deltaAngle, p = Math.PI * 2 * (angle / 360); div.style.top = this.loadingRadius * (1 - Math.sin(p)) + 'px'; div.style.left = this.loadingRadius * (1 + Math.cos(p)) + 'px'; div.style.transform = 'rotate('+rotateAngle+'deg)'; div.style.WebkitTransform = 'rotate('+rotateAngle+'deg)'; div.style.MozTransform = 'rotate('+rotateAngle+'deg)'; div.style.msTransform = 'rotate('+rotateAngle+'deg)'; div.style.OTransform = 'rotate('+rotateAngle+'deg)'; lineSpin.appendChild(div); } content.appendChild(lineSpin); return content; }, /** * 渲染弹窗 * * @return {[type]} [description] */ _renderDialog : function() { this._createWrapper(); switch (this.type) { case 'confirm': this.dialogWrapper.className = 'ui-dialog fade'; var title, content, btns, _this = this; content = this._createContent(); btns = this._createBtns(); if (this.hasTitle) { title = this._createTitle(); this.dialogWrapper.appendChild(title); } this.dialogWrapper.appendChild(content); this.dialogWrapper.appendChild(btns); doc.appendChild(this.dialogWrapper); setTimeout(function() { _this.dialogWrapper.className = 'ui-dialog fade in'; }, this.fadeInTime); break; case 'toast': this.dialogWrapper.className = 'ui-dialog ui-toast fade'; var content = this._createContent(), _this = this; this.dialogWrapper.appendChild(content); doc.appendChild(this.dialogWrapper); setTimeout(function() { _this.dialogWrapper.className = 'ui-dialog ui-toast fade in'; }, this.fadeInTime); setTimeout(function() { _this.close(); }, this.timeout); break; case 'loading': this.dialogWrapper.className = 'ui-dialog ui-loading fade'; var text, content, _this = this; content = this._createLoadingContent(); if (this.hasLoadingText) { text = this._createLoadingText(); this.dialogWrapper.appendChild(text); } this.dialogWrapper.appendChild(content); doc.appendChild(this.dialogWrapper); setTimeout(function() { _this.dialogWrapper.className = 'ui-dialog ui-loading fade in'; }, this.fadeInTime); break; default: break; } }, /** * confirm/alert 弹窗,返回供外部使用 * * @return {[type]} [description] */ confirm : function() { var args = arguments && arguments[0], length = args && args.length; if (length === 3) { // 有标题 this.title = args[0]; this.content = args[1]; this.btns = args[2]; this.hasTitle = true; } else if(length === 2) { this.content = args[0]; this.btns = args[1]; this.hasTitle = false; } else { // alert this.hasTitle = false; this.content = args[0]; this.btns = [{name : '确定'}] } this.type = 'confirm'; this._create(); }, /** * toast弹窗,返回供外部使用 * * @return {[type]} [description] */ toast : function() { var args = arguments && arguments[0], length = args && args.length; if (length === 2) { this.content = args[0]; this.timeout = args[1]; } else if(length === 1) { this.content = args[0]; } this.type = 'toast'; if (!this.hasDialog) { this._create(); } this.hasDialog = true; }, /** * loading弹窗,返回供外部使用 * * @return {[type]} [description] */ showLoading : function() { var args = arguments && arguments[0], length = args && args.length; // 带有参数 if (length === 1) { this.loadingText = args[0]; this.hasLoadingText = true; } this.type = 'loading'; this._create(); }, /** * 创建弹窗 * * @return {[type]} [description] */ _create : function() { this._createMask(); this._renderDialog(); }, /** * 关闭弹窗 * * @return {[type]} [description] */ close : function() { this._removeMask(); this._removeWrapper(); _instance = null; _progressInstance = null; } }; function Progress() { Dialog.call(this); this.percent = 0; this.text = '正在更新程序'; this.innerBar = null; } /** * 继承 * @param {[type]} subClass [description] * @param {[type]} superClass [description] * @return {[type]} [description] */ function inherit(subClass, superClass) { function F() {} F.prototype = superClass.prototype; subClass.prototype = new F(); subClass.prototype.constructor = subClass; } /** * 继承条用 */ inherit(Progress, Dialog); /** * 创建进度条文字 * @return {[type]} [description] */ Progress.prototype._createProgressText = function() { var text = document.createElement('div'); text.className = 'ui-text'; text.textContent = this.text; return text; } /** * 创建进度条 * @return {[type]} [description] */ Progress.prototype._createProgressContent = function() { var content = document.createElement('div'), outer = document.createElement('div'), inner = document.createElement('div'); content.className = 'ui-content'; outer.className = 'ui-outer'; inner.className = 'ui-inner'; outer.appendChild(inner); content.appendChild(outer) this.innerBar = inner; return content; } /** * 进度条初始化 * @return {[type]} [description] */ Progress.prototype.init = function() { var text, content, bar, _this = this; // 创建mask this._createMask(); // 创建warpper this._createWrapper(); this.dialogWrapper.className = 'ui-dialog ui-progress fade'; // 1. 创建文字 text = this._createProgressText(); // 2. 创建内容 content = this._createProgressContent(); // 3. 将文字和content加入到warpper中 this.dialogWrapper.appendChild(text); this.dialogWrapper.appendChild(content); // 4. 将warpper加入到body中 doc.appendChild(this.dialogWrapper); setTimeout(function() { _this.dialogWrapper.className = 'ui-dialog ui-progress fade in'; }, this.fadeInTime); } /** * 创建进度条 * @return {[type]} [description] */ Progress.prototype.create = function() { var args = arguments && arguments[0], length = args && args.length; if (length === 1) { this.text = args[0]; } this.type = 'progress'; this.init(); return this; } /** * 更新进度条进度 * @return {[type]} [description] */ Progress.prototype.update = function(percent) { if (this.percent === 100) { this.close(); } this.percent = percent; this.innerBar.style.width = percent + '%'; } /** * 关闭进度条 * @return {[type]} [description] */ Progress.prototype.closeBar = function() { this.percent = 0; this.close(); } /** * 获取dialog实例 * @return {[type]} [description] */ function _getInstance() { if (!_instance) { _instance = new Dialog(); } return _instance; } /** * 获取进度条实例 * @return {[type]} [description] */ function _getProgressInstance() { if (!_progressInstance) { _progressInstance = new Progress(); } return _progressInstance; } /** * return 调用 */ return { alert : function() { return _getInstance().confirm(arguments); }, confirm : function() { return _getInstance().confirm(arguments); }, toast : function() { return _getInstance().toast(arguments); }, showLoading : function() { return _getInstance().showLoading(arguments); }, progress : function() { return _getProgressInstance().create(arguments); }, close : function() { return _getInstance().close(); } } })(document);
popup.css
.ui-mask { position: fixed; top: 0px; left: 0px; bottom: 0px; right: 0px; z-index: 10; background: rgba(0, 0, 0, 0.298039); } .ui-dialog { background-color: #fff; z-index: 11; width: 85%; position: absolute; top: 50%; left: 50%; border-radius: 5px; text-align: center; -webkit-transform: translate3D(-50%, -50%, 0); -moz-transform: translate3D(-50%, -50%, 0); -ms-transform: translate3D(-50%, -50%, 0); -o-transform: translate3D(-50%, -50%, 0); transform: translate3D(-50%, -50%, 0); } .ui-dialog>.ui-title { padding: 10px 0; border-bottom: 1px solid #e5e5e5; } .ui-dialog>.ui-content { padding: 15px 3px; } .ui-dialog>.ui-btns { border-top: 1px solid #e5e5e5; font-size: 14px; display: flex; } .ui-dialog>.ui-btns>a { flex: 1; line-height: 42px; text-align: center; color: #09f; text-decoration: none; -webkit-tap-highlight-color: transparent; border-right: 1px solid #e5e5e5; } .ui-dialog>.ui-btns>a:last-child { border-right: none; } .ui-toast { width: auto; min-width: 35%; max-width: 60%; } .ui-toast>.ui-content { background-color: rgba(0, 0, 0, 0.7); color: #fff; padding: 20px 10px; border-radius: 5px; } .ui-loading>.ui-content { box-sizing: border-box; padding: 0; height: 60px; position: absolute; width: 100%; border-radius: 5px 5px 0 0; background-color: rgba(0, 0, 0, 0.7); color: #fff; } .ui-loading { width: 30%; height: 86px; } .ui-line-spin { position: absolute; left: 50%; top: 50%; transform: translate3d(-50%, -50%, 0); } .ui-line-spin>div { position: absolute; width: 3px; height: 10px; background-color: #fff; border-radius: 1px; -webkit-animation-fill-mode: both; animation-fill-mode: both; margin: 2px; transform-origin: 50% 0%; } @keyframes line-spin { 0% { background-color: #fff; } 50% { background-color: rgb(0, 0, 0); } 100% { background-color: #fff; } } .ui-line-spin>div:nth-of-type(1) { animation: line-spin 1.2s 0.12s ease-in-out infinite; } .ui-line-spin>div:nth-of-type(2) { animation: line-spin 1.2s 0.24s ease-in-out infinite; } .ui-line-spin>div:nth-of-type(3) { animation: line-spin 1.2s 0.36s ease-in-out infinite; } .ui-line-spin>div:nth-of-type(4) { animation: line-spin 1.2s 0.48s ease-in-out infinite; } .ui-line-spin>div:nth-of-type(5) { animation: line-spin 1.2s 0.60s ease-in-out infinite; } .ui-line-spin>div:nth-of-type(6) { animation: line-spin 1.2s 0.72s ease-in-out infinite; } .ui-line-spin>div:nth-of-type(7) { animation: line-spin 1.2s 0.84s ease-in-out infinite; } .ui-line-spin>div:nth-of-type(8) { animation: line-spin 1.2s 0.96s ease-in-out infinite; } .ui-loading>.ui-text { position: absolute; width: 100%; top: 60px; padding-bottom: 10px; background-color: rgba(0,0,0,0.7); font-size: 14px; color: #fff; border-radius: 0 0 5px 5px; } .ui-progress { background-color: rgba(0, 0, 0, 0.7); width: auto; max-width: 65%; } .ui-progress>.ui-content { width: 100%; padding: 6px 20px 15px 20px; box-sizing: border-box; } .ui-progress>.ui-content>.ui-outer { height: 5px; background-color: rgba(255, 255, 255, 0.5); border-radius: 3px; } .ui-progress>.ui-content>.ui-outer>.ui-inner { width: 0%; height: 100%; background-color: rgba(255, 255, 255, 0.8); border-radius: inherit; } .ui-progress>.ui-text { font-size: 14px; line-height: 16px; padding: 10px 20px; color: #fff; } .fade { opacity: 0; transition: opacity 0.25s linear; -webkit-transition: opacity 0.25s linear; -moz-transition: opacity 0.25s linear; } .fade.in { opacity: 1; }
//页面调用就行啦
<link rel="stylesheet" type="text/css" href="option/popup.css"/>
<script type="text/javascript" src="option/popup.js"></script> //这句写在body里
Popup.toast(data.msg, 1200); //调用
转载:https://blog.csdn.net/qq_42431102/article/details/101452166
查看评论