Vue波纹按钮组件制作


Posted in Javascript onApril 30, 2018

先说一下用法:

<zk-button class="btn btn-default">默认按钮</zk-button>
<zk-button class="btn btn-default btn-round">默认按钮</zk-button>
<zk-button class="btn btn-default btn-round" :speed="4" :opacity="0.6">定义速度和初始的波浪透明度</zk-button>

原理:

这里用的是canvas + requestAnimationFrame(兼容性可以网上找一下解决方法) 绘制的波纹,有些用的是css transform + setTimeout做的,我感觉不太好。

模板(template):

<template>
 <button class="zk-btn">
  <canvas class="zk-ripple" @click="ripple"></canvas>
  <slot></slot>
 </button>
</template>

点击代码如下(我已经加入详细的注释)

ripple(event) {
 // 清除上次没有执行的动画
 if (this.timer) {
  window.cancelAnimationFrame(this.timer);
 }
 this.el = event.target;
 // 执行初始化
 if (!this.initialized) {
  this.initialized = true;
  this.init(this.el);
 }
 this.radius = 0;
 // 点击坐标原点
 this.origin.x = event.offsetX;
 this.origin.y = event.offsetY;
 this.context.clearRect(0, 0, this.el.width, this.el.height);
 this.el.style.opacity = this.opacity;
 this.draw();
},

这里主要初始化canvas和获取用户点击的位置坐标,并开始绘制。

循环绘制

draw() {
 this.context.beginPath();
 // 绘制波纹
 this.context.arc(this.origin.x, this.origin.y, this.radius, 0, 2 * Math.PI, false);
 this.context.fillStyle = this.color;
 this.context.fill();
 // 定义下次的绘制半径和透明度
 this.radius += this.speed;
 this.el.style.opacity -= this.speedOpacity;
 // 通过判断半径小于元素宽度或者还有透明度,不断绘制圆形
 if (this.radius < this.el.width || this.el.style.opacity > 0) {
  this.timer = window.requestAnimationFrame(this.draw);
 } else {
  // 清除画布
  this.context.clearRect(0, 0, this.el.width, this.el.height);
  this.el.style.opacity = 0;
 }
}

总结:

上面代码我没有复制完整,大家想看源码可以下载看一下

这是4月最后一天上班了,5.1要好好休息一下。

Javascript 相关文章推荐
Javascript下的keyCode键码值表
Apr 10 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
Dec 12 Javascript
javascript的tab切换原理与效果实现方法
Jan 10 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
Sep 01 Javascript
Angularjs结合Bootstrap制作的一个TODO List
Aug 18 Javascript
Vue.js快速入门实例教程
Oct 15 Javascript
React入门教程之Hello World以及环境搭建详解
Jul 11 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
Oct 26 Javascript
ionic grid(栅格)九宫格制作详解
Jun 30 Javascript
echarts设置图例颜色和地图底色的方法实例
Aug 01 Javascript
JS中队列和双端队列实现及应用详解
Sep 29 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
Jan 07 Vue.js
学习JS中的DOM节点以及操作
Apr 30 #Javascript
WebSocket的通信过程与实现方法详解
Apr 29 #Javascript
jQuery实现遍历XML节点和属性的方法示例
Apr 29 #jQuery
在vscode里使用.vue代码模板的方法
Apr 28 #Javascript
JS实现的透明度渐变动画效果示例
Apr 28 #Javascript
JS实现的简单折叠展开动画效果示例
Apr 28 #Javascript
vue2.0+ 从插件开发到npm发布的示例代码
Apr 28 #Javascript
You might like
php 批量添加多行文本框textarea一行一个
2014/06/03 PHP
PHP简单判断手机设备的方法
2016/08/23 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
动态调用CSS文件的JS代码
2010/07/29 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
基于JS脚本语言的基础语法详解
2017/07/22 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
[45:06]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第二场 11.28
2020/12/02 DOTA
理解Python中的绝对路径和相对路径
2017/08/30 Python
python正则中最短匹配实现代码
2018/01/16 Python
python 给DataFrame增加index行名和columns列名的实现方法
2018/06/08 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
python实现移位加密和解密
2019/03/22 Python
使用Pandas的Series方法绘制图像教程
2019/12/04 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
2019/12/09 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
初探CSS3中的calc()功能
2015/07/14 HTML / CSS
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
高中毕业生自我鉴定
2013/11/03 职场文书
护理实习自我鉴定
2013/12/14 职场文书
财务会计大学生自我评价
2014/04/09 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android