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 HashTable
Jan 22 Javascript
ExtJS GTGrid 简单用户管理
Jul 01 Javascript
javascript中String类的subString()方法和slice()方法
May 24 Javascript
用js获取电脑信息(是使用与IE浏览器)
Jan 15 Javascript
AngularJS表单编辑提交功能实例
Feb 13 Javascript
轻松实现js图片预览功能
Jan 18 Javascript
jQuery事件处理的特征(事件命名机制)
Aug 23 Javascript
javascript加载xml 并解析各节点的值(实现方法)
Oct 12 Javascript
pageGroup.js实现分页功能
Jul 27 Javascript
微信小程序实现pdf、word等格式文件上传的方法
Sep 10 Javascript
Jquery Datatables的使用详解
Jan 30 jQuery
Vue——前端生成二维码的示例
Dec 19 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完全过滤HTML,JS,CSS等标签
2009/01/16 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
浅析AngularJS中的生命周期和延迟处理
2015/06/18 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
2017/02/28 Javascript
Vue2.0组件间数据传递示例
2017/03/07 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
Nodejs实现多房间简易聊天室功能
2017/06/20 NodeJs
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
微信小程序实现多个按钮的颜色状态转换
2019/02/15 Javascript
jQuery+ajax实现批量删除功能完整示例
2019/06/06 jQuery
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
python如何实现内容写在图片上
2018/03/23 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
2018/06/01 Python
详解python中的模块及包导入
2019/08/30 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
Python 动态变量名定义与调用方法
2020/02/09 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
期末总结的个人自我评价
2013/11/02 职场文书
毕业生找工作的求职信范文
2013/12/24 职场文书
诉前财产保全担保书
2014/05/20 职场文书
会计毕业生自荐书
2014/06/12 职场文书
委托书的样本
2015/01/28 职场文书
民政工作个人总结
2015/02/28 职场文书
会议主持词开场白
2015/05/28 职场文书
Python3中最常用的5种线程锁实例总结
2021/07/07 Python