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 相关文章推荐
一个cssQuery对象 javascript脚本实现代码
Jul 21 Javascript
js中将字符串转换成json的三种方式
Jan 12 Javascript
js对象数组按属性快速排序
Jan 31 Javascript
javascript数据结构与算法之检索算法
Apr 04 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
May 29 Javascript
微信小程序 弹框和模态框实现代码
Mar 10 Javascript
AngularJS全局警告框实现方法示例
May 18 Javascript
详解vue+css3做交互特效的方法
Nov 20 Javascript
vue自定义指令用法经典实例小结
Mar 16 Javascript
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
Jun 10 Javascript
javascript实现前端成语点击验证
Jun 24 Javascript
原生js实现自定义消息提示框
Nov 19 Javascript
学习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
第二节 对象模型 [2]
2006/10/09 PHP
人大复印资料处理程序_查询篇
2006/10/09 PHP
深入了解PHP类Class的概念
2012/06/14 PHP
php mssql扩展SQL查询中文字段名解决方法
2012/10/15 PHP
php生成微信红包数组的方法
2019/09/05 PHP
简明json介绍
2008/09/28 Javascript
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
javascript的函数、创建对象、封装、属性和方法、继承
2011/03/10 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
2018/04/26 Javascript
解决vue 绑定对象内点击事件失效问题
2018/09/05 Javascript
js实现json数组分组合并操作示例
2019/02/12 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
[35:26]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第三局
2016/02/26 DOTA
Python itertools模块详解
2015/05/09 Python
python文件名和文件路径操作实例
2017/09/29 Python
python email smtplib模块发送邮件代码实例
2018/04/26 Python
Python父目录、子目录的相互调用方法
2019/02/16 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
印度尼西亚在线时尚购物网站:ZALORA印尼
2016/08/02 全球购物
Clarins娇韵诗英国官网:来自法国的天然护肤品牌
2017/04/18 全球购物
英国最大的自有市场,比亚马逊便宜:Flubit
2019/03/19 全球购物
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
投资协议书范本
2014/04/21 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python