Web前端-按钮点击效果(水波纹)
这种效果可以由元素内嵌套canves实现,也可以由css3实现。
Canves实现
网上摘了一份canves实现的代码,略微去掉了些重复定义的样式并且给出js注释,代码如下
第一种方法:
html骨架代码
- <a class="btn color-1 material-design" data-color="#2f5398">Press me!</a>
css代码
- * {
- box-sizing: border-box;
- outline: none;
- }
- body {
- font-family: 'Open Sans';
- font-size: 100%;
- font-weight: 300;
- line-height: 1.5em;
- text-align: center;
- }
- .btn {
- border: none;
- display: inline-block;
- color: white;
- overflow: hidden;
- margin: 1rem;
- padding: 0;
- width: 150px;
- height: 40px;
- text-align: center;
- line-height: 40px;
- border-radius: 5px;
- }
- .btn.color-1 {
- background-color: #426fc5;
- }
- .btn-border.color-1 {
- background-color: transparent;
- border: 2px solid #426fc5;
- color: #426fc5;
- }
- .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;
- }
js代码
- var canvas = {},
- centerX = 0,
- centerY = 0,
- color = '',
- containers = document.getElementsByClassName('material-design')
- context = {},
- element = {},
- radius = 0,
- // 根据callback生成requestAnimationFrame动画
- requestAnimFrame = function () {
- return (
- window.requestAnimationFrame ||
- window.mozRequestAnimationFrame ||
- window.oRequestAnimationFrame ||
- window.msRequestAnimationFrame ||
- function (callback) {
- window.setTimeout(callback, 1000 / 60);
- }
- );
- } (),
- // 为每个指定元素生成canves
- init = function () {
- containers = Array.prototype.slice.call(containers);
- for (var i = 0; i < containers.length; i += 1) {
- canvas = document.createElement('canvas');
- canvas.addEventListener('click', press, false);
- containers[i].appendChild(canvas);
- canvas.style.width ='100%';
- canvas.style.height='100%';
- canvas.width = canvas.offsetWidth;
- canvas.height = 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;
- // 通过判断半径小于元素宽度,不断绘制 radius += 2 的圆形
- if (radius < element.width) {
- requestAnimFrame(draw);
- }
- };
- init();
第二种方法:
html代码
- <a class="waves ts-btn">Press me!</a>
css
- .waves{
- position:relative;
- cursor:pointer;
- display:inline-block;
- overflow:hidden;
- text-align: center;
- -webkit-tap-highlight-color:transparent;
- z-index:1;
- }
- .waves .waves-animation{
- position:absolute;
- border-radius:50%;
- width:25px;
- height:25px;
- opacity:0;
- background:rgba(255,255,255,0.3);
- transition:all 0.7s ease-out;
- transition-property:transform, opacity, -webkit-transform;
- -webkit-transform:scale(0);
- transform:scale(0);
- pointer-events:none
- }
- .ts-btn{
- width: 200px;
- height: 56px;
- line-height: 56px;
- background: #f57035;
- color: #fff;
- border-radius: 5px;
- }
js
- document.addEventListener('DOMContentLoaded',function(){
- var duration = 750;
- // 样式string拼凑
- var forStyle = function(position){
- var cssStr = '';
- for( var key in position){
- if(position.hasOwnProperty(key)) cssStr += key+':'+position[key]+';';
- };
- return cssStr;
- }
- // 获取鼠标点击位置
- var forRect = function(target){
- var position = {
- top:0,
- left:0
- }, ele = document.documentElement;
- 'undefined' != typeof target.getBoundingClientRect && (position = target.getBoundingClientRect());
- return {
- top: position.top + window.pageYOffset - ele.clientTop,
- left: position.left + window.pageXOffset - ele.clientLeft
- }
- }
- var show = function(event){
- var pDiv = event.target,
- cDiv = document.createElement('div');
- pDiv.appendChild(cDiv);
- var rectObj = forRect(pDiv),
- _height = event.pageY - rectObj.top,
- _left = event.pageX - rectObj.left,
- _scale = 'scale(' + pDiv.clientWidth / 100 * 10 + ')';
- var position = {
- top: _height+'px',
- left: _left+'px'
- };
- cDiv.className = cDiv.className + " waves-animation",
- cDiv.setAttribute("style", forStyle(position)),
- position["-webkit-transform"] = _scale,
- position["-moz-transform"] = _scale,
- position["-ms-transform"] = _scale,
- position["-o-transform"] = _scale,
- position.transform = _scale,
- position.opacity = "1",
- position["-webkit-transition-duration"] = duration + "ms",
- position["-moz-transition-duration"] = duration + "ms",
- position["-o-transition-duration"] = duration + "ms",
- position["transition-duration"] = duration + "ms",
- position["-webkit-transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)",
- position["-moz-transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)",
- position["-o-transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)",
- position["transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)",
- cDiv.setAttribute("style", forStyle(position));
- var finishStyle = {
- opacity: 0,
- "-webkit-transition-duration": duration + "ms",
- "-moz-transition-duration": duration + "ms",
- "-o-transition-duration": duration + "ms",
- "transition-duration": duration + "ms",
- "-webkit-transform" : _scale,
- "-moz-transform" : _scale,
- "-ms-transform" : _scale,
- "-o-transform" : _scale,
- top: _height + "px",
- left: _left + "px",
- };
- setTimeout(function(){
- cDiv.setAttribute("style", forStyle(finishStyle));
- setTimeout(function(){
- pDiv.removeChild(cDiv);
- },duration);
- },100)
- }
- document.querySelector('.waves').addEventListener('click',function(e){
- show(e);
- },!1);
- },!1);
Web前端-按钮点击效果(水波纹)的更多相关文章
- Android5.0以上的项目都会有的按钮点击特效--水波纹
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...
- Android点击Button水波纹效果
先上图,看看接下来我要向大家介绍的是个什么东西,例如以下图: 接下来要介绍的就是怎样实现上述图中的波纹效果.这样的效果假设大家没有体验过的话,能够看看百度手机卫士或者360手机卫士,里面的按钮点击效果 ...
- android 按钮点击效果实现
在其他人的博客里看到其实实现按钮点击效果的方法有很多,这里提到的只是其中一个办法 图片素材(我自己用截图截的,可以自己搞) 放到mipmap目录下(studio是在这个目录下 , eclipse 直接 ...
- Android5.0新特性之——按钮点击效果动画(涟漪效果)
Android5.0 Material Design设计的动画效果 RippleDrawable涟漪效果 涟漪效果是Android5.0以后的新特性.为了兼容性,建议新建drawable-v21文件夹 ...
- Android实现按钮点击效果(第一次点击变色,第二次恢复)
1.首先创建一个按钮 <Button android:id="@+id/click" android:layout_width="fill_parent" ...
- Android下实现win8的按钮点击效果
原理就是自定义一个imageButton,实现动画效果 demo源码下载地址: 请戳这里----------------> 关于回弹张力的效果扩展,可以参考Facebook的开源动画库rebo ...
- 按钮点击效果jquery
<html><head> <meta charset="UTF-8"> <title>QQ</title> <me ...
- UITableView上添加按钮,按钮点击效果延迟的解决办法
在自定义的TableView的初始化方法做如下操作 - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame: ...
- 移动web前端下拉刷新效果
直接复制粘贴 放在页面中即可 <script> window.onload = function(){ window.addEventListener('touchstart', touc ...
随机推荐
- 面试题:你有没有搞混查询缓存和Buffer Pool
一. 关注送书!<Netty实战> 文章公号号首发!连载中!关注微信公号回复:"抽奖" 可参加抽活动 首发地址:点击跳转阅读原文,有更好的阅读体验 使用推荐阅读,有更好 ...
- JavaScript兼容性总结一点点
JavaScript 不同浏览器之间的差异还是很大,所以js库才这么有需求,需要解决各种兼容性问题. 其实反过来,既然存在js库能解决这些兼容性问题,说明底层大部分功能还是相通的. 首先想到的是事件模 ...
- 【JVM第五篇--运行时数据区】方法区
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.栈.堆.方法区的关系 虚拟机运行时的数据区如下所示: 即方法区是属于线程共享的内 ...
- 连续子数组的和的绝对值的最大值、最小值(非绝对值的话直接dp动态规划)
前缀和的思路: sum[i] = num[0]+num[1]+......+num[i-1] sum[j] = num[0]+num[1]+......+num[j-1] 那么:num[i]+num[ ...
- osd磁盘空间足够无法写入数据的分析与解决
前言 这个问题的来源是ceph社区里面一个群友的环境出现在85%左右的时候,启动osd报错,然后在本地文件系统当中进行touch文件的时候也是报错,df -i查询inode也是没用多少,使用的也是in ...
- 解决calamari无法获取节点信息的bug
前言 一直在做calamari的相关的一些打包和安装的工作,都是业余弄的东西,所以并没有仔细的进行功能点的验证测试,正好ceph社区群里面有人问了个问题 calamari上是不是能看到ceph的ver ...
- 多线程实现socketserver练习
1.server import socket from threading import Thread def my_socketserver(conn, addr): conn.send(b'hel ...
- MOOC JAVA笔记
MOOC JAVA笔记 1.基础了解 JDK是开发人员安装的,它提供了开发java程序的必须工具 JRE是普通用户安装的,它提供了java的运行环境 JVM是java虚拟机运行程序的核心 2.程序的移 ...
- 新鲜出炉!春招-面试-阿里钉钉、头条广告,美团面经分享,看我如何拿下offer!
之前给大家分享了一个朋友在字节面试的面试经历和拿到offer的过程,过程也算是比较精彩了,感兴趣的朋友可以去翻翻之前的那篇文章.话不多说重点来啦,一直有人发私信问我有没有其他大厂的面经分享啊,我也是联 ...
- 《高并发下的.NET》第2季 - 《memcached连接暴增案》第1集:问题表现
在<.NET 5.0 背锅案>第7集-大结局之后,园子和 .NET 继续过上了幸福生活...剧情很美好,现实很残酷...现实是旧案刚结,新案立至,而且新案与旧案有关联,被迫继续拍剧,并对该 ...