超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等

摘要:
不止一个经典的canvas实例是流行的:<canvas>元素用于在网页上绘制图形。注意:IE8和早期版本不支持<canvas>元素。提示:所有示例都在我的GayHub中共享-https://github.com/bxm0927/canvas-special尤玉玺的个人主页上有一个五颜六色的三角领带效果。点击它更改GitHub源代码,Demo Demo知乎登录页面动态离子背景效果GitHu源代码,基于Demo DemoCanvas的五子棋全功能GitHub源代码,演示Demo Canvas基于“是100楼的男人”迷你游戏完美GitHuc源代码,Demo Demo毛笔书法天字,你可以编写GitHum源代码,跟随刀片。
超多经典 canvas 实例

普及:<canvas>元素用于在网页上绘制图形。这是一个图形容器,您可以控制其每一像素,必须使用脚本来绘制图形。

注意:IE 8 以及更早的版本不支持<canvas>元素。

贴士:全部例子都分享在我的 GayHub -https://github.com/bxm0927/canvas-special

尤雨溪个人主页炫彩三角纽带效果,点击还可变换

GitHub源码Demo演示

知乎登录注册页动态离子背景效果

GitHub源码Demo演示

基于 canvas 的五子棋完整功能实现

GitHub源码Demo演示

基于 canvas 的《是男人就下100层》小游戏完美实现

GitHub源码Demo演示

毛笔字书写田字格,可以写字

GitHub源码Demo演示

随心而动,随刃而行。输入文字显示动画粒子特效

GitHub源码Demo演示

鼠标移动炫彩小球

GitHub源码Demo演示

2048

GitHub源码Demo演示

贪吃蛇

GitHub源码Demo演示

看你有多色

GitHub源码Demo演示

坦克大战

GitHub源码Demo演示

宇宙行星旋转特效

GitHub源码Demo演示

支付宝咻咻咻动画特效

GitHub源码Demo演示

程序员表白代码

GitHub源码Demo演示

心形文字

GitHub源码Demo演示

照片墙

GitHub源码Demo演示

License

The code is available under theMIT license.

<marquee>不断更新,欢迎补充!</marquee>

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第1张

canvas 简介

<canvas>元素用于在网页上绘制图形。这是一个图形容器,您可以控制其每一像素,必须使用脚本来绘制图形。

<canvas>标记和 SVG 以及 VML 之间的一个重要的不同是,<canvas> 有一个基于 JavaScript 的绘图 API,而 SVG 和 VML 使用一个 XML 文档来描述绘图。

注意:IE 8 以及更早的版本不支持<canvas>元素。

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第2张

canvas 初体验

<canvas     height="450">
  Your browser does not support the Canvas API, Please upgrade your browser.
</canvas>

<script>
let myCanvas = document.getElementById('myCanvas');
let ctx = myCanvas.getContext('2d');

ctx.moveTo(100, 100);
ctx.lineTo(200, 200);
ctx.lineTo(200, 300);

ctx.stroke();
</script>

canvas 核心 API 讲解

建议大家看官方文档来系统的学习 canvas API,本文下面的例子只是对知识点的巩固。

颜色、样式和阴影

fillStylestrokeStyle

fillStyle 属性设置或返回用于填充绘画的颜色、渐变或模式。

strokeStyle 属性设置或返回用于笔触的颜色、渐变或模式。

// 用蓝色填充矩形
ctx.fillStyle="#0000ff";
ctx.fillRect(20,20,150,100);

// 渐变填充
var my_gradient=ctx.createLinearGradient(0,0,0,170);
my_gradient.addColorStop(0,"black");
my_gradient.addColorStop(1,"white");
ctx.fillStyle=my_gradient;
ctx.fillRect(20,20,150,100);

// 图像填充
var img=document.getElementById("lamp");
var pat=ctx.createPattern(img,"repeat");
ctx.rect(0,0,150,100);
ctx.fillStyle=pat;
ctx.fill();

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第3张

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第4张

shadowBlurshadowColor

shadowBlur 设置或返回用于阴影的模糊级别

shadowColor 设置或返回用于阴影的颜色

注释1:请将 shadowColor 属性与 shadowBlur 属性一起使用,来创建阴影。

注释2:请通过使用 shadowOffsetX 和 shadowOffsetY 属性来调节阴影效果。

ctx.shadowBlur=20;
ctx.shadowColor="black";
ctx.fillStyle="blue";
ctx.fillRect(20,20,100,80);

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第5张

createLinearGradient()createRadialGradient()

context.createLinearGradient(x0,y0,x1,y1)创建线性渐变

context.createRadialGradient(x0,y0,r0,x1,y1,r1)创建放射状/环形的渐变

注释:addColorStop(stop,color)方法与createLinearGradient()createRadialGradient()一起使用。

var my_gradient=ctx.createLinearGradient(0,0,0,170);
my_gradient.addColorStop(0,"black");
my_gradient.addColorStop(0.5,"red");
my_gradient.addColorStop(1,"white");
ctx.fillStyle=my_gradient;
ctx.fillRect(20,20,150,100);

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第6张
var grd=ctx.createRadialGradient(75,50,5,90,60,100);
grd.addColorStop(0,"red");
grd.addColorStop(1,"white");
ctx.fillStyle=grd;
ctx.fillRect(10,10,150,100);

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第7张
context.createPattern()

context.createPattern(image,"repeat|repeat-x|repeat-y|no-repeat")重复绘制元素,元素可以是图片、视频,或者其他 <canvas> 元素。

var img=document.getElementById("lamp");
var pat=ctx.createPattern(img,"repeat");
ctx.rect(0,0,150,100);
ctx.fillStyle=pat;
ctx.fill();

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第8张

线条样式

lineCap

context.lineCap="butt|round|square"

设置或返回线条的结束端点样式 (平直的边缘(默认)、圆形线帽、正方形线帽)

lineJoin

context.lineJoin="miter|bevel|round"

设置或返回两条线相交时,所创建的拐角类型 (尖角(默认)、斜角、圆角)

ctx.beginPath();
ctx.lineJoin="round";
ctx.moveTo(20,20);
ctx.lineTo(100,50);
ctx.lineTo(20,100);
ctx.stroke();

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第9张

lineWidth

ctx.lineWidth = 10

设置或返回当前的线条宽度,单位 px

矩形

rect()fillRect()strokeRect()

context.rect(x,y,width,height)创建矩形

context.fillRect(x,y,width,height)创建已填色的矩形,默认的填充颜色是黑色。

context.strokeRect(x,y,width,height)创建不填色的矩形,默认的笔触颜色是黑色。

// 红色矩形
ctx.beginPath();
ctx.lineWidth="6";
ctx.strokeStyle="red";
ctx.rect(5,5,290,140);
ctx.stroke();

clearRect()

clearRect() 在给定的矩形内清除指定的像素

// 在给定矩形内清空一个矩形
ctx.fillStyle="red";
ctx.fillRect(0,0,300,150);
ctx.clearRect(20,20,100,50);

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第10张

路径

提示:请使用这些方法来创建路径:moveTo()、lineTo()、quadricCurveTo()、bezierCurveTo()、arcTo() 以及 arc()。

fill()

填充当前的图像(路径)。默认颜色是黑色。

提示:请使用fillStyle属性来填充另一种颜色/渐变。

注释:如果路径未关闭,那么 fill() 方法会从路径结束点到开始点之间添加一条线,以关闭该路径,然后填充该路径。

// 绘制 150*100 像素的矩形,然后用绿色来给它填色:
ctx.rect(20,20,150,100);
ctx.fillStyle="green";
ctx.fill();

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第11张

stroke()

stroke() 方法会绘制出通过 moveTo() 和 lineTo() 方法定义的路径。默认颜色是黑色。

提示:请使用strokeStyle属性来绘制另一种颜色/渐变。

beginPath()

beginPath() 起始一条路径,或重置当前路径

closePath()

closePath() 创建从当前点回到起始点的路径

moveTo()lineTo()

moveTo() 把路径移动到画布中的指定点,不创建线条

lineTo() 添加一个新点,然后在画布中创建从该点到最后指定点的线条

ctx.beginPath();
ctx.moveTo(0,0);
ctx.lineTo(300,150);
ctx.stroke();

quadraticCurveTo()bezierCurveTo()

context.quadraticCurveTo(cpx,cpy,x,y);创建二次贝塞尔曲线

context.bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y);创建三次方贝塞尔曲线

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

image
ctx.beginPath();
ctx.moveTo(20,20);
ctx.bezierCurveTo(20,100,200,100,200,20);
ctx.stroke();

image

arc()arcTo()

context.arc(x,y,r,sAngle,eAngle[,counterclockwise]);创建弧/曲线(用于创建圆形或部分圆)

context.arcTo(x1,y1,x2,y2,r);创建两切线之间的弧/曲线

ctx.beginPath();
arc(100, 75, 50, 0*Math.PI, 1.5*Math.PI)
ctx.stroke();

image
ctx.beginPath();
ctx.moveTo(20,20);           // 创建开始点
ctx.lineTo(100,20);          // 创建水平线
ctx.arcTo(150,20,150,70,50); // 创建弧
ctx.lineTo(150,120);         // 创建垂直线
ctx.stroke();                // 进行绘制

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第12张

clip()

clip() 从原始画布剪切任意形状和尺寸的区域

// 剪切矩形区域
ctx.rect(50,20,200,120);
ctx.stroke();
ctx.clip();
// 在 clip() 之后绘制绿色矩形
ctx.fillStyle="green";
ctx.fillRect(0,0,150,100);

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第13张

isPointInPath()

isPointInPath() 如果指定的点位于当前路径中,则返回 true,否则返回 false

ctx.rect(20,20,150,100);
if (ctx.isPointInPath(20,50)) {
  ctx.stroke()
}

转换

scale()

scale() 缩放当前绘图至更大或更小

// 绘制矩形,放大到 200%,然后再次绘制矩形:
ctx.strokeRect(5,5,25,15);
ctx.scale(2,2);
ctx.strokeRect(5,5,25,15);

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第14张

rotate()

rotate() 旋转当前绘图

// 将矩形旋转 20 度:
ctx.rotate(20 * Math.PI / 180);
ctx.fillRect(50,20,100,50);

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第15张

translate()

translate() 重新定义画布上的 (0,0) 位置

ctx.fillRect(10,10,100,50);
ctx.translate(70,70);
ctx.fillRect(10,10,100,50);

!

超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等第16张

transform()setTransform()

context.transform(a,b,c,d,e,f);替换绘图的当前转换矩阵

context.setTransform(a,b,c,d,e,f);将当前转换重置为单位矩阵。然后运行 transform()

文本

fonttextAligntextBaseline

font 设置或返回文本内容的当前字体属性

textAlign 设置或返回文本内容的当前对齐方式

textBaseline 设置或返回在绘制文本时使用的当前文本基线

fillText()strokeText()measureText()

context.fillText(text, x, y, maxWidth);在画布上绘制被填充的文本

context.strokeText(text,x,y,maxWidth);在画布上绘制文本(无填充)

context.measureText(text).width;返回包含指定文本宽度的对象

ctx.font="30px Arial";
ctx.fillText("Hello World", 10, 50);
ctx.font="40px Arial";
// 创建渐变
var gradient=ctx.createLinearGradient(0, 0, myCanvas.width, 0);
gradient.addColorStop("0", "magenta");
gradient.addColorStop("0.5", "blue");
gradient.addColorStop("1.0", "red");
// 用渐变填色
ctx.strokeStyle=gradient;
ctx.strokeText("Hello World", 10, 90);

图像绘制

drawImage()

context.drawImage(img,x,y,width,height);向画布上绘制图像、画布或视频

var img=document.getElementById("tulip");
ctx.drawImage(img, 10, 10);

像素操作

widthheightdata

width 返回 ImageData 对象的宽度

height 返回 ImageData 对象的高度

data 返回一个对象,其包含指定的 ImageData 对象的图像数据

createImageData()getImageData()putImageData()

createImageData() 创建新的、空白的 ImageData 对象

getImageData() 返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据

putImageData() 把图像数据(从指定的 ImageData 对象)放回画布上

合成

context.globalAlpha = number;设置或返回绘图的当前 alpha 或透明值
context.globalCompositeOperation="source-in";设置或返回新图像如何绘制到已有的图像上

其他

save()restore()

save() 保存当前环境的状态
restore() 返回之前保存过的路径状态和属性

getContext

let cxt = Canvas.getContext('2d')

为不同的绘制类型(2d、3d)提供不同的环境,当前唯一支持的是2d环境

免责声明:文章转载自《超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PHPStorm--美化matlab gui edit text 多行输出下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Html 5 版 电子时钟

效果图: html 5 canvas元素  Html 5的canvas元素可以用于在网页上绘制图形[即canvas的作用]。 canvas画布使用JavaScript在网页上绘制图形 其拥有绘制各种路径,矩形,圆,字符以及添加图像的方法。 (1)在body中创建canvas元素 <canvas id="panel" width="500" heig...

WPFProgressBarAndSlider随位置显示Value

先来一发图,有图有真相。 核心代码如下 ProgressBar添加一个textBlock 绑定Value并且位置绑定进度条的实际宽度 <Canvas Margin="0 0 0 5"> <TextBlock x:Name="tb" TextWrapping="N...

控制Goroutine并发量的解决方案

前言 Go语言虽然开并发Goroutine特别简单,但是实际中如果不控制并发的数量会导致资源的浪费以及同时占用大量服务资源(http连接、数据库连接、文件句柄等)导致服务性能下降! 笔者之前总结过一篇在业务代码中控制并发数量的文章:Go控制协裎并发数量的用法及实际中的一个案例 ants库实现链接池的效果控制并发量 今天介绍另外一个控制并发数量的第三方库:a...

Android基础——广播(静态注册)

安卓版本高了就会有点问题,不能静态注册  令活动Main用来发广播,另一个接收器(不是Activity而是receiver)用来接收广播 注册文件 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/r...

AutoMapper(三)

返回总目录 自定义类型转换 有时,需要完全控制一个类型到另一个类型的转换。一个类型一点都不像另一个类型,而且转换函数已经存在了,在这种情况下,你想要从一个“宽松”的类型转换成一个更强壮的类型,例如一个string的源类型到一个int32的目标类型。 这里有两个类Source和Destination,要把前者映射到后者,代码如下: public class...

jboss8+EJB3+MDB Queue

1)在使用jboss8即WildFly进行MDB的试验时首先要在jboss8中配置jms 队列。      我使用的是修改配置文件的方式配置Jms Queue队列。      进入jboss8 安装目录的standaloneconfiguration文件夹下:      因为使用的是standalone-full.xml文件,所以将该文件的文件名修改为st...