canvas实现点击带水纹的按钮
咱今天在闲逛网页时,看到一个点击带水纹的按钮特效,尼玛,写的还挺好,先看效果:
于是就奔着升级版的拿来主义,别人的好东西,咱都要拿来滴,so,扒代码!
完整代码在最后,是经过我的改进优化滴.
在这里先分析一下功能,就两个核心点.
1.获取当前鼠标点击位置,注意这里要用 offsetX/Y,不能用screenX/Y或者clientX/Y,他们三个的区别可以上网搜一下,这里就不说了.
2.以获取到的点击位置为中心点,利用html的canvas画布画半透明的圆,这里为了体现水纹的动态扩展效果,要设置一个定时器或者使用浏览器自带的
requestAnimationFrame函数(时间间隔根据不同浏览器而定,通常在60fps),在使圆的半径动态的扩展,并且不能超过按钮宽度.
即下面的代码:
- draw = function () {
- context.beginPath();
- context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);
- context.fillStyle = color;
- context.fill();
- radius += 2;
- if (radius < element.width) {
- requestAnimFrame(draw);
- }
- };
完整代码:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>HTML5实现点击水波扩散效果</title>
- <style>
- * {
- box-sizing: border-box;
- outline: none;
- }
- body {
- font-family: 'Open Sans';
- font-size: 100%;
- font-weight: 300;
- line-height: 1.5em;
- text-align: center;
- }
- h1 {
- color: #666666;
- font-size: 2rem;
- line-height: 1.5em;
- margin: 2em 0 2em 0;
- }
- .box {
- margin: 1rem;
- width: 18.75rem;
- }
- .box img {
- width: 100%;
- }
- .btn {
- border: none;
- color: white;
- overflow: hidden;
- margin: 1rem;
- padding: 0;
- text-transform: uppercase;
- width: 150px;
- height: 40px;
- }
- .btn.color-3 {
- background-color: #f6774f;
- }
- .btn-border.color-3 {
- background-color: transparent;
- border: 2px solid #f6774f;
- color: #f6774f;
- }
- .btn-round {
- border-radius: 10em;
- }
- .material-design {
- position: relative;
- }
- .material-design canvas {
- opacity: 0.25;
- position: absolute;
- top: 0;
- left: 0;
- }
- .container {
- align-content: center;
- align-items: flex-start;
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- justify-content: center;
- margin: 0 auto;
- max-width: 46rem;
- }
- </style>
- </head>
- <body>
- <h1>多设计按钮样式</h1>
- <section class="container">
- <button class="btn color-3 material-design" data-color="#f34711">Press me!</button>
- <button class="btn btn-round color-3 material-design" data-color="#ffffff">Senden</button>
- <button class="btn btn-border color-3 material-design" data-color="#f34711">Senden</button>
- <button class="btn btn-border btn-round color-3 material-design" data-color="#f6774f">Senden</button>
- </section>
- <script>
- var canvas = {},
- centerX = 0,
- centerY = 0,
- color = '',
- containers = document.getElementsByClassName('material-design');
- context = {},
- element = {},
- radius = 0,
- requestAnimFrame = function () {
- return (
- this.requestAnimationFrame ||
- this.mozRequestAnimationFrame ||
- this.oRequestAnimationFrame ||
- this.msRequestAnimationFrame ||
- function (callback) {
- this.setTimeout(callback, 1000 / 60);
- }
- );
- } (),
- init = function () {
- this.containers = Array.prototype.slice.call(this.containers);
- for (var i = 0; i < this.containers.length; i += 1) {
- this.canvas = document.createElement('canvas');
- this.canvas.addEventListener('click', press, false);
- this.containers[i].appendChild(this.canvas);
- this.canvas.style.width ='100%';
- this.canvas.style.height='100%';
- this.canvas.width = this.canvas.offsetWidth;
- this.canvas.height = this.canvas.offsetHeight;
- }
- },
- press = function (event) {
- color = event.toElement.parentElement.dataset.color;
- element = event.toElement;
- context = element.getContext('2d');
- radius = 0;
- centerX = event.offsetX;
- centerY = event.offsetY;
- context.clearRect(0, 0, element.width, element.height);
- draw();
- },
- draw = function () {
- context.beginPath();
- context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);
- context.fillStyle = color;
- context.fill();
- radius += 2;
- if (radius < element.width) {
- requestAnimFrame(draw);
- }
- };
- init();
- </script>
- </body>
- </html>
canvas实现点击带水纹的按钮的更多相关文章
- WPF自定义控件之带倒计时的按钮--Button
1.说明 之前做过一个小项目,点击按钮,按钮进入倒计时无效状态,计时完成后,恢复原样,现在就实现该效果---带倒计时的按钮 2.效果 1)正常状态 2)MouseOver( ...
- 【传】玩转Android---UI篇---ImageButton(带图标的按钮)
原文网址:http://hualang.iteye.com/blog/964049 除了Android系统自带的Button按钮一万,还提供了带图标的按钮ImageButton 要制作带图标的按钮,首 ...
- 去除IE10自带的清除按钮
最近在工作中碰到了一个问题,原本在IE8,IE9下正常的input表单,在IE10下会出现清除按钮,即表单右侧会出现一个可以清除该表单内容的小叉.由于之前一直没有兼容过IE10,所以我专门搜了下原因. ...
- 添加类似navigationController自带的返回按钮
添加类似navigationController自带的返回按钮,效果如下: 一.UINavigationcontroller自带的navigationBar 是无法添加左箭头的返回按钮的 在网上搜索了 ...
- [转]WPF自定义控件之带倒计时的按钮--Button
1.说明 之前做过一个小项目,点击按钮,按钮进入倒计时无效状态,计时完成后,恢复原样,现在就实现该效果---带倒计时的按钮 2.效果 1)正常状态 2)MouseOver( ...
- WPF开发随笔收录-带递增递减按钮TextBox
一.前言 今天分享一下如何实现带递增递减按钮的TextBox控件 二.正文 1.之前的博客分享了一篇自定义XamlIcon控件的文章,这次就直接在那个项目的基础上实现今天这个自定义控件 2.首先添加两 ...
- 基于jQuery点击加载动画按钮特效
分享一款基于jQuery点击加载动画按钮特效.这是一款基于jQuery+CSS3实现的鼠标点击按钮加载动画特效代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div ...
- selenium依次点击页面的删除按钮
需要依次点击页面的删除按钮,如下图: @Test public static void FaBu() { TestMenuJump.jumpExam(driver); TestMenuJump.jum ...
- 点击Cell中的按钮时,如何取所在的Cell
4.点击Cell中的按钮时,如何取所在的Cell:-(void)OnTouchBtnInCell:(UIButton *)Btu{CGPoint point = btn.center;point = ...
随机推荐
- C#:当前时间转换成文件名
DateTime.Now.ToFileTime().ToString(); 结果是一个字符串,类似:131238643554094913.
- 236. Lowest Common Ancestor of a Binary Tree(最低公共祖先,难理解)
Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...
- Wannafly交流赛1 _A_有理数 【水】
Wannafly交流赛1 A有理数 [水] 链接:https://www.nowcoder.com/acm/contest/69/A 来源:牛客网 题目描述 有一个问题如下: 给你一个有理数v,请找到 ...
- LightOJ - 1138 (二分+阶乘分解)
题意:求阶乘尾部有Q(1 ≤ Q ≤ 108)个0的最小N 分析:如果给出N,然后求N!尾部0的个数的话,直接对N除5分解即可(因为尾部0肯定是由5*2构成,那么而在阶乘种,2的因子个数要比5少,所以 ...
- reading list
Machine Learning1. Deep Learningimagenet classification with deep convolutional neural networks. 20 ...
- eclipse中自动加载源码的方法
1.选中项目右键properties--java build path--Libraries--Add External class Folder 找到项目将项目添加进去 2.然后就是这样 3.OK
- 【Java】仿真qq尝试:聊天界面 && 响应用户输入
需求分析: 逐步完善一个“qq仿真”程序. 参考: 1.文本框与文本区:http://www.weixueyuan.net/view/6062.html 2.java布局:http://www.cnb ...
- 拓扑排序(附LeetCode题目)
算法期中考到一题关于拓扑序的题目,觉得很值得一写. 1.什么是拓扑序? 对一个有向无环图进行拓扑排序,假如图中存在一条从顶点A到顶点B的路径,则拓扑序中顶点A出现在顶点B的前面.要注意的是,这是对有向 ...
- Java集合类初始容量、加载因子、扩容增量
当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因 ...
- python 利用PIL库进行更改图片大小的操作
python 是可以利用PIL库进行更改图片大小的操作的,当然一般情况下是不需要的,但是在一些特殊的利用场合,是需要改变图片的灰度或是大小等的操作的,其实用python更改图片的大小还是蛮简单的,只需 ...