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 相关文章推荐
jquery提示 &quot;object expected&quot;的解决方法
Dec 13 Javascript
JavaScript 原型链学习总结
Oct 29 Javascript
EasyUI在Panel上动态添加LinkButton按钮
Aug 11 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
Aug 17 Javascript
js 获取json数组里面数组的长度实例
Oct 31 Javascript
JS实现非首屏图片延迟加载的示例
Jan 06 Javascript
JavaScript继承的特性与实践应用深入详解
Dec 30 Javascript
jsonp跨域获取百度联想词的方法分析
May 13 Javascript
微信小程序跨页面传递data数据方法解析
Dec 13 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
Jun 04 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
Nov 19 Vue.js
vue项目如何打包之项目打包优化(让打包的js文件变小)
Apr 30 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的正则处理函数总结分析
2008/06/20 PHP
php中的比较运算符详解
2013/10/28 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
让你的网站可编辑的实现js代码
2009/10/19 Javascript
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
2013/10/15 Javascript
javascript中对Attr(dom中属性)的操作示例讲解
2013/12/02 Javascript
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
jQuery实现Email邮箱地址自动补全功能代码
2015/11/03 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
兼容浏览器的js事件绑定函数(详解)
2017/05/09 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
React key值的作用和使用详解
2018/08/23 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
给localStorage设置一个过期时间的方法分享
2018/11/06 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
2019/07/25 Javascript
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
初学Python函数的笔记整理
2015/04/07 Python
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
Python爬虫:url中带字典列表参数的编码转换方法
2019/08/21 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
美国著名首饰网站:BaubleBar
2016/08/29 全球购物
师范生自我鉴定范文
2013/10/05 职场文书
超市开学活动方案
2014/03/01 职场文书
酒后驾车标语
2014/06/30 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
python3实现常见的排序算法(示例代码)
2021/07/04 Python
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL