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 相关文章推荐
JS在textarea光标处插入文本的小例子
Mar 22 Javascript
JavaScript希尔排序、快速排序、归并排序算法
May 08 Javascript
星期几的不同脚本写法(推荐)
Jun 01 Javascript
利用JavaScript阻止表单提交的两种方法
Aug 11 Javascript
JavaScript交换两个变量值的七种解决方案
Dec 01 Javascript
vue父子组件的数据传递示例
Mar 07 Javascript
微信小程序实现移动端滑动分页效果(ajax)
Jun 13 Javascript
Vue的Class与Style绑定的方法
Sep 01 Javascript
微信小程序switch开关选择器使用详解
Jan 31 Javascript
JS实现将二维数组转为json格式字符串操作示例
Jul 12 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
Oct 10 jQuery
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
Jul 15 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
php检测文件编码的方法示例
2014/04/25 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
JavaScript prototype属性使用说明
2010/05/13 Javascript
jQuery 获取URL的GET参数值的小例子
2013/04/18 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
jquery解析XML字符串和XML文件的方法说明
2014/02/21 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
jQuery手动点击实现图片轮播特效
2020/04/20 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
jQuery 弹出层插件(推荐)
2016/05/24 Javascript
关于js原型的面试题讲解
2016/09/25 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
javascript 作用于作用域链的详解
2017/09/27 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
2019/03/06 jQuery
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
微信小程序tabBar设置实例解析
2019/11/14 Javascript
TypeScript魔法堂之枚举的超实用手册
2020/10/29 Javascript
[01:20]DOTA2更新全新英雄 天涯墨客现已加入游戏
2018/08/25 DOTA
python 删除大文件中的某一行(最有效率的方法)
2017/08/19 Python
Python 错误和异常代码详解
2018/01/29 Python
Python中str.join()简单用法示例
2018/03/20 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
Python三元运算与lambda表达式实例解析
2019/11/30 Python
Python3变量与基本数据类型用法实例分析
2020/02/14 Python
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
美国眼镜网站:EyeBuyDirect
2017/04/13 全球购物
印刷工程专业应届生求职信
2013/09/29 职场文书
外贸业务员求职信范文
2013/12/12 职场文书
会计职业生涯规划书
2014/01/13 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL