基于JS+Canves实现点击水波纹功能

canvas水波特效,可动态改变 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> <style type="text/css"> #c{ marg 阅读详情

近来看到个不错的按钮点击效果,当点击时产生一次水波涟漪效果,挺好玩的,于是简单的实现了下(没考虑低版本浏览器兼容问题)

先看看效果吧,如下图(录制gif软件有点渣,看起来卡卡的...)

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

Canves实现

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

html代码

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

css代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
* {
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代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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();

CSS3实现

接下来就是纯手打的代码了...觉得还是css3实现的方便些,可能是css写习惯了...

html代码

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

css代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.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代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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);
Canvas制作水波图实现原理,web前端开发入门学习 这里我们用到了 Canvas 的 clip() 方法来定义剪切区域,定义了剪切区域后,浏览器会将所有的绘图操作都限制在本区域内执行,所以我们可以先画一个圆,定义后面绘制的区域只能在这个圆的区域内,超出部分就不显示,这样就能形成浪在一个球体中的效果了。动画效果的实现主要是利用相移,通过不断水平移动曲线,产出波浪移动的感觉,然后可以绘制多条曲线,曲线之间通过控制属性(高度、宽度、移动速度),产生视觉差,就会有波浪起伏的感觉了。是不是有点感觉了,目前还差一点,就是控制水位,也就是映射到数据的百分比。 阅读详情

相关推荐

自定义控件:漂亮的水纹波效果(Qt QML-Canvas 深入学习)

我们设置绘图上下文的全局透明度为当前的 rippleOpacity 值,并绘制一个圆形路径,路径的位置由 rippleX 和 rippleY 决定,半径由 rippleRadius 决定。在上面的代码中,我们定义了一些属性来控制水纹波的位置、半径和透明度。在 startRipple 函数内部,我们设置水纹波的初始状态,并创建两个动画来控制水纹波的半径和透明度。在本篇文章中,我们将学习如何创建一个漂亮的水纹波自定义控件,使用 Qt QML 中的 Canvas 组件来实现。如果你有任何问题,请随时提问。

ByteBuster的博客 448

Canvas详解

一、canvas 简介 1.1 什么是 canvas?(了解) 是 HTML5 提供的一种新标签 <canvas></canvas> 英 ['kænvəs] 美 ['kænvəs] 帆布 画布 Canvas 是一个矩形区域的画布,可以用 JavaScript 在上面绘画。控制其每一个像素。 canvas 标签使用 JavaScript 在网页上绘制图像,本身不具备绘图功能。 canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。 HTML5 之前的 web 页

发果叁 4万+

canvas水波纹效果,jquery鼠标水波纹插件

jQuery,canvas水波纹效果,鼠标滑动点击水波纹特效

qq_42400124的博客 1360

HTML5新属性 Canvas的整体学习

大家好。好久没见了,萍子也已经好久都没更新博文了,嘻嘻,有没有想念萍子啊。最近有点事情需要处理,所以大致请了半个月的假,呼呼~这半个月的假期过去再回来摸键盘码代码,感觉脑子一片空白啊,多尴尬啊,这个“从入门到放弃的”的水平,现在更糟糕了,唉~萍子心理暗暗暗示自己要加油啊,马上过年了,得过个好年呐。~~(>_

等,你的到来。 2032

IBM 3560M3 R5 坏盘更换记录

公司一台老旧 3650M3在日常巡查过程中发现硬盘报错

ddriv的博客 3939

WinForm轻松打造AntDesign现代化工具栏

摘要: 本文介绍如何在WinForm中利用AntdUI库实现AntDesign风格工具栏,包括安装配置、动态生成按钮/下拉菜单、布局优化及主题美化。通过AntButton、AntDropdown等控件结合事件绑定,可快速构建支持图标、工具提示、权限控制的现代化工具栏,并解决常见图标加载、布局错乱问题。最后提供代码示例与响应式设计技巧,助你打造高效美观的WinForm界面。 (字数:150)

java专栏 1591

html按钮点击效果代码,js点击按钮实现水波纹效果代码(CSS3和Canves)

js点击按钮实现水波纹效果代码(CSS3和Canves)2019-01-06编程之家https://www.jb51.cc编程之家收集整理的这篇文章主要介绍了js点击按钮实现水波纹效果代码(CSS3和Canves),编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。近来看到个不错的按钮点击效果,当点击时产生一次水波涟漪效果,挺好玩的,于是简单的实现了下(没考虑低版本浏览器兼容问题)先看看...

weixin_31558841的博客 840

从冰棍到铸钢:手把手用Fluent融化凝固模型模拟3个不同场景(含案例设置对比)

本文深入探讨了Fluent融化凝固模型在冰棍融化、巧克力涂层凝固和钢铁连铸三个不同场景中的应用。通过详细的参数设置和案例对比,帮助工程师掌握相变模拟的核心技巧,提升工业级CFD分析的精度和效率。

weixin_42522953的博客 471

html5 水波式按钮_js点击按钮实现水波纹效果代码(CSS3和Canves)

近来看到个不错的按钮点击效果,当点击时产生一次水波涟漪效果,挺好玩的,于是简单的实现了下(没考虑低版本浏览器兼容问题)先看看效果吧,如下图(录制gif软件有点渣,看起来卡卡的...)这种效果可以由元素内嵌套canves实现,也可以由css3实现。Canves实现网上摘了一份canves实现的代码,略微去掉了些重复定义的样式并且给出js注释,代码如下html代码:Press me!css代码:* {...

weixin_35878962的博客 842

ST-LINK调试STM32H743必看:CubeMX工程中缺失的这行代码导致程序跑飞

本文深入剖析了使用ST-LINK调试STM32H743时,因CubeMX工程中缺失电源电压档位配置代码而导致程序跑飞或出现“Can not access memory”错误的问题。文章解释了H7系列电源与时钟耦合的核心原理,提供了具体的代码修复方案和系统化的调试排查思路,帮助开发者从根本上解决这一常见调试困境。

weixin_29191669的博客 281

2023华为od机试C卷【最富裕的小家庭】Python 实现

在一颗树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为个小家庭。现给你一颗树,请计算出最富裕的小家庭的财富和。

MISAYAONE的博客 2042

HTML按钮波纹,基于JS+Canves实现点击按钮水波纹效果

近来看到个不错的按钮点击效果,当点击时产生一次水波涟漪效果,挺好玩的,于是简单的实现了下(没考虑低版本浏览器兼容问题)先看看效果吧,如下图(录制gif软件有点渣,看起来卡卡的...)这种效果可以由元素内嵌套canves实现,也可以由css3实现。Canves实现网上摘了一份canves实现的代码,略微去掉了些重复定义的样式并且给出js注释,代码如下html代码Press me!css代码* {bo...

weixin_35794520的博客 409

PCL 点到面的ICP算法【2024最新版】

经典的点到面的ICP算法。博客长期更新,本文最新更新时间为:2024年10月18日。

点云侠的博客 36万+

按钮实现水波纹效果(CSS3和Canves)

  这种效果可以由元素内嵌套canves实现,也可以由css3实现。  Canves实现  网上摘了一份canves实现的代码,略微去掉了些重复定义的样式并且给出js注释,代码如下  html代码:&lt;a class="btn color-1 material-design" data-color="#2f5398"&gt;Press me!&lt;/a&gt; css代码:  ...

GoldenLegs的博客 1334

【RT-DETR涨点改进】损失函数改进篇 | RT-DETR引入SlideLoss损失函数,适合目标检测中面临的尺度变化、遮挡以及难易样本不平衡等复杂场景下的检测任务,含详细使用步骤

本文提出在RT-DETR目标检测模型中引入SlideLoss损失函数,以解决尺度变化、遮挡和难易样本不平衡等问题。SlideLoss通过自适应阈值划分正负样本,并对难样本赋予更高权重,使模型更关注分类边界样本。文章详细展示了SlideLoss的核心代码实现,并逐步指导如何在RT-DETR框架中集成该损失函数。实验表明,该方法能有效提升模型性能,特别适用于复杂场景下的目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 263

0基础学习diffusion_model扩散模型【易理解的公式推导】Denoising Diffusion Probabilistic Models

去噪扩散概率模型。本文是笔者在学习扩散模型时的一些笔记与心得,在公式推导过程中能够保证自己是一步一步去推导并且理解了的。概述是我认为比较重要的部分能够帮助理解公式的推导,具体的公式推导在每一小节中进行。1、扩散过程:如上图所示,扩散过程为从右到左X0→XTX0​→XT​的过程,表示对图片逐渐加噪,且Xt1X_{t+1}Xt1​是在XtX_{t}Xt​加躁得到的,其只受XtX_{t}Xt​的影响,因此扩散过程是一个马尔科夫过程。X0X_0。

zik的博客 2397

前端-原生-Canvas-水波纹

使用及其简单

古猜@的博客 521

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

html5 js canvas 不规则水波纹动画背景 waves simplex-noise

canvas 不规则水波纹动画-simplex-noise核心JS效果图控制属性全部代码参考 核心JS 链接: simplex-noise.js 效果图 预览链接: https://codepen.io/thj2/pen/zYoOjzd 控制属性 this.count = 80; //波浪个数 This.speedY += 0.01; //波浪抖动频率 var amp = 100; //波浪幅度(高度) This.draw(‘rgba(239,119,87,0.35)’,‘screen’

thj13896076523的博客 1294

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Canves基本操作(绘制文字)

1.canves 绘制文字API介绍 canves中绘制文字的api有 API 相关介绍 是否经常使用 drawText 简单的绘制文字 ★★★★★ drawTextOnPath 按照指定的路径绘制出文字 ★★★★ drawPosText 在制定的位置上绘制出文字 ★★★ 2.drawText 使用 2.1 在使用drawText的时候,先来了解paint的一些基本设置...

苏打水解渴的博客 1188

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【canvas水波纹进度条】

在本篇文章中,我们将介绍如何使用Canvas来实现水波纹进度条效果。通过绘制波浪形状和动态变化的水位,我们可以创建出具有动感和视觉效果的进度条。通过使用Canvas绘制波浪形状和动态变化的水位,我们可以实现水波纹进度条效果。这种效果可以用于展示进度、加载状态等场景中,为用户提供更加直观和有趣的体验。请注意,以上代码仅为示例,你可以根据自己的需求进行修改和扩展。

No_Name_Cao_Ni_Mei的博客 908

canvas水波纹效果_如何使用HTML5 canvas创建水波纹效果

canvas水波纹效果Water ripple effect with HTML5. Today we continue JavaScript examples, and our article will about using javascript in modeling of water effects. This will emulation of water drops at images...

cukeoumuqian0413的博客 921

canvas 实现波浪线--水波动态效果

效果图如下:代码如下import QtQuick 2.6 import QtQuick.Window 2.2 import CanvansItem 1.0 import "./Drawjs.js" as Djs Window { visible: true width: 1500 height: 700 title: qsTr("Hello World") ...

缘如风的博客 1万+

Canves 基本操作 (屏幕上绘制网格和XY坐标)

文章目录1.canves的save和restore方法2.屏幕上绘制网格线和xy轴坐标 1.canves的save和restore方法 方法 含义 save() 保存画布之前的状态 restore() 将画布回复到之前的状态 可以理解为save方法是将之前canves的画布内容状态保存起来,然后对画布进行一些操作比如:平移、放缩、旋转、错切、裁剪等操作。restore将ca...

苏打水解渴的博客 2291

Canves基本操作(path简单路径绘制)

文章目录path常用的方法简介1. lineTo绘制直线2. moveTo 设置下次绘制的起点3. setLastPoint设置上次绘制的终点4. close 连接第一个点连接到最后一个点,形成一个闭合区域5. 添加内容到路径5.1 添加addRect 矩形5.3 添加addOval椭圆5.4 添加addCircle圆5.5 添加addPath路径5.5 添加addArc圆弧5.6 添加arcTo...

苏打水解渴的博客 1484

canvas:理解canvas / 基础使用 / 实用demo

Canvas是一个HTML5元素,用于在Web页面上绘制2D或3D图形。它允许使用JavaScript在网页上创建和操作图形。Canvas的主要功能是绘图,但也可以用来实现其他功能,如动画和交互式游戏。

snow的博客 5038

canvas实现扩散涟漪效果

实现思路: canvas 画圆,通过改变圆的半径及其透明度实现涟漪效果。 实现效果如下: 代码实现: 涟漪配置: let config = { 'cut': 0.2, 'startRadius': 5, //起始半径 'haloRadius': 25, //扩散半径 'times': 3, //次数 'stepTime': 2, //间隔时间 'stroke': 'RGBA(255,185,0,0.5)', //线的颜色 'color': '#ffcb56', //颜色 'time': 3,

heal_l的博客 1261
上一篇: 自己搭建一个SSM框架
下一篇: css mix-blend-mode 混合模式
Geoooo
博客等级 码龄9年 41粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值