Canvas

Canvas入门

1、 canvas简介

canvas 是什么?

是HTML5中重要的元素,和audio、video元素类似完全不需要任何外部插件就能够运行.
Canvas中文翻译就是”画布”.它提供了强大的图形的处理功能(绘制,变换,像素处理…)。
但是需要注意,canvas 元素本身并不绘制图形,它只是相当于一张空画布。如果开发者需要向 canvas 上绘制图形,则必须使用 JavaScript 脚本进行绘制。

canvas能做什么?

  • 基础图形的绘制
  • 文字的绘制
  • 图形的变形和图片的合成
  • 图片和视频的处理
  • 动画的实现
  • 小游戏的制作

支持的浏览器

大多数现代浏览器都是支持Canvas的,比如 Firefox, safari, chrome, opera的最近版本以及IE9都支持。 IE8及以下不支持HTML5,但是我们可以进行提示用户更新到最新的版本。

入门案例

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <style type="text/css">
  html,body{
   margin: 0px;
  }
  canvas{
   background: #ccc;
  }
 </style>
</head>
<body>
 <canvas id="canvas_1">
  我们在设置 canvas 之前需要首先监测用户电脑是否支持 canvas
 </canvas>
</body>
<script type="text/javascript">
 var canvas_1 = document.getElementById("canvas_1");
 // 设置宽度和高度,但是这种写法会造成额外的问题
 // 画布会拉伸
 // canvas_1.style.width = "500px";
 // canvas_1.style.height = "500px";

 // 所以推荐写法
 // 1.使用内联样式表
 // 2.去使用点(.)
 canvas_1.width = "500"; //注意,不要加 px
 canvas_1.height = "500";

</script>
</html>

2、 绘制直线

  • 线的起点
  • 线的终点
  • 线的颜色
  • 线的宽度

方法 方法
beginPath() 开始定义路径
closePath() 关闭前面定义的路径
moveTo(float x,float y) 把 canvas 的当前路径的结束点移动到 x, y 对应的点
lineTo(float x,float y) 把 canvas 的当前路径从当前结束点连接到 x , y 对应的点

方法说明
beginPath()开始定义路径
closePath()关闭前面定义的路径
moveTo(float x,float y)把 canvas 的当前路径的结束点移动到 x, y 对应的点
beginPath()开始定义路径
lineTo(float x,float y)把 canvas 的当前路径从当前结束点连接到 x , y 对应的点
fill()填充 canvas 当前路径
stroke()填充 canvas 当前路径绘制边框
fillStyle()设置填充 canvas 路径所使用的填充风格
strokeStyle()设置绘制 canvas 路径的填充风格
lineWidth()设置笔触线条的宽度
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div>
        <canvas id="canvas_1" width="1000" height="500" style="box-shadow: 0px 0px 20px black;">
            当前浏览器不支持 canvas
        </canvas>
    </div>
</body>
<script type="text/javascript">
    // 获取 canvas 元素对应的 DOM 对象
    var canvas_1 = document.getElementById("canvas_1");
    // 获取在 canvas 上绘图的 canvasRenderingContent2D 对象
    var ctx = canvas_1.getContext("2d");
    // 打印一下,查看是否能够显示具体环境
    console.log(ctx);
    // 开始绘制
    ctx.beginPath();
    //设置绘制起点
    ctx.moveTo(100,100);
    //设置绘制下一个点
    ctx.lineTo(700,400);
    //设置绘制下一个点
    ctx.lineTo(400,100);
    //设置绘制下一个点
    ctx.lineTo(600,500);
    //结束绘制
    ctx.closePath();
    //设置线的宽度
    ctx.lineWidth = 10;
    //设置绘制的样式
    ctx.strokeStyle = "red";
    //绘制点之间的线路
    ctx.stroke();
    // 设置填充样式
    ctx.fillStyle = "green";
    // 填充当前视图
    ctx.fill();
    // 注意:所有的绘制相应属性全部应该放在 closePath 之前
</script>
</html>

3、 绘制矩形

--
strokeRect(float x,float y,float width,float height)绘制一个矩形边框
fillRect(float x,float y,float width,float height)填充一个矩形边框
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div>
        <h2>绘制矩形</h2>
        <canvas id="canvas_1" width="1000" height="500" style="box-shadow: 0px 0px 20px black;">
            当前浏览器不支持 canvas
        </canvas>
    </div>
</body>
<script type="text/javascript">
    // 获取 canvas 元素对应的 DOM 对象
    var canvas_1 = document.getElementById("canvas_1");
    // 获取在 canvas 上绘图的 canvasRenderingContent2D 对象
    var ctx = canvas_1.getContext("2d");
    // 设置填充颜色
    ctx.fillStyle = '#f00';
    // 填充一个矩形
    ctx.fillRect(30,20,120,60);
    // 设置填充颜色
    ctx.fillStyle = '#ff0';
    // 填充一个矩形
    ctx.fillRect(80,60,120,60);
    // 设置填充颜色
    ctx.strokeStyle = '#00f';
    // 填充一个矩形
    ctx.strokeRect(30,130,120,60);
    // 设置线条宽度
    ctx.lineWidth = 20;
    // 设置线条宽度
    ctx.lineJoin = "round";
    // 设置填充颜色
    ctx.strokeStyle = '#0ff';
    // 填充一个矩形
    ctx.strokeRect(80,160,120,60);
    // 设置线条宽度
    ctx.lineJoin = "bevel";
    // 设置填充颜色
    ctx.strokeStyle = '#f0f';
    // 填充一个矩形
    ctx.strokeRect(130,190,120,60);
    ctx.storke();
</script>
</html>

4、 绘制字符串

--
fillText(String Text, float x, float y, [float maxWidth])填充字符串
strokeText(String Text, float x, float y, [float maxWidth])绘制字符串边框
textAlign设置绘制字符串的水平对齐方式(start、end、left、right、center等)
textBaseAlign设置绘制字符串的垂直对齐方式(top、hanging、middle、alphabetic、idecgraphic、bottom 等)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div>
        <h2>绘制文字</h2>
        <canvas id="canvas_1" width="1000" height="500" style="box-shadow: 0px 0px 20px black;">
            当前浏览器不支持 canvas
        </canvas>
    </div>
</body>
<script type="text/javascript">
    // 获取 canvas 元素对应的 DOM 对象
    var canvas_1 = document.getElementById("canvas_1");
    // 获取在 canvas 上绘图的 canvasRenderingContent2D 对象
    var ctx = canvas_1.getContext("2d");
    ctx.fillStyle = '#00f';
    ctx.font = 'italic 50px 隶书';
    ctx.textBaseline = 'top';
    //填充字符串
    ctx.fillText('汪先生真是帅',0,0);
    ctx.strokeStyle = 'f0f';
    ctx.font = 'bold 45px 宋体';
    // 绘制字符串的边框
    ctx.strokeText('汪先生我爱你',0,50,200);
</script>
</html>

5、 设置阴影

--
shadowBlur设置阴影的模糊程度。该值是一个浮点数,该数值越大,阴影的模糊程度也就越大。
shadowColor设置阴影的颜色。
shadowOffsetX设置阴影在 X 方向的偏移
shadowOffsetY设置阴影在 Y 方向的偏移
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div>
        <h2>绘制文字</h2>
        <canvas id="canvas_1" width="1000" height="500" style="box-shadow: 0px 0px 20px black;">
            当前浏览器不支持 canvas
        </canvas>
    </div>
</body>
<script type="text/javascript">
    // 获取 canvas 元素对应的 DOM 对象
    var canvas_1 = document.getElementById("canvas_1");
    // 获取在 canvas 上绘图的 canvasRenderingContent2D 对象
    var ctx = canvas_1.getContext("2d");
    // 设置阴影的模糊程度
    ctx.shadowBlur = 5.6;
    // 设置阴影的颜色
    ctx.shadowColor = '#222';
    // 设置阴影在 X,Y 方向的偏移
    ctx.shadowOffsetX = 10;
    ctx.shadowOffsetY = -6;
    ctx.fillStyle = '#00f';
    ctx.font = 'italic 50px 隶书';
    ctx.textBaseline = 'top';
    //填充字符串
    ctx.fillText('汪先生真是帅',0,0);
    ctx.strokeStyle = 'f0f';
    ctx.font = 'bold 45px 宋体';
    // 绘制字符串的边框
    ctx.strokeText('汪先生我爱你',0,50,200);
</script>
</html>

6、 画圆

在这里插入图片描述
context.arc(x,y,r,sAngle,eAngle,counterclockwise);

--
x圆的中心的 x 坐标。
y圆的中心的 y 坐标。
r圆的半径。
sAngle起始角,以弧度计。(弧的圆形的三点钟位置是 0 度)。
eAngle结束角,以弧度计。
counterclockwise可选。规定应该逆时针还是顺时针绘图。False = 顺时针(默认),true = 逆时针。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <title>绘制圆形</title>
    <style type="text/css">
        .divContent {
            display: inline-block;
            width: 200px;
            height: 200px;
            background-color: #333333;
            margin-left: 200px;
        }
    </style>
    <!-- JQuery CDN-->
    <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script type="module">
        /**画第一个圆形----非动画版
         * */
        let drawArc1 = function () {
            /**获取画布*/
            let canvas = document.getElementById("myCanvas");
            /**
             * 动态设置画布的宽、高。注意 Canvas 的 width、height的值只能是纯数字,不能带单位
             * 如下所示,让画布填充父元素
             * @type {void|string|XML|*|jQuery}
             */
            canvas.width = $(".divContent").css("width").replace("px", "");
            canvas.height = $(".divContent").css("height").replace("px", "");
            /**获取画布上下文*/
            let ctx = canvas.getContext("2d");
            /**1)设置画笔颜色,不设置时默认为黑色
             * strokeStyle 属性设置或返回画笔的颜色、渐变或模式*/
            ctx.strokeStyle = "#fff";
            /**2)开始一条新路径
             * beginPath() 方法开始一条路径,或重置当前的路径*/
            ctx.beginPath();
            /**3)创建弧线/曲线
             * 圆心的位置为画布的中心,圆形半径为 50 像素(不能带单位)
             * 起始角度为 0,即 x 轴的正方向,结束角度为 360度*/
            ctx.arc(canvas.width / 2, canvas.height / 2, 50, 0, 2 * Math.PI);
            /**4)绘制定义好的路径
             * stroke() 方法实际地绘制路径*/
            ctx.stroke();
        };
        /**画第二个圆—————动画版
         * eAngle:圆形结束的角度,会动态变化达到动画的效果
         * canvas:画布,作为参数传入,避免每次重复获取
         * ctx:画布上下文,作为参数传入,避免每次重复获取
         */
        let eAngle = 0;
        let drawArc2 = function (canvas, ctx) {
            /**
             * 动态设置画布的宽、高。注意 Canvas 的 width、height的值只能是纯数字,不能带单位
             * 如下所示,让画布填充父元素
             * 为画布设置宽(width)与高(height),它会先清除整个画布内所有的旧像素
             * 相当于调用 context.clearRect(0,0,canvas.width,canvas.height); 方法
             * 如果每次需要重新渲染,则需要清除旧像素;如果是叠加绘图,则不需要清除旧像素
             * */
            canvas.width = $(".divContent").css("width").replace("px", "");
            canvas.height = $(".divContent").css("height").replace("px", "");
            /**1)设置画笔颜色,不设置时默认为黑色
             * strokeStyle 属性设置或返回画笔的颜色、渐变或模式*/
            ctx.strokeStyle = "#fff";
            /**2)开始一条新路径
             * beginPath() 方法开始一条路径,或重置当前的路径*/
            ctx.beginPath();
            /**3)创建弧线/曲线
             * true 表示逆时针绘制,false 或者不写为顺时针*/
            ctx.arc(canvas.width / 2, canvas.height / 2, 50, 0, eAngle, true);
            /**4)绘制定义好的路径
             * stroke() 方法实际地绘制路径*/
            ctx.stroke();
            /**
             * 将结束角度 + 0.1,然后如果已经达到 360度,则归零
             * 使用 requestAnimationFrame 实现帧动画,每秒约 60 次的循环回调 drawArc2 方法
             * @type {number}
             */
            eAngle = eAngle + 0.1;
            if (eAngle >= 2 * Math.PI) {
                eAngle = 0;
            }
            /**帧动画回调*/
            requestAnimationFrame(function () {
                drawArc2(canvas, ctx);
            });
        };
        $(function () {
            drawArc1();
            /**获取画布*/
            const canvas = document.getElementById("myCanvas2");
            /**获取画布上下文*/
            const ctx = canvas.getContext("2d");
            drawArc2(canvas, ctx);
        });
    </script>
</head>
<body>
<div class="divContent">
    <canvas id="myCanvas">
        浏览器不支持 Canvas
    </canvas>
</div>
<div class="divContent">
    <canvas id="myCanvas2">
        浏览器不支持 Canvas
    </canvas>
</div>
</body>
</html>

7、 矩形

context.rect(x,y,width,height);

--
x矩形左上角的 x 坐标。
y矩形左上角的 y 坐标。
r圆的半径。
width矩形的宽度,以像素计,所以不需要,也不能再带单位)。
height矩形的高度,以像素计,所以不需要,也不能再带单位。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <title>绘制矩形</title>
    <style type="text/css">
        .divContent {
            display: inline-block;
            width: 300px;
            height: 300px;
            background-color: #333333;
            margin-left: 100px;
        }
    </style>
    <!-- JQuery CDN-->
    <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script type="module">
        /**画第一个九宫格矩形
         * canvas:画布在整个过程中是不变的,所以作为参数传入,避免重复获取
         * ctx:画布上下文
         */
        let drawRect1 = function (canvas, ctx) {
            /**矩形绘制的颜色*/
            let colorArrays = [
                "#FFCC66", "#CC00FF", "#996633",
                "#3366CC", "#330000", "#FFFF66",
                "#000099", "#FF3300", "#007700"
            ];
            /**每个单元格矩形的颜色索引*/
            let index = 0;
            for (let i = 0; i < 3; i++) {
                for (let j = 0; j < 3; j++) {
                    /**其它的内容都是辅助,真正绘制矩形的核心代码就是下面 3 步*/
                    /**1)beginPath() 方法开始一条路径,或重置当前的路径。比如 矩形、圆形等*/
                    ctx.beginPath();
 
                    /**2)lineWidth 属性设置或返回当前线条的宽度,以像素计,不能再带单位。
                     * strokeStyle:设置画笔当前的颜色
                     * */
                    ctx.lineWidth = "2";
                    ctx.strokeStyle = colorArrays[index++];
                    /**3)rect() 方法创建矩形,起点坐标动态改变,长宽为画布的三分之一
                     *      这样的就是一个九宫格,而且随着画布尺寸的变化而变化
                     * stroke() 实际绘制已定义的路径*/
                    ctx.rect(j * canvas.width / 3,
                        i * canvas.height / 3,
                        canvas.width / 3,
                        canvas.height);
                    ctx.stroke();
 
                }
            }
        };
 
        /**画第一个九宫格矩形
         * canvas:画布在整个过程中是不变的,所以作为参数传入,避免重复获取
         * ctx:画布上下文
         */
        let drawRect2 = function (canvas, ctx) {
            /**矩形绘制的颜色*/
            let colorArrays = [
                "#FFCC66", "#CC00FF", "#996633",
                "#3366CC", "#330000", "#FFFF66",
                "#000099", "#FF3300", "#007700"
            ];
            /**这里用于随机切换一下两个单元格的颜色*/
            let x = 0, y = 0;
            while (x == y) {
                x = Math.round(Math.random() * 8);
                y = Math.round(Math.random() * 8);
            }
            let temp = colorArrays[x];
            colorArrays[x] = colorArrays[y];
            colorArrays[y] = temp;
 
            let index = 0;
            for (let i = 0; i < 3; i++) {
                for (let j = 0; j < 3; j++) {
                    /**其它的内容都是辅助,真正绘制矩形的核心代码就是下面 3 步*/
                    /**1)beginPath() 方法开始一条路径,或重置当前的路径。比如 矩形、圆形等*/
                    ctx.beginPath();
                    /**2)lineWidth 属性设置或返回当前线条的宽度,以像素计,不能再带单位。
                     * strokeStyle:设置画笔当前的颜色
                     * */
                    ctx.lineWidth = "2";
                    ctx.fillStyle = colorArrays[index++];
                    /**3)rect() 方法创建矩形,起点坐标动态改变,长宽为画布的三分之一
                     *      这样的就是一个九宫格,而且随着画布尺寸的变化而变化
                     * stroke() 实际绘制已定义的路径*/
                    ctx.rect(j * canvas.width / 3,
                        i * canvas.height / 3,
                        canvas.width / 3,
                        canvas.height);
                    ctx.fill();
                }
            }
            setTimeout(function () {
                drawRect2(canvas, ctx);
            }, 1000);
        };
 
        $(function () {
            /**获取第一张画布*/
            let canvas1 = document.getElementById("myCanvas1");
            /**为画布设置宽(width)与高(height),它会先清除整个画布内所有的旧像素
             * 相当于调用 context.clearRect(0,0,canvas.width,canvas.height); 方法
             * 如果每次需要重新渲染,则需要清除旧像素;如果是叠加绘图,则不需要清除旧像素
             * */
            canvas1.width = $(".divContent").css("width").replace("px", "");
            canvas1.height = $(".divContent").css("height").replace("px", "");
            /**获取画布上下文*/
            let ctx1 = canvas1.getContext("2d");
            drawRect1(canvas1, ctx1);
            /**获取第二张画布*/
            let canvas2 = document.getElementById("myCanvas2");
            canvas2.width = $(".divContent").css("width").replace("px", "");
            canvas2.height = $(".divContent").css("height").replace("px", "");
            /**获取画布上下文*/
            let ctx2 = canvas2.getContext("2d");
            drawRect2(canvas2, ctx2);
        });
    </script>
</head>
<body>
<div class="divContent">
    <canvas id="myCanvas1">
        浏览器不支持 Canvas
    </canvas>
</div>
<div class="divContent">
    <canvas id="myCanvas2">
        浏览器不支持 Canvas
    </canvas>
</div>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值