写在前面:

亲爱的朋友们大家好,鄙人自学前端,第一次写博客,写的不好的地方,烦请同学们谅解.

在进行教学之前,我想聪明的你已经掌握了基本的Canvas基本操作方法,如果对Canvas还不是很了解,那么我建议你去http://www.w3school.com.cn/tags/html_ref_canvas.asp这里先熟悉一下;

okey!下图即是我们完成后的简单效果,心动不如行动,那么咱们就进行简单绘制吧!

1、定义画布

首先我们现在html文件里面插入标签,定义画布的尺寸,我这里定义画布的尺寸为800*600像素。同时在内部样式表里面设置canvas的背景色(方便画图时观看);

Document

body{

padding: 0;

margin: 0;

}

#canvas {

background:#5151a2;

}

接下来的核心就是在原生JS环境下,绘制风车;通过JS DOM操作方法获取到canvas元素对象,并通过getContex("2d")获取2D绘图上下文,通过这个方法就像是要告诉浏览器“我们要在这个画布上绘制2d图形”;

//获取画布的2d上下文

var ctx = document.getElementById("canvas").getContext("2d");

2、绘制风车底座

风车的底座的几何图形看似就像一个细长细长的梯形,我们可以画出一个梯形出来,然后填充颜色,这里为了达到相对较好的效果,使用了颜色渐变填充的方法;okey!直接看代码吧~~!

//定义一个函数 ,封装风车的底部基座

function buttom(){

ctx.beginPath(); //开始一条新的绘制路径

var liner = ctx.createLinearGradient(390,600,410,600); //设置变量(颜色渐变的方向-起点-终点)

liner.addColorStop(0,"#ccc"); //设置起点颜色

liner.addColorStop(0.5,"#fff"); //设置中点颜色

liner.addColorStop(1,"#ccc"); //设置终点颜色

ctx.fillStyle = liner; //梯形的填充方式设置为 变量(渐变颜色)

ctx.moveTo(395,300); //提起我们的画笔,起点设置为(395,300)

ctx.lineTo(405,300); //连接起点画线

ctx.lineTo(410,600);

ctx.lineTo(390,600);

ctx.closePath(); //闭合路径

ctx.fill(); //填充梯形

}

buttom();                              //要调用函数,才能在浏览器显示

我们来看一下页面中的效果,是不是很简单?

(我感觉我话有点多哦~!~!)

3、绘制叶子

接下来的部分将是这个动画中最关键的地方,首先我们分析一下叶子的结构,三片叶子夹角为120°,而且每片叶子的形状是相同的;他们有一个圆心,你心中或许也有疑问,先画圆心还是先画叶子?叶子的形状应该怎么画呢?叶子可不可复制粘贴呢?答案当然是可以的,Let's do it!

思路分析:

1)、由于3片叶子的形状是一模一样,我们只需要画出一片叶子,第二第三片叶子直接copy就行了,聪明的我们是不是应该给这个叶子的画法封装一个函数呀?就叫它bind(  )函数吧!!每次调用它就可以了!哎!你们TM太机智了

2)、三片叶子有一个圆心,绘制叶子的时候为了方便取坐标值,我们将圆心从画图的左上角移动梯形顶部,这样我们绘制叶子会方便很多!这里使用了translate()方法,移动坐标系!

3)、最难的一点就是理解这里动画是怎么实现的,因为动画原理会影响到我们画叶子的文档结构:

首先我们先新建一个绘图环境,我们称它为环境1,我们在环境1上画完第一片叶子;然后在   第一个绘图环境前提下  旋转120°新建第一个绘图环境2,再此基础上调用画叶子的函数bind(  ),绘制二片叶子;第三片叶子的绘制方法如法炮制,在环境2的基础上旋转120°,新建环境3,调用绘制叶子函数bind(  )画第三片叶子;

如果要实现动画,我们只需要旋转第一片叶子的绘图环境1,第二片叶子和第三片叶子都是参照环境1为基准画出来的,是不是也跟着动起来了呢??        弹幕:666666

4)、最后就是一些基本的外观样式调试的啦!比如颜色渐变啊,透明度啊,之类的!

绘制叶子

画这个叶子形状的时候我是慢慢调试的,我的审美相当low,原谅我只能画出这样的叶子,当然想象力丰富的同学可以根据自己喜好来绘制,不过大体思路是一致的;

这里我声明了一个变量 var num = 0;,作为环境1旋转度数变化的一个参数:  那么咱就直接看代码吧!!!

var num =0;

function yezi(){

ctx.save(); //保存默认情况下的canvas变换状态

ctx.beginPath();

ctx.translate(400,300);

// ctx.globalAlpha = 0.9;

// 设置第一次状态下 坐标系旋转度数

ctx.rotate((Math.PI/180)*num);

var liner1 = ctx.createLinearGradient(30,-12,30,12); //这里设置颜色渐变填充的样式

liner1.addColorStop(0,"#ccc");

liner1.addColorStop(0.5,"#fff");

liner1.addColorStop(1,"#ccc");

ctx.fillStyle = liner1;

ctx.save(); //保存第一次状态 平移坐标系变换

ctx.beginPath();

bind(); //调用函数

//绘制第二片叶子

ctx.beginPath();

ctx.rotate((Math.PI/180)*120); //坐标系旋转120°

ctx.save(); //保存旋转坐标系状态,为第三片叶子做铺垫

bind(); //调用函数

//绘制第三片叶子

ctx.beginPath();

ctx.rotate((Math.PI/180)*120); //坐标系旋转120°

ctx.save();

bind(); //调用函数

ctx.restore(); //回复第3次状态前(旋转坐标系)

ctx.restore(); //回复第2次状态前(旋转坐标系)

//绘制叶子中心圆圈

ctx.beginPath();

var arcgradient = ctx.createRadialGradient(0,0,0,0,0,16);

arcgradient.addColorStop(0,"#ccc");

arcgradient.addColorStop(0.1,"#fff");

arcgradient.addColorStop(1,"#ccc");

ctx.arc(0,0,10,0,Math.PI*2);

ctx.fillStyle = arcgradient;

ctx.fill();

ctx.restore(); //回复第1次状态前(平移坐标系)

num+=5; //第一状下 环境1 态坐标系旋转度数增加********************************这个num使得环境1的旋转角度在不停的变化,**********************************************

ctx.restore();

}

//绘制每片叶子都重复的代码,这里做一个函数包装

function bind(){

ctx.moveTo(0,0);

ctx.quadraticCurveTo(10,-12,30,-12);    //比赛尔曲线

ctx.lineTo(190,-3);

ctx.quadraticCurveTo(200,0,190,3);

ctx.lineTo(30,12);

ctx.moveTo(0,0);

ctx.quadraticCurveTo(10,12,30,12);

ctx.fill();

}

4、设置动画

动画这部分就比较简单了,设置定时器,清除画布,调用函数;大功告成,打完收工!!!

setInterval(function(){

ctx.clearRect(0,0,800,600);    //每次执行代码前,都要将画布清空,不然画出的图形会滞留在画布上;

buttom();               //调用函数

yezi();

},50);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持找一找教程网。

用html制作旋转风车,HTML5 Canvas 旋转风车绘制相关推荐

  1. html5做旋转太极图,HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)...

    效果图: 方法一: your browser does not support the canvas tag var deg = 0; var r = 30; var rl = 100; functi ...

  2. html语言制作折线图,html5 canvas 实现简单绘制折线图

    画图 #divContainer{ margin-top: 20px; text-align: center; } #cv{ width: 300px; height: 200px; border-b ...

  3. html绘制圆形和弧形的代码,html5 canvas用来绘制弧形的代码实现

    这篇文章给大家分享的内容是关于html5 canvas用来绘制弧形的代码实现,有一定的参考价值,有需要的朋友可以从参考一下,希望对你有所帮助. 1.绘制弧形context.arc( centerx, ...

  4. html5拓扑图图入门,如何使用HTML5 Canvas动态的绘制拓扑图

    如何使用HTML5 Canvas动态的绘制拓扑图 使用HTML5 Canvas动态的绘制拓扑图: HTML5中引入新的元素canvas,其drawImage 方法允许在 canvas 中插入其他图像( ...

  5. html 文本框弧形,html5 canvas用来绘制弧形的代码实现

    这篇文章给大家分享的内容是关于html5 canvas用来绘制弧形的代码实现,有一定的参考价值,有需要的朋友可以从参考一下,希望对你有所帮助. 1.绘制弧形context.arc( centerx, ...

  6. html5上色游戏制作,怎样用HTML5 Canvas制作一个简单的游戏

    原文连接: How To Make A Simple HTML5 Canvas Game 自从我制作了一些HTML5游戏(例如Crypt Run)后,我收到了很多建议,要求我写一篇关于怎样利用HTML ...

  7. html5游戏制作人物原图,HTML5 canvas粒子生成人物面部轮廓插件

    这是一款使用js制作的html5 canvas粒子生成人物面部轮廓插件.该js插件可以扫描图片中的人物面部阴暗和高亮面,并生成canvas也能够圆点来描绘出脸部轮廓.还可以用鼠标来和粒子进行互动. 使 ...

  8. 用html制作阴影效果,使用HTML5 Canvas绘制阴影效果的方法

    这篇文章主要介绍了使用HTML5 Canvas绘制阴影效果的方法,包括一个3D拉影 边缘模糊效果文字的编写例子,在阴影效果的利用上进一步深入,需要的朋友可以参考下 创建阴影效果需要操作以下4个属性: ...

  9. html5制作风车旋转,HTML5 Canvas 旋转风车绘制

    写在前面: 亲爱的朋友们大家好,鄙人自学前端,第一次写博客,写的不好的地方,烦请同学们谅解. 在进行教学之前,我想聪明的你已经掌握了基本的Canvas基本操作方法,如果对Canvas还不是很了解,那么 ...

最新文章

  1. 纯c gSoap实现WebService
  2. python if条件判断和while循环 练习题
  3. android view xml,如何将View添加到XML布局android
  4. C#-析构方法与构造方法 087
  5. python最大约数是_python – 找到最大的公约数(赋值错误,我迫切需要你的帮助)
  6. 最长递增子序列和网易去除最少使从左向右递增又递减问题
  7. Redmine Gantt 实现 (Show relations in Gantt diagram)
  8. 计算机科学课程规范,计算机科学及技术学院《本科生课程设计规范化要求》.doc...
  9. GartnerSynergy:一场IBM云业务营收引发的争议
  10. php ZeroMQ 的使用
  11. 社会工程学之《反欺骗的艺术》小结(三)
  12. 开发计算机软件的基本流程
  13. IDEA 怎么画UML图
  14. Ruby File.open 方法打开文件和File.new 方法打开文件的差别
  15. jdk,jre,jvm的包含关系
  16. 【音乐系列】吉他学习入门基本知识
  17. excel.h的简单使用
  18. 沃特金斯将军、钱德勒上校、兰德里上校、阿代尔先生
  19. tp5.1 定义公共属性initialize parent 其它控制器内能直接引用 同时继承已有的控制器初始化
  20. UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xae in position 16: illegal multibyte sequence

热门文章

  1. 如何获取ul中的li的索引
  2. 需要来自administrators的权限才能对此文件夹进行更改
  3. JAVA 16进制转ASCII -- 2018年5月25日 周五
  4. 专门用于便携式医疗机械Netsol Serial STT-MRAM
  5. Touch driver porting
  6. C#之CAD二次开发(15) Ribbon交互界面实例
  7. 下载android Studio 并且安装sdk
  8. 接地气的O2O模式 杭州两个年轻小伙月销水果8万元
  9. 出现字迹模糊迹象_您遇到云文化问题的3个迹象
  10. PPPoE的封装结构(经典 解释了PPPoE中虚拟网卡的作用)