Popup 弹窗

简介

与dialog不同的是,popup插件讲究轻便、简单、有效,对于短小内容提示使用popup是非常适合的。本插件基于popper.js定位引擎改造而来,所使用的版本是v2.10.2。popper.js是目前最受欢迎使用最广的窗口定位插件,详见官网Github

  • data-popper-*属性均改成data-*
  • 对placement参数新增一个选项:center(在浏览器中绝对定位弹出)

使用方法

插件运行方式有两种:

  • ax*属性:对按钮使用axPopup属性,配合使用content参数即可按默认参数运行插件。
  • js实例:通过new axPopup('#ID',{content:''})方式创建实例运行。
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'伟大的中国'">点击打开小窗</a>
                                <a href="###" class="ax-btn ax-primary" id="btnDft">JS打开小窗</a>
                            

显示方式

通过trigger参数设置窗口的显示方式:

  • hover:鼠标经过按钮显示,离开按钮关闭,默认。
  • click:鼠标点击按钮显示,再次点击关闭。
  • input:在input中输入的时候显示。
  • sticky:初始化就显示,再次关闭或打开需要手写js代码。
  • none:初始化定位在按钮上,并不显示。
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'伟大的中国',trigger:'hover'">经过打开小窗</a>
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'伟大的中国',trigger:'click'">点击打开小窗</a>
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'伟大的中国',trigger:'sticky'">初始化就打开了</a>
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'伟大的中国',trigger:'none'">使用节点选择工具查看</a>
                            

窗口方向

通过设定placement参数,使窗口放置在按钮周围各个角度,可选用的值有如下:

  • top(按钮正上方),top-start(按钮正上方左侧),top-end(按钮正上方右侧)
  • bottom(按钮正下方),bottom-start(按钮正下方左侧),bottom-end(按钮正下方右侧)
  • left(按钮左侧居中),left-start(按钮左侧左上方向),left-end(按钮左侧左下方向)
  • right(按钮右侧居中),right-start(按钮右侧右上方向),right-end(按钮右侧右下方向)
  • center(绝对居中弹出),在移动端popup窗口均已center方式弹出

弹出和关闭动画

用户根据需要使用inout参数设定打开和关闭动画样式。动画的时间默认是100ms,用户可使用duration参数设置合适的时间,单位ms。

  • in,打开动画,可选:fadeIn(默认),fadeInUp,slideDown,fadeInDown,fadeInLeft,fadeInRight,springIn,scaleIn
  • out,关闭动画,可选:fadeOut(默认),fadeOutUp,slideUp,fadeOutDown,fadeOutLeft,fadeOutRight,springOut,scaleOut
这几个常用动画已经能满足大多数场景,用户可自行引入第三方动画库以实现更多的动画效果。
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'#china',in:'fadeIn',out:'fadeOut'">渐显渐隐(默认)</a>
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'#china',in:'fadeInUp',out:'fadeOutDown',duration:'300ms'">向上渐显向下渐隐</a>
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'#china',in:'fadeInDown',out:'fadeOutUp',duration:'300ms'">向下渐显向上渐隐</a>
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'#china',in:'slideDown',out:'slideUp',duration:'300ms'">逐步显示逐步隐藏</a>
                                <div class="ax-break"></div>
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'#china',in:'fadeInLeft',out:'fadeOutRight',duration:'300ms'">向左渐显向右渐隐</a>
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'#china',in:'fadeInRight',out:'fadeOutLeft',duration:'300ms'">向右渐显向左渐隐</a>
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'#china',in:'scaleIn',out:'scaleOut',duration:'300ms'">放大打开缩小关闭</a>
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'#china',in:'springIn',out:'springOut',duration:'300ms'">弹出弹回</a>
                            

分步操作

插件默认对同一个按钮进行显示隐藏操作,借助instance.show()instance.hide()的方法,对于某些场景可通过多个按钮分步操作。比如第一个按钮用于小窗定位,第二个按钮点击显示,第三个按钮点击隐藏。

注意:因为默认点击窗口之外是可以关闭窗口的,那么为了保证分步操作,需要给实例使用pageClose:false属性,也就是禁止点击窗口外关闭窗口。

  •                                             <a href="###" class="ax-btn ax-primary" id="btnPos">定位窗口</a>
                                                <a href="###" class="ax-btn ax-primary" id="clickShow">显示窗口</a>
                                                <a href="###" class="ax-btn ax-primary" id="clickHide">隐藏窗口</a>
                                            
  •                                             let stepInstance = new axPopup('#btnPos',{content:'伟大的中国',pageClose:false, });
                                                let clickShow = document.querySelector('#clickShow');
                                                let clickHide = document.querySelector('#clickHide');
                                                clickShow.onclick = function(){
                                                stepInstance.show();
                                                }
                                                clickHide.onclick = function(){
                                                stepInstance.hide();
                                                }
                                            

窗口叠窗口

本插件可自动检测窗口中是否包含子窗口,子窗口弹出后将在父窗口的z-index值基础上自动+1,以确保永远浮在最前面。支持无限叠加。注意需要给实例multiple属性添加为true。

多层窗口
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'#pop01',multiple:true">多层窗口</a>
                                <div style="display: none;" id="pop01">
                                <p>通用汉语、汉字,汉族与少数民族被统称为“中华民族”,又自称为炎黄子孙、龙的传人。</p>
                                <p align="center"><a href="###" axPopup="content:'#pop02',multiple:true">打开</a></p>
                                </div>
                                <div style="display: none;" id="pop02">
                                <p>中国,是以华夏文明为源泉、中华文化为基础,并以汉族为主体民族的多民族国家。</p>
                                <p align="center"><a href="###" axPopup="content:'伟大的中国',multiple:true">打开</a></p>
                                </div>
                            

触发事件

默认对按钮click点击打开和关闭窗口,可选择使用hover打开和关闭窗口,对应的参数是trigger。因为使用了内置的axHover方法,当使用hover方式打开窗口时,迅速移动鼠标到窗口中,可保持窗口显示状态。

                                <a href="###" class="ax-btn ax-primary" axPopup="content:'伟大的中国'">点击打开</a>
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'伟大的中国',trigger:'hover'">移入打开</a>
                            

窗口外关闭

pageClose参数是指是否允许在窗口外点击页面关闭窗口,默认是允许,即true;可设置为禁止false。

                                <a href="###" class="ax-btn ax-primary" axPopup="content:'伟大的中国'">允许</a>
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'伟大的中国',pageClose:false">不允许</a>
                            

B按钮打开A的窗口

通过设置rel参数可让其他按钮点击打开某按钮绑定的popup窗口,rel可以是id或对节点对象。

参数rel也可以是个数组。注意:如果将id数组写入rel属性中,id前后需要英文双引号。

                                <a href="###" class="ax-btn ax-primary" axPopup="content:'伟大的中国',rel:'#btnA'">窗口按钮</a>
                                <a href="###" class="ax-btn ax-primary" id="btnA">按钮A</a>
                                <a href="###" class="ax-btn ax-primary" axPopup="content:'伟大的中国',rel:['#btnB','#btnC']">窗口按钮</a>
                                <a href="###" class="ax-btn ax-primary" id="btnB">按钮B</a>
                                <a href="###" class="ax-btn ax-primary" id="btnC">按钮C</a>
                            

异步内容

异步内容是指窗口内容通过ajax形式从同域的其他页面获取的内容,使用异步内容的方式有三种:
  • 1.使用type:'async'和url:''属性。填入页面地址即可获取该页面的html内容,比如:url:"ajax/about.html"表示从about.html页面中获取所有html内容。
  • 2.使用type:'async'和url:''属性。使用格式url#id,比如:url:"ajax/about.html#china"表示从about.html页面中id=china的标签中读取内容。
  • 3.使用js参数。必填type,url和content参数,其中content可用回调函数重新组织内容。回调函数有一个参数“data”,是异步内容。
  •                                             <a href="###" class="ax-btn ax-primary" axPopup='type:"async",url:"ajax/article.html"'>简单异步内容</a>
                                                <a href="###" class="ax-btn ax-primary" axPopup='type:"async",url:"ajax/article.html#post02"'>从ID获取异步内容</a>
                                                <a href="###" class="ax-btn ax-primary" id="ajax">JS异步获取JSON</a>
                                            
  •                                             new axPopup('#ajax',{
                                                url:'ajax/axui.json',
                                                content:function(data){
                                                let html = '
      '; for(let k in data){html+='
    • '+k+':'+data[k]+'
    • ';} html+='
    '; return html; } });

自定义关闭按钮

在窗口内容中给元素添加close属性即可作为关闭本窗口的按钮。

                                <a href="###" class="ax-btn ax-primary" axPopup='content:"#close"'>自定义关闭</a>
                                <div id="close" style="display: none;">中华人民共和国中央人民政府,今天成立啦!<br /><a href="###" close class="ax-btn ax-primary">关闭</a></div>
                            

同时多个窗口

multiple参数是表示页面是否允许显示多个窗口,默认为false即显示一个;可设置为true,让页面能同时显示多个窗口。

                                <a href="###" class="ax-btn ax-primary" axPopup='content:"伟大的中国",multiple:false'>不允许</a>
                                <a href="###" class="ax-btn ax-primary" axPopup='content:"伟大的中国",multiple:true'>允许</a>
                                <a href="###" class="ax-btn ax-primary" axPopup='content:"伟大的中国",multiple:true'>也允许</a>
                            

iframe远程页面

使用type:"iframe"属性和url参数表示使用iframe,默认高度为400px。由于iframe特性,需要设置size属性为较大尺寸,比如xl或xxl;同时可按需设置height和width参数,由于内容高度超过600px会自动滚动,所以height的极限高度为600px。

                                <a href="###" class="ax-btn ax-primary" axPopup='type:"iframe",url:"http://www.axui.cn",size:"xxl",title:"打开iframe页面"'>iframe页面</a>
                            

超出滚动

css中设定内容区域的max-width是60rem(等同于600px),max-height是500px,高度超出500px将自动滚动。用户通过使用maxWidthmaxWidth参数,可使更多内容滚动。

超出滚动
                                <script type="text/javascript">
                                $('#pop15').axPopup({title:'超出滚动',placement:'top',maxWidth:800,maxHeight:200,closeable:true,content:'文字'});
                                </script>
                            

尺寸

小窗默认宽度是400rem(等同于400px),可通过size参数设置不同宽度的小窗。

  • sm:小型窗口,宽度200rem(200px)
  • md:中型窗口,宽度360rem(360px),默认尺寸
  • lg:大型窗口,宽度600rem(600px)
  • xl:大型窗口,宽度800rem(800px)
  • xxl:大型窗口,宽度1000rem(1000px)
                                <a href="###" class="ax-btn ax-primary" axPopup='size:"sm",content:"#china"'>小型尺寸</a>
                                <a href="###" class="ax-btn ax-primary" axPopup='size:"md",content:"#china"'>中型尺寸(默认)</a>
                                <a href="###" class="ax-btn ax-primary" axPopup='size:"lg",content:"#china"'>大型尺寸</a>
                                <div style="display: none;" id="china">中国,是以华夏文明为源泉、中华文化为基础,并以汉族为主体民族的多民族国家,通用汉语、汉字,汉族与少数民族被统称为“中华民族”,又自称为炎黄子孙、龙的传人。</div>
                            

任意组合内容

可对content参数使用函数形式,content函数中的this指向实例本身,巧妙使用this.*可任意组合内容。

  • this:指实例本身
  • this.options:指实例参数,比如this.options.title指窗口标题
  • this.button:指按钮Dom
  • this.wrapper:指窗口Dom
  • this.content:指窗口内容Dom
  •                                             <a href="###" class="ax-btn ax-primary" id="btnSame01" name="唐太宗牛!">我要评论</a>
                                                <a href="###" class="ax-btn ax-primary" id="btnSame02" name="宋高宗厉害!">继续评论</a>
                                                <a href="###" class="ax-btn ax-primary" id="btnSame03" name="明成祖霸气外露!">追加评论</a>
                                            
  •                                             let html = document.querySelector('#same').innerHTML;
                                                new axPopup('#btnSame01',{
                                                content:function(){
                                                return html + this.button.getAttribute('name');
                                                }
                                                });
                                                new axPopup('#btnSame02',{
                                                content:function(){
                                                return html + this.button.getAttribute('name');
                                                }
                                                });
                                                new axPopup('#btnSame03',{
                                                content:function(){
                                                return html + this.button.getAttribute('name');
                                                }
                                                });
                                            

底部按钮

通过设定footerShow参数显示窗口底部按钮。默认false不显示,可使用true显示默认按钮。用户可定义底部内容包括:1、自定义一个按钮;2、不要按钮,通过改写footer参数自定义文本。底部按钮参数如下:

                                confirm: {
                                    text: '确定',//确认按钮文字
                                    classname: '',//确认按钮的类名
                                    icon: '',//确认按钮的图标,格式是
                                    type: 'close',//按钮类型,可选择close关闭、async异步提交表单、submit直接提交表单
                                    url: '',//提交的地址,如果type为async则必须使用该参数
                                    callback: ''//确认按钮的回调函数,最终按函数方式使用,格式是function(button,content){},button是按钮节点,content是返回内容
                                },
                                cancel: {
                                    text: '关闭',//取消按钮文字
                                    classname: '',//取消按钮的类名
                                    icon: '',//取消按钮的图标
                                    callback: ''//取消按钮的回调函数,格式是function(button,content){},button是按钮节点,content是返回内容
                                },
                                diy: {
                                    text: '',//自定义按钮文字
                                    classname: '',//自定义按钮的类名
                                    icon: '',//自定义按钮的图标
                                    url: '',//自定义按钮的超链接
                                    target: '',//自定义按钮的链接目标,一般是_blank或者_self
                                    callback: ''//自定义按钮的回调函数,格式是function(button,content){},button是按钮节点,content是返回内容
                                }
                            
                                <a href="###" class="ax-btn ax-primary" axPopup='content:"伟大的中国",footerShow:true'>带常规按钮的小窗</a>
                                <a href="###" class="ax-btn ax-primary" axPopup='content:"伟大的中国",footerShow:true,note:"自定义底部文本"'>自定义底部文本的小窗</a>
                                <a href="###" class="ax-btn ax-primary" axPopup='content:"伟大的中国",footerShow:true,diy:{text:"自定义按钮",url:"http://www.axui.cn",target:"_blank"}'>带自定义按钮的小窗</a>
                            

显示列表

使用paddingclose参数制作列表小窗。列表使用方法请见:list

                                <a href="###" class="ax-btn ax-primary" axPopup='content:"#list",padding:false,close:false'>查看列表</a>
                                <div id="list" style="display: none">
                                <a href="###" class="ax-info-block">
                                <div class="ax-row">
                                <div class="ax-col"><span class="ax-ell">南航与英航签署联营合作协议代码共享</span></div>
                                <span class="ax-arrow">26次</span>
                                </div>
                                </a>
                                <div class="ax-break-line"></div>
                                <a href="###" class="ax-info-block">
                                <div class="ax-row">
                                <div class="ax-col"><span class="ax-ell">12月,到英国大城小镇看“亮灯”</span></div>
                                <span class="ax-arrow">45次</span>
                                </div>
                                </a>
                                <div class="ax-break-line"></div>
                                <div class="ax-info-block">
                                <div class="ax-row">
                                <div class="ax-col"><a href="###" class="ax-ell">英国人喝茶不再流行贵族范</a></div>
                                <span class="ax-arrow">234次</span>
                                </div>
                                </div>
                                <div class="ax-break-line"></div>
                                <div class="ax-info-block">
                                <div class="ax-row">
                                <div class="ax-col"><a href="###" class="ax-ell">西班牙斗牛与逗牛,精彩各不同</a></div>
                                <span class="ax-arrow">98次</span>
                                </div>
                                </div>
                                </div>
                            

提交表单

使用paddingclose参数制作表单小窗。表单使用方法请见:input

本插件中确认按钮是放置在form标签之外,集成了两种提交方法。

第一种是同步提交。如果使用popup装入表单,像普通表单那样页面跳转式提交表单,需要具备如下几个条件:

  • 1、当页隐藏表单内容,并且必须使用form元素包裹,通过content参数引用其ID
  • 2、type参数设置为form
  • 3、confirm的type参数设置为submit
  • 3、form元素必须设置action属性和method属性

点击确认按钮将首先执行axValidRepeat函数(函数用法),对表单内控件进行再次校验;如果全部通过将执行submit()事件以跳转的方式提交表单。

                                <a href="###" class="ax-btn ax-primary" axPopup='content:"#form01",type:"form",padding:false,close:false,confirm:{type:"submit"}'>前端校验提交表单</a>
                                <a href="###" class="ax-btn ax-primary" axPopup='content:"#form02",type:"form",padding:false,close:false,confirm:{type:"submit"}'>异步校验提交表单</a>
                                <!--窗口-表单1-->
                                <div id="form01" style="display: none">
                                <form action="https://www.axui.cn" method="post">
                                <div class="ax-emulate">
                                <div class="ax-form-group">
                                <div class="ax-flex-row">
                                <div class="ax-form-label">姓名:</div>
                                <div class="ax-form-con">
                                <div class="ax-form-input"><input name="name01" placeholder="输入登录名称" type="text" axValid='type:"required"'></div>
                                </div>
                                <span class="ax-form-txt ax-color-des">必填校验</span>
                                </div>
                                </div>
                                <div class="ax-break-line"></div>
                                <div class="ax-form-group">
                                <div class="ax-flex-row">
                                <div class="ax-form-label">选择房子:</div>
                                <div class="ax-form-con">
                                <div class="ax-form-input">
                                <div class="ax-row">
                                <div class="ax-col ax-col-8"><input name="name02" placeholder="几室" value="" type="text"><span class="ax-pos-right">室</span></div>
                                <span class="ax-gutter-md"></span>
                                <div class="ax-col ax-col-8"><input name="name03" placeholder="几厅" value="" type="text"><span class="ax-pos-right">厅</span></div>
                                <span class="ax-gutter-md"></span>
                                <div class="ax-col ax-col-8"><input name="name04" placeholder="几卫" value="" type="text"><span class="ax-pos-right">卫</span></div>
                                </div>
                                </div>
                                </div>
                                </div>
                                </div>
                                <div class="ax-break-line"></div>
                                <div class="ax-form-group">
                                <div class="ax-flex-row">
                                <div class="ax-form-label">验证码:</div>
                                <div class="ax-form-con">
                                <div class="ax-form-input"><input name="name05" placeholder="输入验证码" value="" type="text"></div>
                                </div>
                                <a href="###" class="ax-form-btn ax-btn ax-primary">获取验证码</a>
                                </div>
                                </div>
                                </div>
                                </form>

                                </div>
                                <!--窗口-表单2-->
                                <div id="form02" style="display: none">
                                <form action="https://www.axui.cn" method="post">
                                <div class="ax-emulate">
                                <div class="ax-form-group">
                                <div class="ax-flex-row">
                                <div class="ax-form-label">姓名:</div>
                                <div class="ax-form-con">
                                <div class="ax-form-input"><input name="name01" placeholder="输入登录名称" type="text" axValid='url:"ajax/name.php"'></div>
                                </div>
                                <span class="ax-form-txt ax-color-des">填“李雷”</span>
                                </div>
                                </div>
                                <div class="ax-break-line"></div>
                                <div class="ax-form-group">
                                <div class="ax-flex-row">
                                <div class="ax-form-label">选择房子:</div>
                                <div class="ax-form-con">
                                <div class="ax-form-input">
                                <div class="ax-row">
                                <div class="ax-col ax-col-8"><input name="name02" placeholder="几室" value="" type="text"><span class="ax-pos-right">室</span></div>
                                <span class="ax-gutter-md"></span>
                                <div class="ax-col ax-col-8"><input name="name03" placeholder="几厅" value="" type="text"><span class="ax-pos-right">厅</span></div>
                                <span class="ax-gutter-md"></span>
                                <div class="ax-col ax-col-8"><input name="name04" placeholder="几卫" value="" type="text"><span class="ax-pos-right">卫</span></div>
                                </div>
                                </div>
                                </div>
                                </div>
                                </div>
                                <div class="ax-break-line"></div>
                                <div class="ax-form-group">
                                <div class="ax-flex-row">
                                <div class="ax-form-label">验证码:</div>
                                <div class="ax-form-con">
                                <div class="ax-form-input"><input name="name05" placeholder="输入验证码" value="" type="text"></div>
                                </div>
                                <a href="###" class="ax-form-btn ax-btn ax-primary">获取验证码</a>
                                </div>
                                </div>
                                </div>
                                </form>

                                </div>
                            

第二种是异步提交。异步提交表单不需要跳转页面即可完成表单提交,是目前前端开发中比较常见的表单提交方式。异步提交表单需要具备如下几个条件:

  • 1、当页隐藏表单内容,并且必须使用form元素包裹,通过content参数引用其ID
  • 2、type参数设置为form
  • 3、confirm的type参数设置为async
  • 3、confirm的url参数设置为异步提交地址

点击确认按钮将首先执行axValidRepeat函数(函数用法),对表单内控件进行再次校验;如果全部通过将执行axAjaxSubmit函数(函数用法)以非跳转的方式提交表单。

                                <a href="###" class="ax-btn ax-primary" axPopup='content:"#form03",type:"form",padding:false,close:false,confirm:{type:"async",url:"ajax/login.php"}'>异步提交表单</a>
                                <!--窗口-表单3-->
                                <div id="form03" style="display: none">
                                <form>
                                <div class="ax-emulate">
                                <div class="ax-form-group">
                                <div class="ax-flex-row">
                                <div class="ax-form-label">姓名:</div>
                                <div class="ax-form-con">
                                <div class="ax-form-input"><input name="name01" placeholder="输入登录名称" type="text" axValid='type:"required"'></div>
                                </div>
                                <span class="ax-form-txt ax-color-des">必填校验</span>
                                </div>
                                </div>
                                <div class="ax-break-line"></div>
                                <div class="ax-form-group">
                                <div class="ax-flex-row">
                                <div class="ax-form-label">选择房子:</div>
                                <div class="ax-form-con">
                                <div class="ax-form-input">
                                <div class="ax-row">
                                <div class="ax-col ax-col-8"><input name="name02" placeholder="几室" value="" type="text"><span class="ax-pos-right">室</span></div>
                                <span class="ax-gutter-md"></span>
                                <div class="ax-col ax-col-8"><input name="name03" placeholder="几厅" value="" type="text"><span class="ax-pos-right">厅</span></div>
                                <span class="ax-gutter-md"></span>
                                <div class="ax-col ax-col-8"><input name="name04" placeholder="几卫" value="" type="text"><span class="ax-pos-right">卫</span></div>
                                </div>
                                </div>
                                </div>
                                </div>
                                </div>
                                <div class="ax-break-line"></div>
                                <div class="ax-form-group">
                                <div class="ax-flex-row">
                                <div class="ax-form-label">验证码:</div>
                                <div class="ax-form-con">
                                <div class="ax-form-input"><input name="name05" placeholder="输入验证码" value="" type="text"></div>
                                </div>
                                <a href="###" class="ax-form-btn ax-btn ax-primary">获取验证码</a>
                                </div>
                                </div>
                                </div>
                                </form>

                                </div>
                            

多媒体弹窗

本插件不仅可以弹出纯文本,也可以弹出图片、视频、音频等多媒体文件。多媒体文件分别用各自的属性表示。

  • 使用type:'picture'和url属性表示显示一张图片,请填入一个图片地址。
  • 使用type:'video'和url属性表示显示一个视频,请填入一个视频地址。
  • 使用type:'audio'和url属性表示显示一个音频,请填入一个音频地址。
  • 使用type:'iframe'和url属性表示显示一个网址,请填入一个网址;使用iframe属性,请配合使用width、height和size属性。
  • name:媒体文件的名称。
                                <a href="###" class="ax-btn ax-primary" axPopup='type:"picture",url:"https://src.axui.cn/v2.0/public/images/china01.jpg",mediaName:"中国城市夜景",close:false,content:"中国,是以华夏文明为源泉、中华文化为基础,并以汉族为主体民族的多民族国家。"'>图片</a>
                                <a href="###" class="ax-btn ax-primary" axPopup='type:"video",url:"https://src.axui.cn/v2.0/public/media/video.mp4",mediaName:"中国城市夜景",close:false,content:"中国,是以华夏文明为源泉、中华文化为基础,并以汉族为主体民族的多民族国家。"'>视频播放</a>
                                <a href="###" class="ax-btn ax-primary" axPopup='type:"audio",url:"https://src.axui.cn/v2.0/public/media/audio.mp3",mediaName:"中国城市夜景",close:false,content:"中国,是以华夏文明为源泉、中华文化为基础,并以汉族为主体民族的多民族国家。"'>音频播放</a>
                                <a href="###" class="ax-btn ax-primary" axPopup='type:"iframe",url:"http://www.axui.cn",mediaName:"中国城市夜景",padding:false,width:"800px",height:"400px"'>iframe</a>
                                <a href="###" class="ax-btn ax-primary" axPopup='content:"#table",size:"lg",close:false'>表格</a>

                                <div style="display: none;" id="table">
                                <table class="ax-table">
                                <thead>
                                <tr>
                                <th>等级</th>
                                <th>说明</th>
                                </tr>
                                </thead>
                                <tbody>
                                <tr>
                                <td>A、微小</td>
                                <td>为其他部门的工作提供服务。</td>
                                </tr>
                                <tr>
                                <td>B、略有</td>
                                <td>对实现企业的发展战略提供支持性服务。</td>
                                </tr>
                                <tr>
                                <td>C、中等</td>
                                <td>对实现企业的发展战略起到重要作用。</td>
                                </tr>
                                <tr>
                                <td>D、巨大</td>
                                <td>制定企业的发展战略,位于企业的决策层。</td>
                                </tr>
                                </tbody>
                                </table>
                                </div>
                            

销毁实例

通过使用destroy方法更新销毁实例,有回调函数但无参数。

  •                                             <a href="###" class="ax-btn ax-primary" id="popDestroy">将要销毁的</a>
                                                <a href="###" class="ax-btn ax-primary" id="btnDestroy">立即销毁</a>
                                            
  •                                             let popDestroy = new axPopup('#popDestroy', { content: '伟大的中国' });
                                                let btnDestroy = document.querySelector('#btnDestroy');
                                                btnDestroy.onclick = function () {
                                                popDestroy.destroy(function(){
                                                alert('销毁了实例!')
                                                });
                                                }
                                            

更新参数

通过使用update方法更新插件参数。该方法有两个参数,第一个参数setting:将要更新的参数,格式:{name:value};第二个参数callback:回调函数,可不填,回调函数支持三个参数:

  • 第1个参数:是否更新了,true或false,可不填
  • 第2个参数:更新之前的内容,可不填
  • 第3个参数:更新之后的内容,可不填
  •                                             <a href="###" class="ax-btn ax-primary" id="btnContent">装入内容</a>
                                                <a href="###" class="ax-btn ax-primary" id="btnUpdate">更新内容</a>
                                            
  •                                             let contentInstance = new axPopup('#btnContent', { content: '伟大的中国' });
                                                let btnUpdate = document.querySelector('#btnUpdate');
                                                btnUpdate.onclick = function () {
                                                contentInstance.updateContent('中华人民共和国中央人民政府,今天成立啦!',function(update,before,after){
                                                if(update){
                                                alert('已经更新!\n原内容:'+before+'\n新内容:'+after);
                                                }else{
                                                alert('没有要更新的内容!');
                                                }
    
                                                });
                                                }
                                            

更新内容

使用updateContent方法可更新窗口内容。updateContent的第一个值可以是“#id”,也可以是html字符串;第二个值是回调函数,可不填;其中回调函数有3个参数:

  • 第1个参数:是否更新了,true或false,可不填
  • 第2个参数:更新之前的内容,可不填
  • 第3个参数:更新之后的内容,可不填

以下演示,第一次点击“装入内容”按钮将创建一个实例并打开;关闭之后再点击“更新内容”按钮将改变之前窗口的内容;再次点击“装入内容”按钮发现内容已经改变了。

  •                                             <a href="###" class="ax-btn ax-primary" id="btnContent">装入内容</a>
                                                <a href="###" class="ax-btn ax-primary" id="btnUpdate">更新内容</a>
                                            
  •                                             let contentInstance = new axPopup('#btnContent', { content: '伟大的中国' });
                                                let btnUpdate = document.querySelector('#btnUpdate');
                                                btnUpdate.onclick = function () {
                                                contentInstance.updateContent('中华人民共和国中央人民政府,今天成立啦!',function(update,before,after){
                                                if(update){
                                                alert('已经更新!\n原内容:'+before+'\n新内容:'+after);
                                                }else{
                                                alert('没有要更新的内容!');
                                                }
    
                                                });
                                                }
                                            

更新位置

有时候我们只需要打开一个popup窗口,但是需要用在不同的按钮上面,此时我们需要借助updatePosition的方法来修改定位,该方法支持两个参数:

  • elem:改变窗口的按钮,可以是id、className或节点对象
  • callback:回调函数,无参数
  •                                             <a href="###" class="ax-btn ax-primary" id="tranPos1">原pop</a>
                                                <a href="###" class="ax-btn ax-primary" id="tranPos2">定位过来</a>
                                                <a href="###" class="ax-btn ax-primary" id="tranPos3">再次定位</a>
                                            
  •                                             let tranPos1 = document.querySelector('#tranPos1'),
                                                tranPos2 = document.querySelector('#tranPos2'),
                                                tranPos3 = document.querySelector('#tranPos3'),
                                                tranIns = new axPopup(tranPos1, { content: '伟大的中国' });
                                                tranPos1.onmouseenter = function () {
                                                tranIns.updatePosition(this);
                                                }
                                                tranPos2.onmouseenter = function () {
                                                tranIns.updatePosition(this);
                                                }
                                                tranPos3.onmouseenter = function () {
                                                tranIns.updatePosition(this);
                                                }
                                            

监听事件

借鉴jQuery的写法,本插件有若干监听方法,基本写法是:instance.on('show',function(){});具体事件说明如下:

  • show 打开窗口前执行
  • shown 打开窗口后执行
  • hide 窗口隐藏前执行
  • hidden 窗口隐藏后执行
  • update 内容或参数开始更新后执行
  • updated 内容或参数更新后执行

演示实例使用console方法,请用F12打开开发者工具中的“控制台”查看监听效果:

  •                                             <a href="###" class="ax-btn ax-primary" id="ready">打开实例进行监听</a>
                                            
  •                                             let ready = new axPopup('#ready',{
                                                content: '中国,是以华夏文明为源泉、中华文化为基础,并以汉族为主体民族的多民族国家,通用汉语、汉字,汉族与少数民族被统称为“中华民族”,又自称为炎黄子孙、龙的传人。',
                                                });
                                                ready.on('show', function () {
                                                console.log('开始打开执行')
                                                }).on('shown', function () {
                                                console.log('已经打开执行')
                                                }).on('hide', function () {
                                                console.log('关闭前执行')
                                                }).on('hidden', function () {
                                                console.log('关闭后执行')
                                                });
                                            

参数选项

                                document.addEventListener("DOMContentLoaded", function() {
                                var demo1 = new axPopup({
                                    title: '',//窗口标题,为空等于不显示
                                    titleBreak: false,//标题分割线,默认不显示
                                    placement: 'top',//窗口相对按钮的位置,可填top|top-start|top-end|bottom|bottom-start|bottom-end|left|left-start|left-end|right|right-start|right-end|center
                                    arrow: true,//是否显示指示箭头,默认true显示,可填false不显示
                                    trigger: 'click',//显示窗口的动作,默认click点击显示,可填hover,sticky,none
                                    pageClose: true,//点击窗口之外的区域是否允许关闭窗口,默认true允许,可填false
                                    size: '',//小窗尺寸,默认为空不设置尺寸,可填sm|md|lg|xl|xxl
                                    duration: '',//弹出和关闭窗口动画的时间,如果为空则使用css中定义的动画时间,单位ms
                                    in: 'fadeIn',//可填fadeIn,fadeInDown,fadeInUp,slideDown,fadeInLeft,fadeInRight,springIn,scaleIn等
                                    out: 'fadeOut',//可填fadeOut,fadeOutDown,fadeOutUp,slideUp,fadeOutLeft,fadeOutRight,springOut,scaleOut等
                                    multiple: false,//是否允许打开多个窗口,默认不允许
                                    offsetShow: true,//是否保持弹窗与元素的间隙,默认保持,可选false取消间隙
                                    rel: '',//可以触发本窗口的元素,可以是#id,节点对象,或数组(多个按钮均触发)
                                    theme: '',//窗口的风格,默认为空,可选crude
                                    stay: false,//设置打开后是否就不再关闭,默认为false,可选true
                                    fixDistance: 24,//如果窗口宽度或高度小于按钮,placement为*-start或*-end时箭头所处的位置,单位是px,默认值与popper.js插件一致
                                    name: '',//多媒体文件名称
                                    size: 'md',//窗口尺寸,默认正常尺寸,可填sm,middle,large,full
                                    width: '',//内容宽度,当type是iframe的时候,有必要设置该参数,比如800px
                                    height: '',//内容高度,当type是iframe的时候,有必要设置该参数,比如400px,但是不要超过600px否则会产生垂直滚动条
                                    padding: 'ax-padding',//窗口内边距,值可以是布尔值也可以是类名,默认带边距,可填false,true,ax-padding,ax-padding ax-xxl,...
                                    content: '',//窗口内容,可填#id或html,
                                    type: 'html',//内容的类型,默认是html,可填picture|video|audio|iframe|async|html|form
                                    url: '',//异步请求地址,可填“url”或者“url#id”
                                    btnClass: 'ax-popup-open',//触发按钮在打开气泡后新增的样式名
                                    close: true,//关闭窗口的按钮,默认显示
                                    footerShow: true,//是否显示底部,默认显示
                                    footerType: 'line',//底部按钮风格,可选center,line,right
                                    footerBreak: false,//底部分割线,默认不显示
                                    note: '',//其他内容
                                    ajaxType: 'post',//异步提交的方式,默认post,可填get
                                    preventScroll: true,//当内容过长过多的时,在下滑内容时避免页面主滚动条也滚动,默认为true,可选择false
                                    confirm: {
                                        text: '确定',//确认按钮文字
                                        classname: '',//确认按钮的类名
                                        icon: '',//确认按钮的图标,格式是
                                        type: 'close',//按钮类型,可选择close关闭、async异步提交表单、submit直接提交表单、prevent阻止按钮默认事件什么事也不做
                                        url: '',//提交的地址,如果type为async则必须使用该参数
                                        callback: ''//确认按钮的回调函数,最终按函数方式使用,格式是function(button,content){},button是按钮节点,content是返回内容
                                    },
                                    cancel: {
                                        text: '关闭',//取消按钮文字
                                        classname: '',//取消按钮的类名
                                        icon: '',//取消按钮的图标
                                        callback: ''//取消按钮的回调函数,格式是function(button,content){},button是按钮节点,content是返回内容
                                    },
                                    diy: {
                                        text: '',//自定义按钮文字
                                        classname: '',//自定义按钮的类名
                                        icon: '',//自定义按钮的图标
                                        url: '',//自定义按钮的超链接
                                        target: '',//自定义按钮的链接目标,一般是_blank或者_self
                                        callback: ''//自定义按钮的回调函数,格式是function(button,content){},button是按钮节点,content是返回内容
                                    }
                                });
                                });
                            

操作方法

名称 说明 参数说明 回调函数
init() 初始化 无参数 无回调函数
update(setting, callback) 更新所有参数 setting是用户自定义参数,是一个对象;callback是回调函数,可不填 function(update,before,after){}
update是指判断是否更新,true或false,可不填;before是指更新之前的参数,可不填;after是指更新之后的参数,可不填。
updateContent(html, callback) 更新窗口内容 html是用户自定义内容,可以是字符串也可以是DOM的ID(#ID);callback是回调函数,可不填 function(update,before,after,origin){}
update是指判断是否更新,true或false,可不填;before是指更新之前的内容,可不填;after是指更新之后的内容,可不填;origin是指原始内容,可不填。
updatePosition(elem, callback) 更新窗口位置 elem是新按钮节点,可以是#id,className或节点对象 function(){}
无参数
destroy(callback) 销毁实例 callback是回调函数,可不填 function(){}
无参数
show(callback) 打开实例窗口 callback是回调函数,可不填 function(){}
无参数
hide(callback) 关闭实例窗口 callback是回调函数,可不填 function(){}
无参数
on(type, handler) 监听实例 type是监听事件,具体可看前文的:监听方法;handler是回调函数 function(){}
无参数
axInstance(axPopups, name) 获取实例并重新设定参数 axPopups是当页创建的所有实例;name是指插件元素axPopup属性的name值 无回调函数
在回调函数中this均指向实例本身,所以在回调函数中可默认使用如下变量:
  • this:实例本身
  • this.targetDom:实例的Dom
  • this.options:实例的参数