这种效果可以由元素内嵌套canves实现,也可以由css3实现。

Canves实现

网上摘了一份canves实现的代码,略微去掉了些重复定义的样式并且给出js注释,代码如下

第一种方法:

html骨架代码

  1. <a class="btn color-1 material-design" data-color="#2f5398">Press me!</a>

css代码

  1. * {
  2. box-sizing: border-box;
  3. outline: none;
  4. }
  5. body {
  6. font-family: 'Open Sans';
  7. font-size: 100%;
  8. font-weight: 300;
  9. line-height: 1.5em;
  10. text-align: center;
  11. }
  12. .btn {
  13. border: none;
  14. display: inline-block;
  15. color: white;
  16. overflow: hidden;
  17. margin: 1rem;
  18. padding: 0;
  19. width: 150px;
  20. height: 40px;
  21. text-align: center;
  22. line-height: 40px;
  23. border-radius: 5px;
  24. }
  25. .btn.color-1 {
  26. background-color: #426fc5;
  27. }
  28. .btn-border.color-1 {
  29. background-color: transparent;
  30. border: 2px solid #426fc5;
  31. color: #426fc5;
  32. }
  33. .material-design {
  34. position: relative;
  35. }
  36. .material-design canvas {
  37. opacity: 0.25;
  38. position: absolute;
  39. top: 0;
  40. left: 0;
  41. }
  42. .container {
  43. align-content: center;
  44. align-items: flex-start;
  45. display: flex;
  46. flex-direction: row;
  47. flex-wrap: wrap;
  48. justify-content: center;
  49. margin: 0 auto;
  50. max-width: 46rem;
  51. }

js代码

  1. var canvas = {},
  2. centerX = 0,
  3. centerY = 0,
  4. color = '',
  5. containers = document.getElementsByClassName('material-design')
  6. context = {},
  7. element = {},
  8. radius = 0,
  9. // 根据callback生成requestAnimationFrame动画
  10. requestAnimFrame = function () {
  11. return (
  12. window.requestAnimationFrame ||
  13. window.mozRequestAnimationFrame ||
  14. window.oRequestAnimationFrame ||
  15. window.msRequestAnimationFrame ||
  16. function (callback) {
  17. window.setTimeout(callback, 1000 / 60);
  18. }
  19. );
  20. } (),
  21. // 为每个指定元素生成canves
  22. init = function () {
  23. containers = Array.prototype.slice.call(containers);
  24. for (var i = 0; i < containers.length; i += 1) {
  25. canvas = document.createElement('canvas');
  26. canvas.addEventListener('click', press, false);
  27. containers[i].appendChild(canvas);
  28. canvas.style.width ='100%';
  29. canvas.style.height='100%';
  30. canvas.width = canvas.offsetWidth;
  31. canvas.height = canvas.offsetHeight;
  32. }
  33. },
  34. // 点击并且获取需要的数据,如点击坐标、元素大小、颜色
  35. press = function (event) {
  36. color = event.toElement.parentElement.dataset.color;
  37. element = event.toElement;
  38. context = element.getContext('2d');
  39. radius = 0;
  40. centerX = event.offsetX;
  41. centerY = event.offsetY;
  42. context.clearRect(0, 0, element.width, element.height);
  43. draw();
  44. },
  45. // 绘制圆形,并且执行动画
  46. draw = function () {
  47. context.beginPath();
  48. context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);
  49. context.fillStyle = color;
  50. context.fill();
  51. radius += 2;
  52. // 通过判断半径小于元素宽度,不断绘制 radius += 2 的圆形
  53. if (radius < element.width) {
  54. requestAnimFrame(draw);
  55. }
  56. };
  57.  
  58. init();

第二种方法:

html代码

  1. <a class="waves ts-btn">Press me!</a>

css

  1. .waves{
  2. position:relative;
  3. cursor:pointer;
  4. display:inline-block;
  5. overflow:hidden;
  6. text-align: center;
  7. -webkit-tap-highlight-color:transparent;
  8. z-index:1;
  9. }
  10. .waves .waves-animation{
  11. position:absolute;
  12. border-radius:50%;
  13. width:25px;
  14. height:25px;
  15. opacity:0;
  16. background:rgba(255,255,255,0.3);
  17. transition:all 0.7s ease-out;
  18. transition-property:transform, opacity, -webkit-transform;
  19. -webkit-transform:scale(0);
  20. transform:scale(0);
  21. pointer-events:none
  22. }
  23. .ts-btn{
  24. width: 200px;
  25. height: 56px;
  26. line-height: 56px;
  27. background: #f57035;
  28. color: #fff;
  29. border-radius: 5px;
  30. }

js

  1. document.addEventListener('DOMContentLoaded',function(){
  2.  
  3. var duration = 750;
  4.  
  5. // 样式string拼凑
  6. var forStyle = function(position){
  7. var cssStr = '';
  8. for( var key in position){
  9. if(position.hasOwnProperty(key)) cssStr += key+':'+position[key]+';';
  10. };
  11. return cssStr;
  12. }
  13.  
  14. // 获取鼠标点击位置
  15. var forRect = function(target){
  16. var position = {
  17. top:0,
  18. left:0
  19. }, ele = document.documentElement;
  20. 'undefined' != typeof target.getBoundingClientRect && (position = target.getBoundingClientRect());
  21. return {
  22. top: position.top + window.pageYOffset - ele.clientTop,
  23. left: position.left + window.pageXOffset - ele.clientLeft
  24. }
  25. }
  26.  
  27. var show = function(event){
  28. var pDiv = event.target,
  29. cDiv = document.createElement('div');
  30. pDiv.appendChild(cDiv);
  31. var rectObj = forRect(pDiv),
  32. _height = event.pageY - rectObj.top,
  33. _left = event.pageX - rectObj.left,
  34. _scale = 'scale(' + pDiv.clientWidth / 100 * 10 + ')';
  35. var position = {
  36. top: _height+'px',
  37. left: _left+'px'
  38. };
  39. cDiv.className = cDiv.className + " waves-animation",
  40. cDiv.setAttribute("style", forStyle(position)),
  41. position["-webkit-transform"] = _scale,
  42. position["-moz-transform"] = _scale,
  43. position["-ms-transform"] = _scale,
  44. position["-o-transform"] = _scale,
  45. position.transform = _scale,
  46. position.opacity = "1",
  47. position["-webkit-transition-duration"] = duration + "ms",
  48. position["-moz-transition-duration"] = duration + "ms",
  49. position["-o-transition-duration"] = duration + "ms",
  50. position["transition-duration"] = duration + "ms",
  51. position["-webkit-transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)",
  52. position["-moz-transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)",
  53. position["-o-transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)",
  54. position["transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)",
  55. cDiv.setAttribute("style", forStyle(position));
  56. var finishStyle = {
  57. opacity: 0,
  58. "-webkit-transition-duration": duration + "ms",
  59. "-moz-transition-duration": duration + "ms",
  60. "-o-transition-duration": duration + "ms",
  61. "transition-duration": duration + "ms",
  62. "-webkit-transform" : _scale,
  63. "-moz-transform" : _scale,
  64. "-ms-transform" : _scale,
  65. "-o-transform" : _scale,
  66. top: _height + "px",
  67. left: _left + "px",
  68. };
  69. setTimeout(function(){
  70. cDiv.setAttribute("style", forStyle(finishStyle));
  71. setTimeout(function(){
  72. pDiv.removeChild(cDiv);
  73. },duration);
  74. },100)
  75. }
  76. document.querySelector('.waves').addEventListener('click',function(e){
  77. show(e);
  78. },!1);
  79. },!1);

Web前端-按钮点击效果(水波纹)的更多相关文章

  1. Android5.0以上的项目都会有的按钮点击特效--水波纹

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...

  2. Android点击Button水波纹效果

    先上图,看看接下来我要向大家介绍的是个什么东西,例如以下图: 接下来要介绍的就是怎样实现上述图中的波纹效果.这样的效果假设大家没有体验过的话,能够看看百度手机卫士或者360手机卫士,里面的按钮点击效果 ...

  3. android 按钮点击效果实现

    在其他人的博客里看到其实实现按钮点击效果的方法有很多,这里提到的只是其中一个办法 图片素材(我自己用截图截的,可以自己搞) 放到mipmap目录下(studio是在这个目录下 , eclipse 直接 ...

  4. Android5.0新特性之——按钮点击效果动画(涟漪效果)

    Android5.0 Material Design设计的动画效果 RippleDrawable涟漪效果 涟漪效果是Android5.0以后的新特性.为了兼容性,建议新建drawable-v21文件夹 ...

  5. Android实现按钮点击效果(第一次点击变色,第二次恢复)

    1.首先创建一个按钮 <Button android:id="@+id/click" android:layout_width="fill_parent" ...

  6. Android下实现win8的按钮点击效果

    原理就是自定义一个imageButton,实现动画效果 demo源码下载地址:  请戳这里----------------> 关于回弹张力的效果扩展,可以参考Facebook的开源动画库rebo ...

  7. 按钮点击效果jquery

    <html><head> <meta charset="UTF-8"> <title>QQ</title> <me ...

  8. UITableView上添加按钮,按钮点击效果延迟的解决办法

    在自定义的TableView的初始化方法做如下操作 - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame: ...

  9. 移动web前端下拉刷新效果

    直接复制粘贴 放在页面中即可 <script> window.onload = function(){ window.addEventListener('touchstart', touc ...

随机推荐

  1. 面试题:你有没有搞混查询缓存和Buffer Pool

    一. 关注送书!<Netty实战> 文章公号号首发!连载中!关注微信公号回复:"抽奖" 可参加抽活动 首发地址:点击跳转阅读原文,有更好的阅读体验 使用推荐阅读,有更好 ...

  2. JavaScript兼容性总结一点点

    JavaScript 不同浏览器之间的差异还是很大,所以js库才这么有需求,需要解决各种兼容性问题. 其实反过来,既然存在js库能解决这些兼容性问题,说明底层大部分功能还是相通的. 首先想到的是事件模 ...

  3. 【JVM第五篇--运行时数据区】方法区

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.栈.堆.方法区的关系 虚拟机运行时的数据区如下所示: 即方法区是属于线程共享的内 ...

  4. 连续子数组的和的绝对值的最大值、最小值(非绝对值的话直接dp动态规划)

    前缀和的思路: sum[i] = num[0]+num[1]+......+num[i-1] sum[j] = num[0]+num[1]+......+num[j-1] 那么:num[i]+num[ ...

  5. osd磁盘空间足够无法写入数据的分析与解决

    前言 这个问题的来源是ceph社区里面一个群友的环境出现在85%左右的时候,启动osd报错,然后在本地文件系统当中进行touch文件的时候也是报错,df -i查询inode也是没用多少,使用的也是in ...

  6. 解决calamari无法获取节点信息的bug

    前言 一直在做calamari的相关的一些打包和安装的工作,都是业余弄的东西,所以并没有仔细的进行功能点的验证测试,正好ceph社区群里面有人问了个问题 calamari上是不是能看到ceph的ver ...

  7. 多线程实现socketserver练习

    1.server import socket from threading import Thread def my_socketserver(conn, addr): conn.send(b'hel ...

  8. MOOC JAVA笔记

    MOOC JAVA笔记 1.基础了解 JDK是开发人员安装的,它提供了开发java程序的必须工具 JRE是普通用户安装的,它提供了java的运行环境 JVM是java虚拟机运行程序的核心 2.程序的移 ...

  9. 新鲜出炉!春招-面试-阿里钉钉、头条广告,美团面经分享,看我如何拿下offer!

    之前给大家分享了一个朋友在字节面试的面试经历和拿到offer的过程,过程也算是比较精彩了,感兴趣的朋友可以去翻翻之前的那篇文章.话不多说重点来啦,一直有人发私信问我有没有其他大厂的面经分享啊,我也是联 ...

  10. 《高并发下的.NET》第2季 - 《memcached连接暴增案》第1集:问题表现

    在<.NET 5.0 背锅案>第7集-大结局之后,园子和 .NET 继续过上了幸福生活...剧情很美好,现实很残酷...现实是旧案刚结,新案立至,而且新案与旧案有关联,被迫继续拍剧,并对该 ...