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 相关文章推荐
网页常用特效代码整理
Jun 23 Javascript
用js实现随机返回数组的一个元素
Aug 13 Javascript
js 实现无缝滚动 兼容IE和FF
Jul 15 Javascript
JavaScript Event事件学习第一章 Event介绍
Feb 07 Javascript
php 中序列化和json使用介绍
Jul 08 Javascript
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
Aug 01 Javascript
利用Node.js+Koa框架实现前后端交互的方法
Feb 27 Javascript
微信小程序的分类页面制作
Jun 27 Javascript
Node.js dgram模块实现UDP通信示例代码
Sep 26 Javascript
Vue2.X 通过AJAX动态更新数据
Jul 17 Javascript
javscript 数组扁平化的实现
Feb 03 Javascript
Vue如何实现验证码输入交互
Dec 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 array_flip() 删除数组重复元素
2009/01/14 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
2016/05/27 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
JQuery为textarea添加maxlength属性的代码
2010/04/07 Javascript
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
详解JavaScript中getFullYear()方法的使用
2015/06/10 Javascript
JavaScript检测字符串中是否含有html标签实现方法
2015/07/01 Javascript
jQuery simpleModal插件的使用介绍
2016/08/30 Javascript
Angular.js中上传指令ng-upload的基本使用教程
2017/07/30 Javascript
Angular6新特性之Angular Material
2018/12/28 Javascript
JS中超越现实的匿名函数用法实例分析
2019/06/21 Javascript
JS中比Switch...Case更优雅的多条件判断写法
2019/09/05 Javascript
vue.js的状态管理vuex中store的使用详解
2019/11/08 Javascript
JavaScript实现左右滚动电影画布
2020/02/06 Javascript
创建nuxt.js项目流程图解
2020/03/13 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
Python基于生成器迭代实现的八皇后问题示例
2018/05/23 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
平面设计的岗位职责
2013/11/08 职场文书
信访工作者先进事迹
2014/01/17 职场文书
奉献家乡演讲稿
2014/09/16 职场文书
2014年业务工作总结
2014/11/17 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
人事任命通知
2015/04/20 职场文书
小学庆六一主持词
2015/06/30 职场文书
2015年度优秀员工获奖感言
2015/07/31 职场文书
使用Redis实现分布式锁的方法
2022/06/16 Redis
Python编写车票订购系统 Python实现快递收费系统
2022/08/14 Python