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 相关文章推荐
不要小看注释掉的JS 引起的安全问题
Dec 27 Javascript
JS 去前后空格大全(IE9亲测)
Jul 15 Javascript
自动设置iframe大小的jQuery代码
Sep 11 Javascript
javascript实现Email邮件显示与删除功能
Nov 21 Javascript
浅析在javascript中创建对象的各种模式
May 06 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
May 17 Javascript
JavaScript中的this引用(推荐)
Aug 05 Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
Sep 05 Javascript
JS简单获取日期相差天数的方法
Apr 24 Javascript
JavaScript实现移动端轮播效果
Jun 06 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
Oct 01 Javascript
解决vue项目本地启动时无法携带cookie的问题
Feb 06 Vue.js
解决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
PHP 截取字符串专题集合
2010/08/19 PHP
php fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
php解决约瑟夫环示例
2014/04/09 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
JSON 教程 json入门学习笔记
2020/09/22 Javascript
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
jQuery创建平滑的页面滚动(顶部或底部)
2013/02/26 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
详谈JavaScript 匿名函数及闭包
2014/11/14 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
Node.js安装配置图文教程
2017/05/10 Javascript
js实现简单页面全屏
2019/09/17 Javascript
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[46:23]OG vs EG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
获取python文件扩展名和文件名方法
2018/02/02 Python
关于Tensorflow中的tf.train.batch函数的使用
2018/04/24 Python
python 处理string到hex脚本的方法
2018/10/26 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
python 利用pyttsx3文字转语音过程详解
2019/09/25 Python
python3 Scrapy爬虫框架ip代理配置的方法
2020/01/17 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
2020/09/28 Python
德国最大的网上鞋店之一:Schuhe24.de
2017/06/10 全球购物
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
质量月活动策划方案
2014/03/10 职场文书
邮政竞聘演讲稿
2014/09/03 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
2015年派出所民警工作总结
2015/04/24 职场文书
教师节获奖感言
2015/07/31 职场文书
企业财务管理制度范本
2015/08/04 职场文书
商业计划书范文
2019/04/24 职场文书
python数据分析之用sklearn预测糖尿病
2021/04/22 Python
详解Python牛顿插值法
2021/05/11 Python
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python