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设置FieldSet展开与收缩
May 15 Javascript
JS 无法通过W3C验证的处理方法
Mar 09 Javascript
JQuery动画和停止动画实例代码
Mar 01 Javascript
JQuery实现Ajax加载图片的方法
Dec 24 Javascript
动态创建按钮的JavaScript代码
Jan 29 Javascript
深入理解React中es6创建组件this的方法
Aug 29 Javascript
基于JavaScript实现百度搜索框效果
Jun 28 Javascript
使用Vue完成一个简单的todolist的方法
Dec 01 Javascript
node.js实现为PDF添加水印的示例代码
Dec 05 Javascript
可能被忽略的一些JavaScript数组方法细节
Feb 28 Javascript
微信小程序实现Swiper轮播图效果
Nov 22 Javascript
微信小程序实现打卡签到页面
Sep 21 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
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
注意!PHP 7中不要做的10件事
2016/09/18 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
2019/04/12 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
用JQUERY增删元素的代码
2012/02/14 Javascript
关于JavaScript与HTML的交互事件
2013/04/12 Javascript
jQuery登陆判断简单实现代码
2013/04/21 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
2014/01/26 Javascript
使用OpenLayers3 添加地图鼠标右键菜单
2015/12/29 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
JavaScript实现url参数转成json形式
2016/09/25 Javascript
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
浅谈Angular 观察者模式理解
2018/11/01 Javascript
vue权限管理系统的实现代码
2019/01/17 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
javascript防抖函数debounce详解
2019/06/11 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
Python 元组(Tuple)操作详解
2014/03/11 Python
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
Python3实现生成随机密码的方法
2014/08/23 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
Python 取numpy数组的某几行某几列方法
2019/10/24 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
用Python去除图像的黑色或白色背景实例
2019/12/12 Python
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
十佳标兵事迹材料
2014/08/18 职场文书
学校工会工作总结2015
2015/05/19 职场文书
深度好文:50条没人告诉你的人生经验,句句精辟
2019/08/22 职场文书