vue 自定义提示框(Toast)组件的实现代码


Posted in Javascript onAugust 17, 2018

1.自定义 提示框 组件

src / components / Toast / index.js

/**
 * 自定义 提示框( Toast )组件
 */
var Toast = {};
var showToast = false, // 存储toast显示状态
 showLoad = false, // 存储loading显示状态
 toastVM = null, // 存储toast vm
 loadNode = null; // 存储loading节点元素
 
Toast.install = function (Vue, options) {
 // 参数
 var opt = {
  defaultType: 'bottom',
  duration: '2500',
  wordWrap: false
 };
 for (var property in options) {
  opt[property] = options[property];
 }
 
 Vue.prototype.$toast = function (tips, type) {
 
  var curType = type ? type : opt.defaultType;
  var wordWrap = opt.wordWrap ? 'lx-word-wrap' : '';
  var style = opt.width ? 'style="width: ' + opt.width + '"' : '';
  var tmp = '<div v-show="show" :class="type" class="lx-toast ' + wordWrap + '" ' + style + '>{{tip}}</div>';
 
  if (showToast) {
   // 如果toast还在,则不再执行
   return;
  }
  if (!toastVM) {
   var toastTpl = Vue.extend({
    data: function () {
     return {
      show: showToast,
      tip: tips,
      type: 'lx-toast-' + curType
     }
    },
    template: tmp
   });
   toastVM = new toastTpl()
   var tpl = toastVM.$mount().$el;
   document.body.appendChild(tpl);
  }
  toastVM.type = 'lx-toast-' + curType;
  toastVM.tip = tips;
  toastVM.show = showToast = true;
 
  setTimeout(function () {
   toastVM.show = showToast = false;
  }, opt.duration)
 };
 
 ['bottom', 'center', 'top'].forEach(function (type) {
  Vue.prototype.$toast[type] = function (tips) {
   return Vue.prototype.$toast(tips, type)
  }
 });
 
 Vue.prototype.$loading = function (tips, type) {
  if (type == 'close') {
   loadNode.show = showLoad = false;
  } else {
   if (showLoad) {
    // 如果loading还在,则不再执行
    return;
   }
   var loadTpl = Vue.extend({
    data: function () {
     return {
      show: showLoad
     }
    },
    template: '<div v-show="show" class="lx-load-mark"><div class="lx-load-box"><div class="lx-loading"><div class="loading_leaf loading_leaf_0"></div><div class="loading_leaf loading_leaf_1"></div><div class="loading_leaf loading_leaf_2"></div><div class="loading_leaf loading_leaf_3"></div><div class="loading_leaf loading_leaf_4"></div><div class="loading_leaf loading_leaf_5"></div><div class="loading_leaf loading_leaf_6"></div><div class="loading_leaf loading_leaf_7"></div><div class="loading_leaf loading_leaf_8"></div><div class="loading_leaf loading_leaf_9"></div><div class="loading_leaf loading_leaf_10"></div><div class="loading_leaf loading_leaf_11"></div></div><div class="lx-load-content">' + tips + '</div></div></div>'
   });
   loadNode = new loadTpl();
   var tpl = loadNode.$mount().$el;
 
   document.body.appendChild(tpl);
   loadNode.show = showLoad = true;
  }
 };
 
 ['open', 'close'].forEach(function (type) {
  Vue.prototype.$loading[type] = function (tips) {
   return Vue.prototype.$loading(tips, type)
  }
 });
}
 
// 向外暴露接口
module.exports = Toast;

src / components / Toast / toast.css

/**
 * Toast 样式
 */
.lx-toast {
 position: fixed;
 bottom: 100px;
 left: 50%;
 box-sizing: border-box;
 max-width: 80%;
 height: 40px;
 line-height: 20px;
 padding: 10px 20px;
 transform: translateX(-50%);
 -webkit-transform: translateX(-50%);
 text-align: center;
 z-index: 9999;
 font-size: 14px;
 color: #fff;
 border-radius: 5px;
 background: rgba(0, 0, 0, 0.7);
 animation: show-toast .5s;
 -webkit-animation: show-toast .5s;
 overflow: hidden;
 text-overflow: ellipsis;
 white-space: nowrap;
}
 
.lx-toast.lx-word-wrap {
 width: 80%;
 white-space: inherit;
 height: auto;
}
 
.lx-toast.lx-toast-top {
 top: 50px;
 bottom: inherit;
}
 
.lx-toast.lx-toast-center {
 top: 50%;
 margin-top: -20px;
 bottom: inherit;
}
 
@keyframes show-toast {
 from {
  opacity: 0;
  transform: translate(-50%, -10px);
  -webkit-transform: translate(-50%, -10px);
 }
 to {
  opacity: 1;
  transform: translate(-50%, 0);
  -webkit-transform: translate(-50%, 0);
 }
}
 
.lx-load-mark {
 position: fixed;
 left: 0;
 top: 0;
 width: 100%;
 height: 100%;
 z-index: 9999;
}
 
.lx-load-box {
 position: fixed;
 z-index: 3;
 width: 7.6em;
 min-height: 7.6em;
 top: 180px;
 left: 50%;
 margin-left: -3.8em;
 background: rgba(0, 0, 0, 0.7);
 text-align: center;
 border-radius: 5px;
 color: #FFFFFF;
}
 
.lx-load-content {
 margin-top: 64%;
 font-size: 14px;
}
 
.lx-loading {
 position: absolute;
 width: 0px;
 left: 50%;
 top: 38%;
}
 
.loading_leaf {
 position: absolute;
 top: -1px;
 opacity: 0.25;
}
 
.loading_leaf:before {
 content: " ";
 position: absolute;
 width: 9.14px;
 height: 3.08px;
 background: #d1d1d5;
 box-shadow: rgba(0, 0, 0, 0.0980392) 0px 0px 1px;
 border-radius: 1px;
 -webkit-transform-origin: left 50% 0px;
 transform-origin: left 50% 0px;
}
 
.loading_leaf_0 {
 -webkit-animation: opacity-0 1.25s linear infinite;
 animation: opacity-0 1.25s linear infinite;
}
 
.loading_leaf_0:before {
 -webkit-transform: rotate(0deg) translate(7.92px, 0px);
 transform: rotate(0deg) translate(7.92px, 0px);
}
 
.loading_leaf_1 {
 -webkit-animation: opacity-1 1.25s linear infinite;
 animation: opacity-1 1.25s linear infinite;
}
 
.loading_leaf_1:before {
 -webkit-transform: rotate(30deg) translate(7.92px, 0px);
 transform: rotate(30deg) translate(7.92px, 0px);
}
 
.loading_leaf_2 {
 -webkit-animation: opacity-2 1.25s linear infinite;
 animation: opacity-2 1.25s linear infinite;
}
 
.loading_leaf_2:before {
 -webkit-transform: rotate(60deg) translate(7.92px, 0px);
 transform: rotate(60deg) translate(7.92px, 0px);
}
 
.loading_leaf_3 {
 -webkit-animation: opacity-3 1.25s linear infinite;
 animation: opacity-3 1.25s linear infinite;
}
 
.loading_leaf_3:before {
 -webkit-transform: rotate(90deg) translate(7.92px, 0px);
 transform: rotate(90deg) translate(7.92px, 0px);
}
 
.loading_leaf_4 {
 -webkit-animation: opacity-4 1.25s linear infinite;
 animation: opacity-4 1.25s linear infinite;
}
 
.loading_leaf_4:before {
 -webkit-transform: rotate(120deg) translate(7.92px, 0px);
 transform: rotate(120deg) translate(7.92px, 0px);
}
 
.loading_leaf_5 {
 -webkit-animation: opacity-5 1.25s linear infinite;
 animation: opacity-5 1.25s linear infinite;
}
 
.loading_leaf_5:before {
 -webkit-transform: rotate(150deg) translate(7.92px, 0px);
 transform: rotate(150deg) translate(7.92px, 0px);
}
 
.loading_leaf_6 {
 -webkit-animation: opacity-6 1.25s linear infinite;
 animation: opacity-6 1.25s linear infinite;
}
 
.loading_leaf_6:before {
 -webkit-transform: rotate(180deg) translate(7.92px, 0px);
 transform: rotate(180deg) translate(7.92px, 0px);
}
 
.loading_leaf_7 {
 -webkit-animation: opacity-7 1.25s linear infinite;
 animation: opacity-7 1.25s linear infinite;
}
 
.loading_leaf_7:before {
 -webkit-transform: rotate(210deg) translate(7.92px, 0px);
 transform: rotate(210deg) translate(7.92px, 0px);
}
 
.loading_leaf_8 {
 -webkit-animation: opacity-8 1.25s linear infinite;
 animation: opacity-8 1.25s linear infinite;
}
 
.loading_leaf_8:before {
 -webkit-transform: rotate(240deg) translate(7.92px, 0px);
 transform: rotate(240deg) translate(7.92px, 0px);
}
 
.loading_leaf_9 {
 -webkit-animation: opacity-9 1.25s linear infinite;
 animation: opacity-9 1.25s linear infinite;
}
 
.loading_leaf_9:before {
 -webkit-transform: rotate(270deg) translate(7.92px, 0px);
 transform: rotate(270deg) translate(7.92px, 0px);
}
 
.loading_leaf_10 {
 -webkit-animation: opacity-10 1.25s linear infinite;
 animation: opacity-10 1.25s linear infinite;
}
 
.loading_leaf_10:before {
 -webkit-transform: rotate(300deg) translate(7.92px, 0px);
 transform: rotate(300deg) translate(7.92px, 0px);
}
 
.loading_leaf_11 {
 -webkit-animation: opacity-11 1.25s linear infinite;
 animation: opacity-11 1.25s linear infinite;
}
 
.loading_leaf_11:before {
 -webkit-transform: rotate(330deg) translate(7.92px, 0px);
 transform: rotate(330deg) translate(7.92px, 0px);
}
 
@-webkit-keyframes opacity-0 {
 0% {
  opacity: 0.25;
 }
 0.01% {
  opacity: 0.25;
 }
 0.02% {
  opacity: 1;
 }
 60.01% {
  opacity: 0.25;
 }
 100% {
  opacity: 0.25;
 }
}
 
@-webkit-keyframes opacity-1 {
 0% {
  opacity: 0.25;
 }
 8.34333% {
  opacity: 0.25;
 }
 8.35333% {
  opacity: 1;
 }
 68.3433% {
  opacity: 0.25;
 }
 100% {
  opacity: 0.25;
 }
}
 
@-webkit-keyframes opacity-2 {
 0% {
  opacity: 0.25;
 }
 16.6767% {
  opacity: 0.25;
 }
 16.6867% {
  opacity: 1;
 }
 76.6767% {
  opacity: 0.25;
 }
 100% {
  opacity: 0.25;
 }
}
 
@-webkit-keyframes opacity-3 {
 0% {
  opacity: 0.25;
 }
 25.01% {
  opacity: 0.25;
 }
 25.02% {
  opacity: 1;
 }
 85.01% {
  opacity: 0.25;
 }
 100% {
  opacity: 0.25;
 }
}
 
@-webkit-keyframes opacity-4 {
 0% {
  opacity: 0.25;
 }
 33.3433% {
  opacity: 0.25;
 }
 33.3533% {
  opacity: 1;
 }
 93.3433% {
  opacity: 0.25;
 }
 100% {
  opacity: 0.25;
 }
}
 
@-webkit-keyframes opacity-5 {
 0% {
  opacity: 0.270958333333333;
 }
 41.6767% {
  opacity: 0.25;
 }
 41.6867% {
  opacity: 1;
 }
 1.67667% {
  opacity: 0.25;
 }
 100% {
  opacity: 0.270958333333333;
 }
}
 
@-webkit-keyframes opacity-6 {
 0% {
  opacity: 0.375125;
 }
 50.01% {
  opacity: 0.25;
 }
 50.02% {
  opacity: 1;
 }
 10.01% {
  opacity: 0.25;
 }
 100% {
  opacity: 0.375125;
 }
}
 
@-webkit-keyframes opacity-7 {
 0% {
  opacity: 0.479291666666667;
 }
 58.3433% {
  opacity: 0.25;
 }
 58.3533% {
  opacity: 1;
 }
 18.3433% {
  opacity: 0.25;
 }
 100% {
  opacity: 0.479291666666667;
 }
}
 
@-webkit-keyframes opacity-8 {
 0% {
  opacity: 0.583458333333333;
 }
 66.6767% {
  opacity: 0.25;
 }
 66.6867% {
  opacity: 1;
 }
 26.6767% {
  opacity: 0.25;
 }
 100% {
  opacity: 0.583458333333333;
 }
}
 
@-webkit-keyframes opacity-9 {
 0% {
  opacity: 0.687625;
 }
 75.01% {
  opacity: 0.25;
 }
 75.02% {
  opacity: 1;
 }
 35.01% {
  opacity: 0.25;
 }
 100% {
  opacity: 0.687625;
 }
}
 
@-webkit-keyframes opacity-10 {
 0% {
  opacity: 0.791791666666667;
 }
 83.3433% {
  opacity: 0.25;
 }
 83.3533% {
  opacity: 1;
 }
 43.3433% {
  opacity: 0.25;
 }
 100% {
  opacity: 0.791791666666667;
 }
}
 
@-webkit-keyframes opacity-11 {
 0% {
  opacity: 0.895958333333333;
 }
 91.6767% {
  opacity: 0.25;
 }
 91.6867% {
  opacity: 1;
 }
 51.6767% {
  opacity: 0.25;
 }
 100% {
  opacity: 0.895958333333333;
 }
}

2.全局引入

main.js

// 全局引入Toast
import './components/Toast/toast.css';
import Toast from './components/Toast/index';
Vue.use(Toast);

3.页面调用

Toast.vue

<!-- 提示框 -->

<template>

 <div>

  <!-- 标题栏 -->

  <mt-header title= "提示框" >

  <router-link to= "/" slot= "left" >

   <mt-button icon= "back" >返回</mt-button>

  </router-link>

  </mt-header>

  <!-- 内容 -->

  <button @click= "openTop()" >top</button>

  <button @click= "openCenter()" >center</button>

  <button @click= "openBottom()" >bottom</button>

  <button @click= "openLoading()" >loading</button>

 </div>

</template>

<script>

 export default {

  name: 'Toast' ,

  data(){

  return {

   //

  }

  },

  methods:{

  openTop(){

   this .$toast.top( 'top' );

  },

  openCenter(){

   this .$toast.center( 'center' );

  },

  openBottom(){

   this .$toast( 'bottom' );  // or this.$toast.bottom('bottom');

  },

  openLoading(){

   this .$loading( 'loading...' );

   let self = this ;

   setTimeout( function () {

   self.closeLoading()

   }, 2000)

  },

  closeLoading(){

   this .$loading.close();

  }

  }

 }

</script>

<style lang= "less" scoped>
 //
</style>

4.效果图

vue 自定义提示框(Toast)组件的实现代码

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

Javascript 相关文章推荐
Javascript中的Split使用方法与技巧
Mar 09 Javascript
从零开始学习jQuery (八) 插播:jQuery实施方案
Feb 23 Javascript
JavaScript ECMA-262-3 深入解析.第三章.this
Sep 28 Javascript
jQuery.extend 函数详解
Feb 03 Javascript
Javascript图像处理—平滑处理实现原理
Dec 28 Javascript
JavaScript日期时间格式化函数分享
May 05 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
Jun 19 Javascript
JavaScript动态加载重复绑定问题
Apr 01 Javascript
Vue中的作用域CSS和CSS模块的区别
Oct 09 Javascript
jQuery实现鼠标移入显示蒙版效果
Jan 11 jQuery
从零使用TypeScript开发项目打包发布到npm
Feb 14 Javascript
JavaScript流程控制(分支)
Dec 06 Javascript
微信小程序实现即时通信聊天功能的实例代码
Aug 17 #Javascript
在iFrame子页面里实现模态框的方法
Aug 17 #Javascript
layer弹出层 iframe层去掉滚动条的实例代码
Aug 17 #Javascript
解决layer弹层遮罩挡住窗体的问题
Aug 17 #Javascript
layer.close()关闭进度条和Iframe窗的方法
Aug 17 #Javascript
Vue组件创建和传值的方法
Aug 17 #Javascript
webpack多入口多出口的实现方法
Aug 17 #Javascript
You might like
用PHP实现文件上传二法
2006/10/09 PHP
PHP中for循环语句的几种变型
2006/11/26 PHP
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
PHP实现通过二维数组键值获取一维键名操作示例
2019/10/11 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
javascript读取xml
2006/11/04 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
jquery表单提交带错误信息提示效果
2017/03/09 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
当vue路由变化时,改变导航栏的样式方法
2018/08/22 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
Python多线程实现同步的四种方式
2017/05/02 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
获取Django项目的全部url方法详解
2017/10/26 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
python pexpect ssh 远程登录服务器的方法
2019/02/14 Python
详解numpy的argmax的具体使用
2019/05/27 Python
python如何通过pyqt5实现进度条
2020/01/20 Python
parser.add_argument中的action使用
2020/04/20 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
HTML5中FileReader接口使用方法实例详解
2017/08/26 HTML / CSS
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
自荐信的五个重要部分
2013/10/29 职场文书
运动会开幕式邀请函
2014/01/22 职场文书
司仪主持词两篇
2014/03/22 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书
聚众斗殴罪辩护词
2015/05/21 职场文书
2016年重阳节慰问信
2015/12/01 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
MySQL索引失效的典型案例
2021/06/05 MySQL
java中如何截取字符串最后一位
2022/07/07 Java/Android
Python 第三方库 openpyxl 的安装过程
2022/12/24 Python