HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)


Posted in HTML / CSS onDecember 14, 2016

本文介绍了HTML5 Canvas玩转酷炫大波浪进度图效果,具体如下:

HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)

如上图所见,本文就是要实现上面那种效果。

由于最近AlloyTouch要写一个下拉刷新的酷炫loading效果。所以首选大波浪进度图。

首先要封装一下大波浪图片进度组件。基本的原理是利用Canvas绘制矢量图和图片素材合成出波浪特效。

了解quadraticCurveTo

quadraticCurveTo() 方法通过使用表示二次贝塞尔曲线的指定控制点,向当前路径添加一个点。

JavaScript 语法:

context.quadraticCurveTo(cpx,cpy,x,y);

参数值

cpx 贝塞尔控制点的 x 坐标

cpy 贝塞尔控制点的 y 坐标

x 结束点的 x 坐标

y 结束点的 y 坐标

如:

ctx.moveTo(20,20);
ctx.quadraticCurveTo(20,100,200,20);
ctx.stroke();

通过上面代码可以绘制一条二次贝塞尔曲线,具体原理效果看下图:

HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)

尝试绘制波浪

var waveWidth = 300,
    offset = 0,
    waveHeight = 8,
    waveCount = 5,
    startX = -100,
    startY = 208,
    progress = 0,
    progressStep = 1,
    d2 = waveWidth / waveCount,
    d = d2 / 2,
    hd = d / 2,
    c = document.getElementById("myCanvas"),
    ctx = c.getContext("2d");

function tick() {
    offset -= 5;
    progress += progressStep;
    if (progress > 220 || progress < 0) progressStep *= -1;

    if (-1 * offset === d2) offset = 0;
    ctx.clearRect(0, 0, c.width, c.height);
    ctx.beginPath();
    var offsetY = startY - progress;
    ctx.moveTo(startX - offset, offsetY);

    for (var i = 0; i < waveCount; i++) {
        var dx = i * d2;
        var offsetX = dx + startX - offset;
        ctx.quadraticCurveTo(offsetX + hd, offsetY + waveHeight, offsetX + d, offsetY);
        ctx.quadraticCurveTo(offsetX + hd + d, offsetY - waveHeight, offsetX + d2, offsetY);
    }
    ctx.lineTo(startX + waveWidth, 300);
    ctx.lineTo(startX, 300);
    ctx.fill();

    requestAnimationFrame(tick);
}

tick();

可以看到无限运动的波浪:

HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)

这里需要主要,绘制的区域要比Canvas大来隐藏摇摆校正的图像,上面使用了200200的Canvas。

大家把代码clone下来可以试试把它绘制到一个大的Canvas上就可以明白。

这里通过if (-1  offset === d2) offset = 0;来实现无限循环。

d2就是一个波峰+波谷的长度。一个波峰+一个波谷之后又开始同样的生命周期和从0开始一样,所以可以重置为0。

了解globalCompositeOperation

globalCompositeOperation 属性说明了绘制到画布上的颜色是如何与画布上已有的颜色组合起来的。

绘制大波浪进度图会用到:

ctx.globalCompositeOperation = "destination-atop";

destination-atop意义:画布上已有的内容只会在它和新图形重叠的地方保留。新图形绘制于内容之后。

当然,globalCompositeOperation还有很多选项,这里不一一列举,大家可以试试设置其他的属性来调整出很酷炫的叠加特效。

整体实现

var img = new Image();
function tick() {
    ...
    ...
    ctx.fill();
    ctx.globalCompositeOperation = "destination-atop";
    ctx.drawImage(img, 0, 0);
    requestAnimationFrame(tick);
}

img.onload = function () {
    tick();
};

img.src = "asset/alloy.png";

为了代码简单直接,这里免去了封装一个加载器的代码,直接通过new Image来设置src来加载图片。

 在绘制完矢量图之后,设置globalCompositeOperation,然后再绘制企鹅图片,绘制顺序不能搞错。

最后

实例下载:demo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
纯CSS3实现3D旋转书本效果
Mar 21 HTML / CSS
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
Jun 03 HTML / CSS
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
Jun 11 HTML / CSS
CSS3实现鼠标悬停显示扩展内容
Aug 24 HTML / CSS
使用CSS3实现input多选框自定义样式的方法示例
Jul 19 HTML / CSS
仿CSDN Blog返回页面顶部功能实现原理及代码
Jun 30 HTML / CSS
HTML5单页面手势滑屏切换原理
Mar 21 HTML / CSS
手机端用rem+scss做适配的详解
Nov 15 HTML / CSS
canvas拼图功能实现代码示例
Nov 21 HTML / CSS
canvas生成带二维码海报的踩坑记录
Sep 11 HTML / CSS
基于CSS3画一个iPhone
Apr 21 HTML / CSS
HTML页面中使两个div并排显示的实现
May 15 HTML / CSS
详解使用HTML5 Canvas创建动态粒子网格动画
Dec 14 #HTML / CSS
H5新属性audio音频和video视频的控制详解(推荐)
Dec 09 #HTML / CSS
Html5 Geolocation获取地理位置信息实例
Dec 09 #HTML / CSS
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
Dec 03 #HTML / CSS
HTML5标签大全
Nov 23 #HTML / CSS
HTML5拖放效果的实现代码
Nov 17 #HTML / CSS
html5 div布局与table布局详解
Nov 16 #HTML / CSS
You might like
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
2013/01/06 PHP
Yii PHP Framework实用入门教程(详细介绍)
2013/06/18 PHP
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
Zend Framework教程之Application和Bootstrap用法详解
2016/03/10 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
javascript基本语法
2016/05/31 Javascript
探讨AngularJs中ui.route的简单应用
2016/11/16 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
2017/06/28 Javascript
JS监控关闭浏览器操作的实例详解
2017/09/12 Javascript
详细教你微信公众号正文页SVG交互开发技巧
2019/07/25 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
python 测试实现方法
2008/12/24 Python
Python中Random和Math模块学习笔记
2015/05/18 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
python推导式的使用方法实例
2021/02/28 Python
Lee牛仔裤澳大利亚官网:美国著名牛仔裤品牌
2017/09/02 全球购物
俄罗斯在线大型超市:ТутПросто
2021/01/08 全球购物
大学生毕业自我鉴定范文
2013/11/03 职场文书
工业设计专业个人求职信范文
2013/12/28 职场文书
优秀班集体先进事迹材料
2014/05/28 职场文书
保护环境标语
2014/06/09 职场文书
挂职学习心得体会
2014/09/09 职场文书
党员干部批评与自我批评反四风思想汇报
2014/09/21 职场文书
银行优秀员工推荐信
2015/03/24 职场文书
OpenCV实现常见的四种图像几何变换
2022/04/01 Python