js自定义弹框插件的封装


Posted in Javascript onAugust 24, 2020

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

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

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

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

一些默认属性值

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

var defaultOpts = {
    title: '',//标题
    content: '',//内容 文字 || html
    height: 50,//默认屏幕(父级)的50%
    width: 80,//默认屏幕(父级)的80%
    type: 'alert-default',//弹框类型
    effect: 'fadeIn',//出现效果,默认下跌落
    delayTime: 500,//效果延时时间,默认.5s
    autoClose: false,//自动关闭
    autoTime: 2000, //自动关闭时间默认2s
    autoEffect: '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
    })
   })
  })
 })

效果图

js自定义弹框插件的封装

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Extjs ajax同步请求时post方式参数发送方式
Aug 05 Javascript
js实现文本框宽度自适应文本宽度的方法
Aug 13 Javascript
浅析Javascript中bind()方法的使用与实现
Apr 29 Javascript
Listloading.js移动端上拉下拉刷新组件
Aug 04 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
Sep 17 Javascript
Vue.js搭建移动端购物车界面
Jun 28 Javascript
Node.js实现注册邮箱激活功能的方法示例
Mar 23 Javascript
详解node字体压缩插件font-spider的用法
Sep 28 Javascript
vue中使用codemirror的实例详解
Nov 01 Javascript
微信小程序获取用户绑定手机号方法示例
Jul 21 Javascript
js实现网页版贪吃蛇游戏
Feb 22 Javascript
html5调用摄像头截图功能
Jan 18 Javascript
解决vue里碰到 $refs 的问题的方法
Jul 13 #Javascript
jsonp跨域请求详解
Jul 13 #Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
Jul 13 #Javascript
JavaScript反弹动画效果的实现代码
Jul 13 #Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
Jul 13 #Javascript
详解vue-cli + webpack 多页面实例配置优化方法
Jul 13 #Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
Jul 13 #Javascript
You might like
基于mysql的bbs设计(二)
2006/10/09 PHP
php实现rc4加密算法代码
2012/04/25 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
struts2 jquery 打造无限层次的树
2009/10/23 Javascript
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
js实现兼容IE、Firefox的图片缩放代码
2015/12/08 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
2017/07/16 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
vue中node_modules中第三方模块的修改使用详解
2019/05/31 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
python聊天程序实例代码分享
2013/11/18 Python
Python中字典的基础知识归纳小结
2015/08/19 Python
Python实现两个list对应元素相减操作示例
2017/06/09 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
Python random模块用法解析及简单示例
2017/12/18 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
python+POP3实现批量下载邮件附件
2018/06/19 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
TCP/IP的分层模型
2013/10/27 面试题
技术学校毕业生求职信分享
2013/12/02 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
社区网格化管理实施方案
2014/03/21 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
经典导游欢迎词
2015/01/26 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
2016大学军训通讯稿
2015/11/25 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
Oracle 数据仓库ETL技术之多表插入语句的示例详解
2021/04/12 Oracle
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS