[关闭]
@15013890200 2018-08-13T16:13:42.000000Z 字数 9025 阅读 1129

vue dialog 弹窗插件

vue javascript dialog 插件

tips:本次主要封装了开发过程常见的confirm(确认)、alert(警告)、prompt(输入)、tips(提示)、loading(加载)对话框

1 组件部分

1.1 template部分

  1. <template>
  2. <transition name='fade'>
  3. <div v-if="type">
  4. <div class="j_d_modal" :class="{'j_d_modal_white': type == 'loading'}" v-if='type != "msg"' @click="hide"></div>
  5. <!-- 确认对话框 -->
  6. <div class="j_diy_dialog_window clearfix" ref="MyWindow" id="j_diy_dialog_window" style="opacity:0" v-if='type == "confirm"'>
  7. <div class="j_head_div clearfix">
  8. <span class="j_sp_title">{{title}}</span>
  9. <span class="j_sp_close" @click="hide">X</span>
  10. </div>
  11. <div class="j_body_div clearfix">
  12. <span>{{msg}}</span>
  13. </div>
  14. <div class="j_btn_group clearfix">
  15. <button class="btn j_btn-ensure" @click='ensure'>确认</button>
  16. <button class="btn j_btn-cancel" @click='cancel'>取消</button>
  17. </div>
  18. </div>
  19. <!-- 提示信息对话框 -->
  20. <div class="j_msg_body_init clearfix" ref="MyWindow" id="j_diy_dialog_window" v-if='type == "msg"' @click="hide">
  21. <span>{{msg}}</span>
  22. </div>
  23. <!-- 警告对话框 -->
  24. <div class="j_diy_dialog_window clearfix" ref="MyWindow" id="j_diy_dialog_window" style="opacity:0" v-if='type == "alert"'>
  25. <div class="j_head_div clearfix">
  26. <span class="j_sp_title">{{title}}</span>
  27. <span class="j_sp_close" @click="hide">X</span>
  28. </div>
  29. <div class="j_body_div clearfix">
  30. <div class="j_alert_img_div clearfix"><div class="j_alert_img">!</div></div>
  31. <div class="j_alert_msg_div clearfix">
  32. <span class="j_alert_msg">{{msg}}</span>
  33. </div>
  34. </div>
  35. <div class="j_btn_group clearfix">
  36. <button class="btn j_btn-ensure" @click='alert_ensure' style="float:right;margin-right:20px;">确认</button>
  37. </div>
  38. </div>
  39. <!-- 加载对话框 -->
  40. <div class="j_loading_body clearfix" ref="MyWindow" id="j_diy_dialog_window" style="opacity:0" v-if='type == "loading"'>
  41. <div class="loading"></div>
  42. <span class="j_loading_msg">{{msg}}</span>
  43. </div>
  44. <!-- prompt对话框 -->
  45. <div class="j_diy_dialog_window clearfix" ref="MyWindow" id="j_diy_dialog_window" style="opacity:0" v-if='type == "prompt"'>
  46. <div class="j_head_div clearfix">
  47. <span class="j_sp_title">{{msg}}</span>
  48. <span class="j_sp_close" @click="hide">X</span>
  49. </div>
  50. <div class="j_body_div clearfix">
  51. <!-- <label class="j_input_title">{{msg}}</label> -->
  52. <input type="text" id="j_diy_dialog_window_input" v-model='prompt_value' class="input" :class="{'j_input_focus':focus}" :focus='focus = true'>
  53. </div>
  54. <div class="j_btn_group clearfix">
  55. <button class="btn j_btn-ensure" @click='ensure'>确认</button>
  56. <button class="btn j_btn-cancel" @click='cancel'>取消</button>
  57. </div>
  58. </div>
  59. </div>
  60. </transition>
  61. </template>

1.2 script部分

  1. <script>
  2. export default {
  3. data(){
  4. return {
  5. type: '',//对话框类型
  6. title: '提示信息',//对话框title
  7. msg: '',//对话框提示信息
  8. timing: 3,//msg对话框存在时间
  9. time_out: null,//用于取消msg对话框定时任务
  10. no: '',//confirm回调函数(取消)
  11. yes: '',//confirm回调函数(确定)
  12. callback: '',//alert回调函数
  13. prompt_value:'',//prompt输入框值
  14. focus: false
  15. }
  16. },
  17. props:{
  18. dialog:{
  19. type:Object,
  20. default:null
  21. }
  22. },
  23. methods: {
  24. open: function(obj){
  25. /* open 传入 type 打开对应对话框 */
  26. let t = this;
  27. if(obj){
  28. for(let key in obj){
  29. this.$data[key] = obj[key];
  30. }
  31. if(this.type == 'msg'){
  32. t.timing = t.timing || 3;
  33. setTimeout(function(){
  34. let win = document.getElementById('j_diy_dialog_window');
  35. setTimeout(function(){
  36. win.setAttribute('class','j_msg_body clearfix');
  37. t.setPosition();
  38. t.time_out = setTimeout(function(){
  39. t.hide();
  40. },t.timing*1000);
  41. },10);
  42. },100);
  43. }
  44. else{
  45. setTimeout(function(){
  46. t.setPosition();
  47. },10);
  48. }
  49. if(this.type == 'loading'){
  50. this.msg = this.msg || 'loading';
  51. }
  52. }
  53. },
  54. hide: function(){
  55. /* 隐藏对话框 */
  56. if(this.type == 'loading'){
  57. return;
  58. }
  59. this.type = false;
  60. clearTimeout(this.time_out);
  61. },
  62. hideAll: function(){
  63. /* 隐藏所有对话框 */
  64. clearTimeout(this.time_out);
  65. this.type = false;
  66. },
  67. setPosition: function(){
  68. /* 调整对话框在窗口的位置 */
  69. let b_width = window.innerWidth;
  70. let b_height = window.innerHeight;
  71. let win = document.getElementById('j_diy_dialog_window');
  72. let offset_w = (b_width - win.offsetWidth-100)/2;
  73. let style_txt = 'left:' + offset_w + 'px;';
  74. if(win.offsetHeight < b_height){
  75. style_txt += 'top:' + (b_height - win.offsetHeight-200)/2 +'px';
  76. }
  77. win.setAttribute('style',style_txt);
  78. },
  79. ensure: function(){
  80. /* confirm 确定按钮 */
  81. this.yes && this.yes();
  82. this.hide();
  83. },
  84. cancel: function(){
  85. /* confirm 取消按钮 */
  86. this.no && this.no();
  87. this.hide();
  88. },
  89. alert_ensure: function(){
  90. /* alert 确定按钮 */
  91. this.callback && this.callback();
  92. this.hide();
  93. },
  94. tips: function(str,timing){
  95. if(this.type) this.hideAll();
  96. let t = this;
  97. /* msg 纯提示对话框 */
  98. setTimeout(function(){
  99. t.type = 'msg';
  100. t.msg = str || '请输入提示信息';
  101. t.timing = timing || 3;
  102. setTimeout(function(){
  103. let win = document.getElementById('j_diy_dialog_window');
  104. setTimeout(function(){
  105. win.setAttribute('class','j_msg_body clearfix');
  106. t.setPosition();
  107. t.time_out = setTimeout(function(){
  108. t.hide();
  109. },t.timing*1000);
  110. },10);
  111. },100);
  112. },10);
  113. },
  114. confirm: function(){
  115. /* confirm 确认对话框 */
  116. if(this.type) this.hideAll();
  117. let t = this;
  118. let args = arguments;
  119. setTimeout(function(){
  120. t.type = 'confirm';
  121. if(args[0]){
  122. t.msg = args[0];
  123. }
  124. else{
  125. t.msg = '确认要干什么?';
  126. }
  127. if(args[1]){
  128. t.yes = args[1];
  129. }
  130. if(args[2]){
  131. t.no = args[2];
  132. }
  133. setTimeout(function(){
  134. t.setPosition();
  135. },10);
  136. },10);
  137. },
  138. alert: function(){
  139. /* alert 警告对话框 */
  140. if(this.type) this.hideAll();
  141. let t = this;
  142. let args = arguments;
  143. setTimeout(function(){
  144. t.type = 'alert';
  145. if(args[0]){
  146. t.msg = args[0];
  147. }
  148. else{
  149. t.msg = '请确认什么?';
  150. }
  151. if(args[1]){
  152. t.callback = args[1];
  153. }
  154. setTimeout(function(){
  155. t.setPosition();
  156. },10);
  157. },10);
  158. },
  159. loading: function(str){
  160. /* loading 加载对话框 */
  161. if(this.type) this.hideAll();
  162. let t = this;
  163. setTimeout(function(){
  164. t.type = 'loading';
  165. t.msg = str || 'loading';
  166. setTimeout(function(){
  167. t.setPosition();
  168. },10);
  169. },10);
  170. },
  171. prompt: function(){
  172. /* prompt 输入对话框 */
  173. if(this.type) this.hideAll();
  174. let t = this;
  175. let args = arguments;
  176. setTimeout(function(){
  177. t.type = 'prompt';
  178. if(args[0]){
  179. t.msg = args[0];
  180. }
  181. else{
  182. t.msg = '请输入标题';
  183. }
  184. if(args[1]){
  185. t.prompt_value = args[1];
  186. }
  187. if(args[2]){
  188. t.yes = args[2];
  189. }
  190. if(args[3]){
  191. t.no = args[3];
  192. }
  193. setTimeout(function(){
  194. t.setPosition();
  195. document.getElementById('j_diy_dialog_window_input').focus();
  196. },10);
  197. },10);
  198. }
  199. },
  200. mounted() {
  201. let t = this;
  202. window.onresize = function(){
  203. if(document.getElementById('j_diy_dialog_window')){
  204. t.setPosition();
  205. }
  206. /* 当窗口大小改变 改变对话框的位置 */
  207. }
  208. }
  209. }
  210. </script>

1.3 css部分

  1. <style scoped>
  2. .hide{display:none;}
  3. .j_d_modal{position: fixed;top: 0;left: 0;width: 100%;height: 100%;z-index: 100000;background-color: #000;opacity: 0.5;font-size:14px;}
  4. .j_diy_dialog_window{position: fixed;top: 30%;left: 0;max-width: 500px;min-width: 250px;min-height: 50px;background-color: #fff;z-index: 110000;border-radius: 3px;box-shadow:3px 3px 5px #666;color:#666;text-align:center; }
  5. .j_head_div{padding:5px;border-bottom:1px solid #dddddd;font-size:12px;}
  6. .j_body_div{padding:10px 10px 30px 10px;;text-align:center;}
  7. .j_sp_title{float:left;margin-right:20px;}
  8. .j_sp_close{float:right;cursor:pointer;}
  9. .j_sp_close:hover{color:#3896fe;}
  10. .j_btn_group{text-align:center;padding-bottom:10px;}
  11. .btn{cursor:pointer;width:60px;height:25px;border-radius:2px;outline:none;}
  12. .j_btn-ensure{color:#fff;background-color:#3896fe;border:1px solid #3896fe;margin-right:10px;}
  13. .j_btn-ensure:hover{background-color:#428bca;border:1px solid #428bca;}
  14. .j_btn-cancel{color:#666;background-color:#dddddd;border:1px solid #dddddd;}
  15. .j_btn-cancel:hover{background-color:#bbbbbb;border:1px solid #bbbbbb;}
  16. .j_msg_body_init{width:0;height:0;opacity:0;top:50%;left:50%;over-flow:hidden; transition: width 1s;position:fixed;}
  17. .j_msg_body{padding:15px 40px;background-color:#000;color:#fff;opacity:0.6;border-radius:5px;cursor:pointer;max-width:300px;position:fixed;z-index: 110000;text-align:center;}
  18. .j_alert_img_div{width:60px;float:left;height:100%;}
  19. .j_alert_img{content:'!';position:relative;width:32px;height:32px;background-color:#D80000;display:inline-block;z-index:120000;color:white;line-height:32px;font-size:20px;font-weight:600;border-radius:50%;text-align:center;margin-top:10px;}
  20. .j_alert_msg_div{width:70%;float:left;height:100%;text-align:left;padding-top:14px;}
  21. .j_alert_msg{margin-top:10px;}
  22. .j_loading_body{padding:20px;background-color:#333;opacity:0.7;position:fixed;z-index:110000;color:#fff;border-radius:15px;min-width:80px;text-align:center;}
  23. .loading{width:100%;height:32px;display:block;background:url('./img/loading.gif') no-repeat center;margin-left:10xp;text-align:center;margin-bottom:10px;}
  24. .j_loading_msg{white-space:wrapped;}
  25. .j_d_modal_white{background-color:transparent!important;}
  26. .input{outline:none;border:1px solid #dddddd;height:30px;padding:0 10px;width:60%;border-radius:5px;}
  27. .j_input_focus,.input:hover{border:1px solid #3896f3!important;}
  28. .j_input_title{display:inline-block;height:32px;line-height:32px;margin-right:10px;}
  29. .j_input_title:after{content:':';position:relative;}
  30. </style>

2 组件注册及引用

  1. import Vue from 'vue';
  2. import vDialog from './dialog.vue';
  3. const dialog = {
  4. install : function(){
  5. Vue.component('my-dialog',vDialog);
  6. }
  7. };
  8. export default dialog;
  1. import vDialog from '../components/VDialog/dialog.js'
  2. Vue.use(vDialog);

3 组件配置

弹框组件不同于一般组件,在需要用到的时候才插入。由于弹框插件在web开发的各个阶段均能用到,如果每用到一次就插入一次显得太麻烦和臃肿,因此弹窗插件最好放在整个页面架构处,这样只要页面加载出来,就可以在页面任何地方和时机调用

  1. <my-dialog ref="Layer"></my-dialog>
tips:上面是页面引用,下面是script部分,将弹窗对象挂载到Vue原型上,这样就可以通过this.Layer调用弹窗
  1. Vue.prototype.Layer = this.$refs.Layer;
具体调用

let layer = this.Layer;

窗口类型 调用 参数说明
确认对话框 layer.confirm(arg1,arg2,arg3) arg1:确认文本信息
arg2:点击确认按钮执行的回调函数
arg3:点击取消按钮执行的回调函数
警告对话框 layer.alert(arg1,arg2) arg1:警告文本
arg2:点击确认按钮执行的回调函数
输入对话框 layer.prompt(arg1,arg2,arg3,arg4) arg1:文本信息
arg2:输入框值
arg3:点击确认按钮执行的回调函数
arg4:点击取消按钮执行的回调函数
信息对话框 layer.tips(arg1,arg2) arg1:文本信息
arg2:对话框停留时间
加载对话框 layer.loading(arg1) arg1:加载时显示的文本信息
关闭对话框 layer.hide()
关闭所有对话框 layer.hideAll()
打开指定对话框 layer.open(arg1) arg1 = {
type:"",//打开窗口类型(prompt除外)
msg:"",//文本信息
title:"",//对话框标题
yes(),//confirm对应的确定按钮回调函数
no(),//confirm对应的取消按钮回调函数
callback(),//alert对应的确定按钮回调函数
timing//msg对话框对应的存在时间,单位:秒
}

4 效果图

confirm

alert

prompt

tips

loading

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注