移动端提示动画插件
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=1.0" /> <style> body,div,p,span{margin:0;padding:0;} body{ font-family: "Microsoft Yahei","微软雅黑",Arial,Tahoma; font-size:14px; } .btn-container{ width:300px; height:100px; margin:100px auto; } /*插件css*/ #animationTipBox{ width:180px; height:auto; background-color:#fff; border-radius:8px; position:fixed; left:50%; top:50%; margin-left:-90px; margin-top:-75px; z-index:1001; -webkit-animation:alertAnimation 0.3s ease-in-out 0 1; } #sm-load{ width:20px; height: 20px; padding:0; background:none; padding:0; position:relative; float:left; vertical-align:middle; margin-right:5px; top:0; left:0; margin: 0; -webkit-animation:none; } #sm-load .load{ width: 20px; height: 20px; border:none; margin:0 auto; top:0; } #sm-load .icon_box{ margin:0 auto; } #sm-load .load .cirBox1,#sm-load .load .cirBox2,#sm-load .load .cirBox3{ width: 20px; height: 20px; position: absolute; left: 0; top: 0; } #sm-load .load .cirBox1 > div,#sm-load .load .cirBox2 > div,#sm-load .load .cirBox3 > div{ width: 4px; height:4px; border-radius: 100%; background-color: #fff; position: absolute; } #sm-load .load .icon_box{ width:20px; height:20px; } #animationTipBox .icon{ position:relative; width:80px; height:80px; border-radius:50px; border:4px solid #66cc33; margin:15px auto 5px auto; } #animationTipBox .icon_box{ width:80px; height:80px; margin:0 auto; text-align:center; position:relative; } .tip .icon{ width:80px; height:80px; background-color:#66cc33; border-radius:100%; color:#fff; font-size:80px; text-align:center; line-height:80px; } #animationTipBox .lose .icon{ border-color:#FF9090; } #animationTipBox .lose .icon_box{ -webkit-animation:lose_Animation 0.5s; } #animationTipBox .dec_txt{ font-size:16px; text-align:center; color:#666; line-height:26px; height:26px; padding:5px 0 10px 0; } .success .line_short{ width:25px; height:5px; position:absolute; left: 14px; top: 46px; border-radius:4px; background-color:#66cc33; -webkit-transform:rotate(45deg); transform:rotate(45deg); -webkit-animation:success_short_Animation 0.65s; } .success .line_long{ width:47px; height:5px; position:absolute; right: 8px; top: 38px; border-radius:4px; background-color:#66cc33; -webkit-transform:rotate(-45deg); -webkit-animation:success_long_Animation 0.65s; } .lose .line_left,.lose .line_right{ width:47px; height:5px; position:absolute; left: 17px; top: 37px; border-radius:4px; background-color:#FF9090; -webkit-transform:rotate(45deg); transform:rotate(45deg); } .lose .line_right{ right: 11px; top: 37px; -webkit-transform:rotate(-45deg); transform:rotate(-45deg); } /* tipBoxKeyFrames */ @keyframes alertAnimation{ 0% { transform: scale(0.5); } 45% { transform: scale(1.25); } 80% { transform: scale(0.95); } 100% { transform: scale(1); } } @-webkit-keyframes alertAnimation{ 0% { -webkit-transform: scale(0.5); } 45% { -webkit-transform: scale(1.25); } 80% { -webkit-transform: scale(0.95); } 100% { -webkit-transform: scale(1); } } /* tipBoxKeyFrames */ /*success_Animation*/ @-webkit-keyframes success_short_Animation{ 0% { width: 0; left: 1px; top: 19px; } 54% { width: 0; left: 1px; top: 19px; } 70% { width: 50px; left: -4px; top: 37px; } 84% { width: 17px; left: 21px; top: 48px; } 100% { width: 25px; left: 14px; top: 45px; } } @keyframes success_short_Animation{ 0% { width: 0; left: 1px; top: 19px; } 54% { width: 0; left: 1px; top: 19px; } 70% { width: 50px; left: -4px; top: 37px; } 84% { width: 17px; left: 21px; top: 48px; } 100% { width: 25px; left: 14px; top: 45px; } } @-webkit-keyframes success_long_Animation{ 0% { width: 0; right: 46px; top: 54px; } 65% { width: 0; right: 46px; top: 54px; } 84% { width: 55px; right: 0px; top: 35px; } 100% { width: 47px; right: 8px; top: 38px; } } @keyframes success_long_Animation{ 0% { width: 0; right: 46px; top: 54px; } 65% { width: 0; right: 46px; top: 54px; } 84% { width: 55px; right: 0px; top: 35px; } 100% { width: 47px; right: 8px; top: 38px; } } /*success_Animation*/ /* ---------------------------------------------------------------------------------------------------------------------------- */ /*lose_Animation*/ @-webkit-keyframes lose_Animation{ 0%{ -webkit-transform:scale(0.6); opacity:0.2; } 50% { -webkit-transform:scale(0.6); opacity:0.5; } 80% { -webkit-transform:scale(1.15); opacity:0.8; } 100% { -webkit-transform:scale(1); opacity:1.0; } } /*lose_Animation*/ /*load_Animation*/ @-webkit-keyframes load_Animation{ 0%{ -webkit-transform:scale(0.6); opacity:0.2; } 50% { -webkit-transform:scale(0.6); opacity:0.5; } 80% { -webkit-transform:scale(1.15); opacity:0.8; } 100% { -webkit-transform:scale(1); opacity:1.0; } } /*load_Animation*/ .load{ position: relative; width: 60px; height: 80px; border-radius: 50px; border: 4px solid #fff; margin: 15px auto 5px auto; top: 10px; } .load .icon_box{ margin:10px auto; width:60px; height:60px; } .load .cirBox1,.load .cirBox2,.load .cirBox3{ width:60px; height:60px; position:absolute; left:0; top:0; } .load .cirBox1 > div,.load .cirBox2 > div,.load .cirBox3 > div{ width:10px; height:10px; border-radius:100%; background-color:#ccc; position:absolute; } .load .cirBox1{ -webkit-transform:rotate(30deg); } .load .cirBox2{ -webkit-transform:rotate(60deg); } .load .cirBox3{ -webkit-transform:rotate(90deg); } .load .cir1{ left:0; top:0; } .load .cir2{ right:0; top:0; } .load .cir3{ right:0; bottom:0; } .load .cir4{ left:0; bottom:0; } .load .cir1,.load .cir2,.load .cir3,.load .cir4{ -webkit-animation:cir_Animation 1.2s ease 0 infinite; } .cirBox1 .cir2{ -webkit-animation-delay:-1.1s; } .cirBox1 .cir3{ -webkit-animation-delay:-0.8s; } .cirBox1 .cir4{ -webkit-animation-delay:-0.5s; } .cirBox2 .cir2{ -webkit-animation-delay:-1.0s; } .cirBox2 .cir3{ -webkit-animation-delay:-0.7s; } .cirBox2 .cir4{ -webkit-animation-delay:-0.4s; } .cirBox3 .cir2{ -webkit-animation-delay:-0.9s; } .cirBox3 .cir3{ -webkit-animation-delay:-0.6s; } .cirBox3 .cir4{ -webkit-animation-delay:-0.3s; } @-webkit-keyframes cir_Animation{ 0%,80%,100%{ -webkit-transform:scale(0.4); } 40%{ -webkit-transform:scale(1.0); } } .mask{ width:100%; height:100%; background-color:#000; opacity:.8; position: fixed; left: 0; top: 0; z-index:1000; } </style> </head> <body> <div class="btn-container"> <input type="button" id="success" value="成功" /> <input type="button" id="error" value="错误" /> <input type="button" id="load" value="正在加载" /> <input type="button" id="tip" value="提示" /> </div> </body> </html> <script src="http://libs.baidu.com/zepto/0.8/zepto.min.js"></script> <script type="text/javascript"> /* * @弹出提示层 ( 加载动画(load), 提示动画(tip), 成功(success), 错误(error), ) * @method tipBox * @description 默认配置参数 * @time 2014-12-19 * @param {Number} width -宽度 * @param {Number} height -高度 * @param {String} str -默认文字 * @param {Object} windowDom -载入窗口 默认当前窗口 * @param {Number} setTime -定时消失(毫秒) 默认为0 不消失 * @param {Boolean} hasMask -是否显示遮罩 * @param {Boolean} hasMaskWhite -显示白色遮罩 * @param {Boolean} clickDomCancel -点击空白取消 * @param {Function} callBack -回调函数 (只在开启定时消失时才生效) * @param {String} type -动画类型 (加载,成功,失败,提示) * @example * new TipBox(); * new TipBox({type:'load',setTime:1000,callBack:function(){ alert(..) }}); */ function TipBox(cfg){ this.config = { width : 180, height : 150, str : '正在处理', windowDom : window, setTime : 0, hasMask : true, hasMaskWhite : false, clickDomCancel : false, callBack : null, type : 'success' } $.extend(this.config,cfg); //存在就retrun if(TipBox.prototype.boundingBox) return; //初始化 this.render(this.config.type); return this; }; //外层box TipBox.prototype.boundingBox = null; //渲染 TipBox.prototype.render = function(tipType,container){ this.renderUI(tipType); //绑定事件 this.bindUI(); //初始化UI this.syncUI(); $(container || this.config.windowDom.document.body).append(TipBox.prototype.boundingBox); }; //渲染UI TipBox.prototype.renderUI = function(tipType){ TipBox.prototype.boundingBox = $("<div id='animationTipBox'></div>"); tipType == 'load' && this.loadRenderUI(); tipType == 'success' && this.successRenderUI(); tipType == 'error' && this.errorRenderUI(); tipType == 'tip' && this.tipRenderUI(); TipBox.prototype.boundingBox.appendTo(this.config.windowDom.document.body); //是否显示遮罩 if(this.config.hasMask){ this.config.hasMaskWhite ? this._mask = $("<div class='mask_white'></div>") : this._mask = $("<div class='mask'></div>"); this._mask.appendTo(this.config.windowDom.document.body); } //定时消失 _this = this; !this.config.setTime && typeof this.config.callBack === "function" && (this.config.setTime = 1); this.config.setTime && setTimeout( function(){ _this.close(); }, _this.config.setTime ); }; TipBox.prototype.bindUI = function(){ _this = this; //点击空白立即取消 this.config.clickDomCancel && this._mask && this._mask.click(function(){_this.close();}); }; TipBox.prototype.syncUI = function(){ TipBox.prototype.boundingBox.css({ width : this.config.width+'px', height : this.config.height+'px', marginLeft : "-"+(this.config.width/2)+'px', marginTop : "-"+(this.config.height/2)+'px' }); }; //提示效果UI TipBox.prototype.tipRenderUI = function(){ var tip = "<div class='tip'>"; tip +=" <div class='icon'>i</div>"; tip +=" <div class='dec_txt'>"+this.config.str+"</div>"; tip += "</div>"; TipBox.prototype.boundingBox.append(tip); }; //成功效果UI TipBox.prototype.successRenderUI = function(){ var suc = "<div class='success'>"; suc +=" <div class='icon'>"; suc += "<div class='line_short'></div>"; suc += "<div class='line_long'></div> "; suc += "</div>"; suc +=" <div class='dec_txt'>"+this.config.str+"</div>"; suc += "</div>"; TipBox.prototype.boundingBox.append(suc); }; //错误效果UI TipBox.prototype.errorRenderUI = function(){ var err = "<div class='lose'>"; err += " <div class='icon'>"; err += " <div class='icon_box'>"; err += " <div class='line_left'></div>"; err += " <div class='line_right'></div>"; err += " </div>"; err += " </div>"; err += "<div class='dec_txt'>"+this.config.str+"</div>"; err += "</div>"; TipBox.prototype.boundingBox.append(err); }; //加载动画load UI TipBox.prototype.loadRenderUI = function(){ var load = "<div class='load'>"; load += "<div class='icon_box'>"; for(var i = 1; i < 4; i++ ){ load += "<div class='cirBox"+i+"'>"; load += "<div class='cir1'></div>"; load += "<div class='cir2'></div>"; load += "<div class='cir3'></div>"; load += "<div class='cir4'></div>"; load += "</div>"; } load += "</div>"; load += "</div>"; load += "<div class='dec_txt'>"+this.config.str+"</div>"; TipBox.prototype.boundingBox.append(load); }; //关闭 TipBox.prototype.close = function(){ TipBox.prototype.destroy(); this.destroy(); this.config.setTime && typeof this.config.callBack === "function" && this.config.callBack(); }; //销毁 TipBox.prototype.destroy = function(){ this._mask && this._mask.remove(); TipBox.prototype.boundingBox && TipBox.prototype.boundingBox.remove(); TipBox.prototype.boundingBox = null; }; </script> <script type="text/javascript"> //成功 $("#success").click(function(){ new TipBox({type:'success',str:'操作成功',setTime:1500}); }); //错误 $("#error").click(function(){ new TipBox({type:'error',str:'对不起,出错了!',setTime:1500}); }); //提示 $("#tip").click(function(){ new TipBox({type:'tip',str:'这是提示信息',setTime:1500}); }); //加载 $("#load").click(function(){ new TipBox({type:'load',str:"努力加载中..",setTime:1500,callBack:function(){ new TipBox({type:'success',str:'操作成功',setTime:1500}); }}); }); </script>