canvas百分百特效
这个特效是别的人,非原创。原创地址
http://blog.csdn.net/lecepin/article/details/53536445

背后的水是可以动的
代码我再研究了下,下面是加了注释的代码。不是原创好像没什么好说的了。。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>动态进度加载小球</title>
<style>
#c{
margin: 0 auto;
display: block;
}
#r{
display: block;
margin: 0 auto;
}
#r::before{
color: black;
content: attr(min);
padding-right: 10px;
}
#r::after{
color: black;
content: attr(max);
padding-left: 10px;
}
</style>
</head>
<body>
<canvas id="c"></canvas>
<input type="range" id="r" min="0" max="100" step="1">
<script>
var canvas = document.getElementById('c');
var ctx = canvas.getContext('2d');
var range = document.getElementById('r'); //range控件信息
var rangeValue = range.value; var nowRange = 0; //用于做一个临时的range //画布属性
var mW = canvas.width = 250;
var mH = canvas.height = 250;
var lineWidth = 2; //圆属性
var r = mH / 2; //圆心
var cR = r - 16 * lineWidth; //圆半径 //Sin 曲线属性
var sX = 0;
var sY = mH / 2;
var axisLength = mW; //轴长
var waveWidth = 0.015 ; //波浪宽度(曲线周期),数越小越宽
var waveHeight = 6; //波浪高度(波峰),数越大越高
var speed = 0.09; //波浪水平速度,数越大速度越快
var xOffset = 0; //波浪x偏移量 ctx.lineWidth = lineWidth; //画圈函数
var IsdrawCircled = false;
var drawCircle = function(){ ctx.beginPath();
ctx.strokeStyle = '#1080d0';
//画外圆
ctx.arc(r, r, cR+5, 0, 2 * Math.PI);
ctx.stroke();
ctx.beginPath();
//显示水部分的圆
ctx.arc(r, r, cR, 0, 2 * Math.PI);
//剪裁圆形,去掉多于的水
ctx.clip(); } //画sin 曲线函数
var drawSin = function(xOffset){
ctx.save(); var points=[]; //用于存放绘制Sin曲线的点,用于封闭曲线 ctx.beginPath();
//在整个轴长上取点
for(var x = sX; x < sX + axisLength; x += 20 / axisLength){ //此处坐标(x,y)的取点,依靠公式 “振幅高*sin(x*振幅宽 + 振幅偏移量)”
//y=sin(TX+x)
var y = -Math.sin((sX + x) * waveWidth + xOffset);
//dY是波浪的高度,-是因为水从下往上
var dY = mH * (1 - nowRange / 100 ); points.push([x, dY + y * waveHeight]);
//描绘点
ctx.lineTo(x, dY + y * waveHeight);
}
//现在一条线从左端绘制到了右端
//封闭路径
//接着连右下端
ctx.lineTo(axisLength, mH);
//左下端
ctx.lineTo(sX, mH);
//曲线图的最左端
//封闭完成后,调用上面的ctx.clip(),去掉圆外面的水
ctx.lineTo(points[0][0],points[0][1]);
ctx.fillStyle = '#1c86d1';
ctx.fill(); ctx.restore(); }; //写百分比文本函数
var drawText = function(){
ctx.save(); var size = 0.4*cR;
ctx.font = size + 'px Microsoft Yahei';
ctx.textAlign = 'center';
ctx.fillStyle = "rgba(06, 85, 128, 0.8)";
ctx.fillText(nowRange + '%', r, r + size / 2); ctx.restore();
}; var render = function(){
ctx.clearRect(0, 0, mW, mH);
//通过不断刷新来获取range的值
rangeValue = range.value;
if(IsdrawCircled == false){
drawCircle();
}
//如果拖动input,就安每次加减1的速度增减
if(nowRange <= rangeValue){
var tmp = 1;
nowRange += tmp;
} if(nowRange > rangeValue){
var tmp = 1;
nowRange -= tmp;
}
//不停的偏移,让波浪动起来
drawSin(xOffset);
drawText();
//偏移量加大
xOffset += speed; requestAnimationFrame(render);
} render();
</script>
</body>
</html>
canvas百分百特效的更多相关文章
- 纯JavaScript实现HTML5 Canvas六种特效滤镜
纯JavaScript实现HTML5 Canvas六种特效滤镜 小试牛刀,实现了六款简单常见HTML5 Canvas特效滤镜,并且封装成一个纯 JavaScript可调用的API文件gloomyfi ...
- 16个富有创意的HTML5 Canvas动画特效集合
HTML5技术正在不断的发展和更新,越来越多的开发者也正在加入HTML5阵营,甚至在移动开发上HTML5的地位也是越来越重要了.HTML5中的大部分动画都是通过Canvas实现,因为Canvas就像一 ...
- 分享8款令人惊叹的HTML5 Canvas动画特效
HTML5的确可以制作出非常绚丽的网页动画效果,尤其是利用HTML5 Canvas特性和HTML5 3D特性,我们更加可以欣赏到超酷的动画特效.今天我从html5tricks网站上整理了8款令人惊叹的 ...
- 16个非常有趣的HTML5 Canvas动画特效集合
HTML5技术正在不断的发展和更新,越来越多的开发者也正在加入HTML5阵营,甚至在移动开发上HTML5的地位也是越来越重要了.HTML5中的大部分动画都是通过Canvas实现,因为Canvas就像一 ...
- 几十行js实现很炫的canvas交互特效
几十行js实现很炫的canvas交互特效 废话不多说,先上效果图! 本篇文章的示例代码都是抄的一个叫Franks的老外在yutube上的一个教学视频,他还出了很多关于canvas的视频,十分值得学习, ...
- html5 canvas 粒子特效
不知不觉就已经好久没写过博客了,自从七月正式毕业后,离开了实习了将近九个月的老东家,进了鼠厂后,做的事都是比较传统的前端活,之前在tpy的时候只管做移动h5的特效以及小游戏,再加上实习所以时间比较充裕 ...
- canvas焰火特效
之前在抖音上看到了一个很漂亮的焰火效果.这会儿有时间就用canvas实现了一下. 演示地址:http://suohb.com/work/firework4.htm 先看效果:(静态图片看不太出效果,请 ...
- canvas雪花特效-jQuery插件实现
这是一款效果十分逼真的html5 canvas下雪场景动画特效插件.这款下雪特效是基于Jason Brown的Snowfall jquery plugin的基础上制作的.在Snowfall jquer ...
- canvas入门级基本用法实现雨滴下落特效
canvas基础知识点参考各种文档,直接上代码,有非常详细注释 <!DOCTYPE html> <html> <head> <meta charset=&qu ...
随机推荐
- JAVA求解全排列
一,问题描述 给定一个字符串,求出该字符串的全排列. 比如:"abc"的全排列是:abc.acb.bac.bca.cab.cba 二,实现思路 采用递归的方式求解.每次先选定一个字 ...
- Spring XML配置里的Bean自动装配
Spring自动装配 这段是我们之前编写的代码,代码中我们使用了P命名空间 并且使用手动装配的方式将car <bean id="address" class="cn ...
- dp填表法,刷表法
填表法:利用上一状态推当前 刷表法:利用当前推关联,利用刷表法较为便捷,向上边界较容易处理,处理在本次循环中的影响
- UE4的AI学习(2)——官方案例实例分析
官方给出的AI实例是实现一个跟随着玩家跑的AI,当玩家没有在AI视野里时,它会继续跑到最后看到玩家的地点,等待几秒后如果仍然看不到玩家,则跑回初始地点.官方的案例已经讲得比较详细,对于一些具体的函数调 ...
- BZOJ 4129 Haruna’s Breakfast
传送门 同样是树上莫队 只不过要求一个集合的mex,这里可以使用分块,可以在根号时间内得出解 /************************************************** P ...
- tidb 架构 ~Tidb学习系列(4)
一 简介:今天我们继续学习tidb 二 集群管理 0 集群配置 验证 4台一组 3个kv 一个pd+server 上线 6台一组 1 动态添加kv服务 nohu ...
- Maven入门-运行struts项目进行测试(三)
maven运行struts项目进行测试: 在入门二中已经导入struts的jar包. 此时的pom.xml文件 <project xmlns="http://maven.apache. ...
- MCS-51单片机存储地址空间划分
1.前言 MCS-51的存储器有片内RAM.片外RAM 和 ROM 三个空间. MCS-51单片机在物理结构上有四个存储空间 1.片内程序存储器(片内ROM)2.片外程序存储器(片外ROM)3.片内数 ...
- maven项目提示web.xml is missing或红色感叹号
1.web.xml is missing and <failOnMissingWebXml> is set to true 提示信息应该能看懂.也就是缺少了web.xml文件,<fa ...
- redis拾趣(客户端连接,keys命令,数据备份,缓存有效期等)
1.客户端连接 为了安全保护,redis支持绑定IP跟端口,这个通过conf配置文件中的bind跟port来设置. 绑定后登录client控制台时就需要写明ip(或者hostname)跟端口了,如: ...