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 tips提示效果
Apr 03 Javascript
js冒泡法和数组转换成字符串示例代码
Aug 14 Javascript
Node.js中对通用模块的封装方法
Jun 06 Javascript
jquery实现公告翻滚效果
Feb 27 Javascript
AngularJS入门教程之更多模板详解
Aug 19 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
Sep 14 Javascript
jQuery动态创建元素以及追加节点的实现方法
Oct 20 Javascript
基于angular2 的 http服务封装的实例代码
Jun 29 Javascript
自定义PC微信扫码登录样式写法
Dec 12 Javascript
Javascript 编码约定(编码规范)
Mar 11 Javascript
深入解读VUE中的异步渲染的实现
Jun 19 Javascript
VsCode里的Vue模板的实现
Aug 12 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 sprintf()函数用例解析
2011/05/18 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
Yii框架实现记录日志到自定义文件的方法
2017/05/23 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
2021/03/09 PHP
c#+jquery实现获取radio和checkbox的值
2020/09/12 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
AngularJS指令与指令之间的交互功能示例
2016/12/14 Javascript
JSON字符串和JSON对象相互转化实例详解
2017/01/05 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
input 标签实现输入框带提示文字效果(两种方法)
2017/10/09 Javascript
JavaScript EventEmitter 背后的秘密 完整版
2018/03/29 Javascript
Vue中使用Sortable的示例代码
2018/04/07 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
JavaScript复制变量三种方法实例详解
2020/01/09 Javascript
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
跟老齐学Python之使用Python操作数据库(1)
2014/11/25 Python
介绍Python的Urllib库的一些高级用法
2015/04/30 Python
全面解析Python的While循环语句的使用方法
2015/10/13 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
Python 带有参数的装饰器实例代码详解
2018/12/06 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
python numpy实现rolling滚动案例
2020/06/08 Python
python GUI模拟实现计算器
2020/06/22 Python
详解CSS3选择器的使用方法汇总
2015/11/24 HTML / CSS
函授毕业生自我鉴定
2013/11/06 职场文书
宾馆总经理岗位职责
2014/02/14 职场文书
多媒体专业自我鉴定
2014/02/28 职场文书
医院护士见习期自我鉴定
2014/04/10 职场文书
解除劳动合同协议书范本2014
2014/09/25 职场文书
大学迎新生标语
2014/10/06 职场文书
党支部群众路线整改措施思想汇报
2014/10/10 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
MySQL新手入门进阶语句汇总
2022/09/23 MySQL