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脚本类
Aug 27 Javascript
js 覆盖和重载 函数
Sep 25 Javascript
jquery 页面滚动到底部自动加载插件集合
Jan 31 Javascript
js中不同的height, top的区别对比
Sep 24 Javascript
JS日期加减,日期运算代码
Nov 05 Javascript
jquery取消事件冒泡的三种方法(推荐)
May 28 Javascript
node.js学习之base64编码解码
Oct 21 Javascript
用v-html解决Vue.js渲染中html标签不被解析的问题
Dec 14 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
Aug 17 jQuery
vue实现城市列表选择功能
Jul 16 Javascript
Vue之mixin全局的用法详解
Aug 22 Javascript
Vue实现跑马灯样式文字横向滚动
Nov 23 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常用代码
2006/11/23 PHP
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
js判断一个字符串是否包含一个子串的方法
2015/01/26 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
使用JS正则表达式 替换括号,尖括号等
2016/11/29 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
深度解读vue-resize的具体用法
2020/07/08 Javascript
vue3.0搭配.net core实现文件上传组件
2020/10/29 Javascript
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python callable()函数用法实例分析
2018/03/17 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
美国亚马逊旗下时尚女装网店:SHOPBOP(支持中文)
2020/10/17 全球购物
大学生入党自我鉴定
2013/10/31 职场文书
企业管理标语
2014/06/10 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
安全伴我行演讲稿
2014/09/04 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
团拜会主持词
2015/07/04 职场文书
环保建议书作文400字
2015/09/14 职场文书
中学生打架检讨书之500字
2019/08/06 职场文书
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android