自己封装一个弹框插件

弹出层提示信息,这是移动前端开发中最常见的需求,你可能会想到一些流行的弹框插件,比如 经典的artDialog 炫酷的Sweetalert等等..

但是慢慢地你其实会发现通常情况下需求定制化要求较高,一般的弹框插件可能只满足大部分要求,自定义花的时间还不如手动自己封装一个符合自己开发习惯的弹框组件,这样后续开发效率将大大提高。

 

首先整理一下思路,原生javascript其实是有实现alert()方法的,但是那个会暂时性中断程序运行,并且足以让你丑拒!那么抛开这些细细一想,其实弹框就是两个div层,一个浮在底下的蒙层(遮罩层),将所有的元素遮起来,并且最好是半透明。另一个就是弹框主体部分了,一般情况需要水平垂直居中,并且通常包含标题,主体内容需要可定制,如果是模态框通常还有确认/取消按钮。最后就是弹出、关闭的时候一些动效。

 所以说完全可以自己封装一个,然后放在项目中公共js中去。能自己手写的尽量不用插件....

 

一些默认属性值

通过一个foreach循环,类似于传入的opts继承了defaultOpts属性,在调用弹框之前执行的before()方法,相当于一些准备工作

复制代码
var defaultOpts = {title: '',//标题content: '',//内容  文字 || htmlheight: 50,//默认屏幕(父级)的50%width: 80,//默认屏幕(父级)的80%type: 'alert-default',//弹框类型effect: 'fadeIn',//出现效果,默认下跌落delayTime: 500,//效果延时时间,默认.5sautoClose: false,//自动关闭autoTime: 2000, //自动关闭时间默认2sautoEffect: 'default',//关闭效果ok: '确定',okCallback: function(){},//确定回调cancel: '取消',cancelCallback: function(){},//取消回调before : function() {console.log('before')}, close: function() {console.log('close')},blankclose: false//空白处点击关闭}for (i in defaultOpts) {if (opts[i] === undefined) {opts[i] = defaultOpts[i]}}
  
  opts.before && opts.before()
复制代码

 

dom结构

定义一个数组对象,里面放弹框的dom元素,alert-mask为全屏的遮罩层,alert-content为弹框的主要内容区,最后通过.join(‘’)函数将数组转换为html ,再用jquery的append()方法追加在body节点最后。

复制代码
var alertHtml = ['<section class="alert-main" id="alertMain">','<div class="alert-mask li-opacity" id="alertMask"></div>','<div class="alert-content '+ opts.type +'" id="alertContent">',opts.content +'</div>','</section>']$('body').append(alertHtml.join(''))
复制代码

 

设置高宽了,水平垂直居中

我这里是采用fixed定位,然后height是传进来的高(百分比),top距离屏幕顶端距离百分比为 100-传进来的高 /2 ,这样就实现了垂直居中,同理宽度也一样。这种水平垂直居中的办法也是自己长期实践总结出来自己认为最简单最实用的,兼容各种屏幕大小,当然还有很多方法,可以自行尝试

复制代码
var $alertContent = $('#alertContent'),$alertMain = $('#alertMain');$alertContent.css({'height': opts.height + '%','top': (100 - opts.height)/2 + '%','width': opts.width + '%','left': (100 - opts.width)/2 + '%'})$('.li-opacity').css({'-webkit-animation-duration' : opts.delayTime/1000 + 's'})
复制代码

最后一句是给遮罩层赋一个动画执行时间,实现淡入效果。详情见下面的CSS @-webkit-keyframes opacity

 

弹框效果

我这里实现了四个效果,分别是fadeIn跌落,sideLeft从左侧飞入,scale放大,info提示信息。可以看到,我是定义了一个集合对象,分别放置了对应的css属性,然后通过两个setTimeout函数统一赋值

复制代码
var effect = {'fadeIn': 'top','fadeInStart': '-100%','fadeInValue': (100 - opts.height)/2 + '%','sideLeft': 'left','sideLeftStart': '-100%','sideLeftValue': (100 - opts.width)/2 + '%','scale': '-webkit-transform','scaleStart': 'scale(0)','scaleValue': 'scale(1)','info': '-webkit-transform','infoStart': 'scale(1.2)','infoValue': 'scale(1)'}setTimeout(function(){$alertContent.css(effect[opts.effect],effect[opts.effect + 'Start']).addClass('alert-show')setTimeout(function(){$alertContent.css(effect[opts.effect], effect[opts.effect + 'Value'])opts.close && opts.close()},10)},opts.delayTime)
复制代码

 

空白处点击关闭

通常情况下的需求,都会是要点击弹框空白处关闭弹框,一个点击事件搞定,重点是前面的选择器,jquery给了我们太多方便.... 当然最后为了防止点击到页面其他元素,阻止事件冒泡,组件默认行为..

复制代码
if(opts.blankclose) {$('.alert-main :not(.alert-content)').on('click',function(event){$alertMain.remove()opts.close && opts.close()event.stopPropagation()event.preventDefault()})}
复制代码

 

自动关闭

当autoClose为true,并且autoTime大于零时,用一个延时事件自动关闭弹框

if(opts.autoClose && opts.autoTime > 0) {setTimeout(function(){$alertMain.remove()},opts.autoTime)opts.close && opts.close()}

 

演示:

css

复制代码
@-webkit-keyframes opacity {0% {opacity: 0; /*初始状态 透明度为0*/}50% {opacity: 0; /*中间状态 透明度为0*/}100% {opacity: 1; /*结尾状态 透明度为1*/}}.li-opacity {-webkit-animation-name: opacity; /*动画名称*/-webkit-animation-iteration-count: 1; /*动画次数*/-webkit-animation-delay: 0s; /*延迟时间*/}.alert-mask {position: fixed;height: 100%;width: 100%;left: 0%;top: 0%;z-index: 9998;background-color: rgba(0,0,0,.7);}.alert-content {position: fixed;box-sizing: border-box;border-radius: 4px;z-index: 9999;-webkit-transition: .4s;-moz-transition: .4s;transition: .4s;display: none;}.alert-show {display: block;}.alert-default {background-color: white;}
复制代码

 

html

<p class="alert" data-flag="fadeIn">fadeIn</p><p class="alert" data-flag="sideLeft">sideLeft</p><p class="alert" data-flag="scale">scale</p><p class="alert" data-flag="info">info</p>

 

js

复制代码
require.config({jquery:'component/jquery/jquery-3.1.0.min',liAlert: 'li/li-alert',//常用弹框组件
})require(['jquery'],function($){require(['liAlert'],function(){$('.alert').on('click',function(event){$.alert({content: '<h1 style="display:flex;justify-content:center;">我是弹框</h1>',effect: $(event.currentTarget).attr('data-flag'),blankclose: true,//autoClose: true})})})})
复制代码

 

效果图

 

完整的代码已上传github: https://github.com/helijun/component/tree/master/alert

 

ITer,请跟随兴趣一路前行,个人站点www.liliangel.cn,欢迎指导交流

转载于:https://www.cnblogs.com/libin-1/p/6181953.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET MAUI 性能提升

点击蓝字关注我们作者&#xff1a;Jonathan Peppers翻译&#xff1a;Yijing Sun校稿&#xff1a;Amy Peng排版&#xff1a;Rani Sun精彩预告*本文干货满满&#xff0c;预计阅读时间32分钟&#xff0c;建议收藏保存。.NET多平台应用程序UI (MAUI)将android、iOS、macOS和Windows…

C语言试题155之有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出 平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件“stud“中

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:有五个学生,每个学生有 3 门…

仿照支付宝账单界面--listview分组显示 用来做!发!财树充值交易明细

QQ图片20150430155638.png (151.65 KB, 下载次数: 32) 下载链接: http://pan.baidu.com/s/1kVMY1SV 密码: i8ta

C语言试题156之有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件 C 中。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:有两个磁盘文件 A 和 B,各存…

【ArcGIS微课1000例】0002:创建渔网(Create fishnet)

本文讲解ArcGIS软件中渔网(fishnet)工具的原理,方法及使用技巧。 文章目录 微课目标工具介绍实现过程微课目标 如下图所示,影像为无人机航测生产的DOM,现在需要在ArcGIS平台中进行DLG数据采集(数字化),由于测区较大,需要创建500*500的渔网,并对影像进行裁剪下发给多…

使用 Scrutor 快速实现“装饰者模式”

装饰者模式介绍装饰器模式&#xff08;Decorator Pattern&#xff09;是在不改变原类和使用继承的情况下&#xff0c;动态地给一个对象添加一些额外的职责。它是通过创建一个包装对象&#xff0c;也就是装饰来包裹真实的对象。可以在如下使用场景中使用装饰器模式&#xff1a;在…

C语言试题157之从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。 输入的字符串以!结束

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:从键盘输入一个字符串,将小…

【ArcGIS微课1000例】0001:添加XY数据(Add XY data)生成shp

用过CASS的人都知道&#xff0c;野外数字测图得到的点数据&#xff08;平面坐标&#xff09;可以直接在CASS中展点&#xff0c;进一步绘制地形图。那么&#xff0c;带有坐标的数据能不能在ArcGIS中实现点图层的生成呢&#xff1f;答案是必须的&#xff01; 本文以气象台站Excel…

算法导论--广度优先搜索和深度优先搜索

广度优先搜索 在给定图G(V,E)和一个特定的源顶点s的情况下&#xff0c;广度优先搜索系统地探索G中的边&#xff0c;以期“发现”可从s 到达的所有顶点&#xff0c;并计算s 到所有这些可达顶点之间的距离&#xff08;即最少的边数&#xff09;。该搜索算法同时还能生成一棵根为s…

动手学 docker

背景动手学 docker最近&#xff0c;终于完成了 动手学 docker 系列的编写。动手学 docker 是 动手学系列 的首个系列。如果反馈的效果不错&#xff0c;后续还将推出 动手学 devops动手学 kubernetes动手学 istio 等系列。动手学系列 的构思来源于 李沐 老师的 动手学深度学习 。…

Linux零基础入学之1-1课程介绍了解RHEL7安装RHEL7

【本节内容】* 课程介绍* RHEL7了解* RHEL7.2的安装* 实战&#xff1a;组装服务器【Linux介绍】服务器种类&#xff1a;刀片式、塔式&#xff08;机架式&#xff09;1U&#xff1a;4.45cm 三指宽 指服务器的高度贝尔实验室 Unix 肯汤普森 & 丹尼斯里奇二人合作用…

[转]Android 常见安全漏洞修复理论与实践

前言 前段时间公司对应用在爱加密上进行了安全扫描&#xff0c;本文将基于爱加密的漏洞分析报告&#xff0c;针对部分内容&#xff0c;介绍理论修复实践 最小化特权准则概念介绍 最小化特权准则&#xff0c;即指组件只能供自身应用调用&#xff0c;尽可能禁止其他应用访问及…

C语言试题158之从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:从键盘输入一些字符,逐个把…

我是怎么自学 Git / GitHub 的?

大家好我是鱼皮&#xff0c;Git 和 GitHub 是如今团队协作开发必不可少的技能&#xff0c;且不说程序员&#xff0c;就连很多产品也在学习它们。今天分享一下我自学 Git 和 GitHub 的经验&#xff0c;希望起到一个 导学 的作用&#xff0c;帮助大家抓住重点&#xff0c;节省时间…

【ArcGIS微课1000例】0004:值提取至点(Extract value to point)

文章目录 问题描述值提取至点工具介绍案例实现过程注意事项问题描述 研究区分布有成千上万个离散的矢量点(根据范围创建随机点),但是点上没有高程值,研究区DEM是有的,那么怎样在ArcGIS中提取每个点对应的高程值? 离散点分布情况: DEM数据(ArcGlobe中三维显示):

C语言试题159之计算字符串中子串出现的次数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 题目:两个字符串连接程序 2 、温馨…

关于Android studio找不到sqlite数据库的解决方法

打开Android Device Monitor,剩下的与Eclipse相同。转载于:https://blog.51cto.com/10237758/1761397

linux ubuntu deepin apache2 rewrite

2019独角兽企业重金招聘Python工程师标准>>> apache php 环境装好了&#xff0c;下载了TP5的项目&#xff0c;然后部署上去之后&#xff0c;端口81&#xff0c;&#xff0c;但是 访问 127.0.0.1:81 正常 127.0.0.1:81/admin&#xff0c;报错 404 Not Found 原因是,…

[转]Android-Proguard(代码混淆)

一&#xff1a;混淆是什么&#xff0c;该怎么做&#xff1f; 如果我们的app正常发布就必须要经历混淆这一步&#xff0c;混淆可以使我们的app不那么容易被别人用反编译工具破解&#xff0c;就算被破解&#xff0c;想要读懂我们的源码也是非常费劲的&#xff0c;因为混淆过的源码…

学妹,你要的C语言版AOE网络数据结构来了,就这么简单!

文章目录AOE关键路径编程AOE完整求解程序AOE关键路径编程 不难发现AOE图最大特点是没有回路&#xff0c;并且有向图方向始终是从源点走向汇点&#xff0c;且源点汇点都是一个。 把图1写成邻接矩阵文件&#xff0c;见文件P200G736.TXT&#xff0c;并在此复制G0.C到AOE.C&#x…