前端技术

Canvas的基本介绍及简单应用

2017-03-21  本文已影响0人  Ainy尘世繁花终凋落

神奇且强大的canvas

一.Canvas的基本介绍

1.什么是Canvas

定义:是HTML5提供的一种新标签, ie9才开始支持的,Canvas是一个矩形区域的画布,可以用JS控制每一个像素在上面绘画。canvas 标签使用 JavaScript 在网页上绘制图像,本身不具备绘图功能。canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。

2.Canvas主要应用的领域

1 可视化数据: 各类统计图表,比如:百度的echart

2 场景秀: 用Canvas实现动态的广告效果能够非常融洽的跨平台运行。如:手机中微产品.在移动端兼容性很好

3 游戏: canvas在基于Web的图像显示方面比Flash更加立体、更加精巧,canvas成为HTML5小游戏开发首选。现阶段h5做游戏,营业方式不是很明确. 25 超棒的 HTML5 Canvas 游戏

4 其他可嵌入网站的内容 (多用于活动页面、特效):类似图表、音频、视频,还有许多元素能够更好地与Web融合,并且不需要任何插件。

5 趋势=> 模拟器: 无论从视觉效果还是核心功能方面来说,模拟器产品可以完全由JavaScript来实现。模拟真实硬件环境,如移动端各种类型手机.

6 趋势=> 远程计算机控制: Canvas可以让开发者更好地实现基于Web的数据传输,构建一个完美的可视化控制界面。

7 趋势=> 图形编辑器: Photoshop图形编辑器将能够100%基于Web实现。

8 版本支持

最新标准:http://www.w3.org/TR/2dcontext/

稳定版本的标准:http://www.w3.org/TR/2013/CR-2dcontext-20130806/

3.Canvas绘制线条

01Canvas标签语法和属性

注意:

02 浏览器不兼容处理

4.Canvas绘图上下文context

01 Context:Canvas的上下文、绘制环境。

5.基本的绘制路径

5.1Canvas绘制的基本说明

  1. canvas坐标系,从最左上角0,0开始。x向右增大, y向下增大
  2. 绘制起点:ctx.moveTo(x, y); //x,y 都是相对于 canvas盒子的最左上角。
  3. 绘制终点:ctx.lineTo(x, y); //从x,y的位置绘制一条直线到起点或者上一个线头点。
  4. 开始路径:ctx.beginPath();作用:将当路径和之前路径隔离,方便你对当前路径进行设置样式,线宽.
  5. 闭合路径:ctx.closePath();作用:闭合路径会自动把最后的线头和开始的线头连在一起。
  6. 描边:ctx.stroke();

5.2Canvas绘制的基本步骤:

二.Canvas绘制的基本应用

2.1 Canvas绘制表格-背景

eg:
<script>
    //1.获取canvas和上下文
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    //2.设置常量
    var marginWH = 10;//表示每一个格子之间的空格距离
    //计算行和列
    var row = canvas.height / marginWH;
    var col = canvas.width / marginWH;
    /*
    * 绘制背景网格
    * */
    //3.绘制横线
    for(var i = 0;i<row;i++){
        ctx.moveTo(0,i * marginWH);
        ctx.lineTo(canvas.width,i * marginWH);
    };
    //绘制竖线
    for(var i = 0;i<col;i++){
        ctx.moveTo(i * marginWH,0);
        ctx.lineTo(i * marginWH,canvas.height);
    };
    //设置颜色
    ctx.strokeStyle = 'red';
    //设置线宽
    ctx.lineWidth = 0.5;
    //4.绘制 描边
    ctx.stroke();
    
</script>

2.2 Canvas绘制表格完成

eg:
<script>
    //1.获取canvas和上下文
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    //2.设置常量
    var marginWH = 10;
    //计算行和列
    var row = canvas.height / marginWH;
    var col = canvas.width / marginWH;
    /*
    * 绘制背景网格
    * */
    //3.绘制横线
    for(var i = 0;i<row;i++){
        ctx.moveTo(0,i * marginWH);
        ctx.lineTo(canvas.width,i * marginWH);
    };
    //绘制竖线
    for(var i = 0;i<col;i++){
        ctx.moveTo(i * marginWH,0);
        ctx.lineTo(i * marginWH,canvas.height);
    };
    //设置颜色
    ctx.strokeStyle = 'red';
    //设置线宽
    ctx.lineWidth = 0.5;
    //4.绘制 描边
    ctx.stroke();

    //5.绘制坐标轴
    //常量
    var x0 = 100, y0 = 500;//坐标原点
    var maxWidth = 500, maxHeight = 400;//坐标轴的长度
    //5.1横轴
    ctx.beginPath();
    ctx.moveTo(x0,y0);
    ctx.lineTo(x0 + maxWidth,y0);
    ctx.lineTo(x0 + maxWidth - marginWH,y0 - marginWH);

    ctx.moveTo(x0 + maxWidth,y0);
    ctx.lineTo(x0 + maxWidth - marginWH,y0 + marginWH);
    //设置颜色和线宽
    ctx.strokeStyle = 'blue';
    ctx.lineWidth = 5;
    //5.2绘制 描边
    ctx.stroke();

    //6.绘制竖坐标
    ctx.beginPath();
    ctx.moveTo(x0,y0);
    ctx.lineTo(x0,y0 - maxHeight);
    ctx.lineTo(x0 - marginWH,y0 - maxHeight + marginWH);

    ctx.moveTo(x0,y0 - maxHeight);
    ctx.lineTo(x0 +marginWH,y0 - maxHeight + marginWH);
    //设置颜色和线宽
    ctx.strokeStyle = 'blue';
    ctx.lineWidth = 5;
    //绘制 描边
    ctx.stroke();

    //7.绘制曲线
    //常量
    var data = [20, 50, 10, 60, 40, 80];
    //比例
    var w = maxWidth / data.length;
    var h = maxHeight / 100;//(1:100)设置比例
    //遍历
   //坐标点 类似于{x:20,y:30}
    var pointArr = [];
    for(var i = 0;i<data.length;i++){
        pointArr.push({
            x:x0 + w *(i+1),
            y: y0 - h * data[i]
        });
    }
    //遍历坐标点数组
    //开启路径
    ctx.beginPath();
    //起点
    ctx.moveTo(x0,y0);
    for(var i = 0;i<pointArr.length;i++){
        //终点
        ctx.lineTo(pointArr[i].x,pointArr[i].y);
    };
    //设置颜色和线宽
    ctx.strokeStyle = 'green';
    ctx.lineWidth = 2;

    //绘制 描边
    ctx.stroke();
    
</script>

2.3Canvas绘制画板

eg:
<script>
    //1.获取canvas和上下文
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    //2.监听鼠标的移动
    canvas.onmousedown = function (event){
        //清屏操作
        ctx.clearRect(0,0,canvas.width,canvas.height);
        //开启路径
        ctx.beginPath();
        //起点
        ctx.moveTo(event.offsetX, event.offsetY);
        canvas.onmousemove = function (event){
            //终点
            ctx.lineTo(event.offsetX, event.offsetY);

            //设置颜色和线宽
            ctx.strokeStyle = 'red';
            ctx.lineWidth = 5;
            //绘制 描边
            ctx.stroke();
        };
        canvas.onmouseup = function (){
            canvas.onmousemove = null;
            canvas.onmouseup = null;
        };

    };

2.4Canvas绘制矩形

1.方式1:先设置rect()方法,然后设置样式,再描绘ctx.stroke();

注意:

2.方式2:快速创建描边矩形和填充矩形

3.清除矩形(clearRect)

2.5Canvas绘制弧线

2.51 绘制圆形(arc)

01 arc()方法说明:

三角函数的补充:

圆形上面的点的坐标的计算公式:

eg:
<script>
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');

    //2.绘制图片  方式一  标签绘制
    /*var img = document.getElementById('img');
    //注意:图片一定要在加载完成后再进行绘制
    //x,y 绘制图片左上角的坐标,在画布上绘制的坐标点 img是绘制图片的dom对象。
    img.onload = function (){
        ctx.drawImage(img,100,100);
    }*/

    //3.绘制图片 方式二 对象绘制
    /*var image = new Image();
    image.src = 'images/img_01.jpg';
    image.addEventListener('load',function(){
        ctx.drawImage(image,100,100);
    });*/

    //4.绘制图片  方式三 对象绘制   等比例
    /*var image = new Image();
    image.src = 'images/img_01.jpg';
    image.addEventListener('load',function (){
        //等比公式  w / h = 图片的宽/ 图片的高;
        var w = 200;
        var h = w * image.height / image.width;
        ctx.drawImage(image,w,h);
    });*/

    //5.图片截取
    //方法:context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);
    var image1 = new Image();
    image1.src = 'images/img_01.jpg';
    image1.addEventListener('load',function (){
        //img:截取图片
        //50,50,120,120  表示截取的x,y, 截取的宽和高
        //200,200,120,120  表示在画布上的x,y和宽高
        ctx.drawImage(image1,50,50,120,120,200,200,120,120);
    });
    
</script>

2.12Canvas绘制帧动画

eg:
<body style="padding: 100px">
<canvas id="canvas" width="900" height="600" style="border: 1px solid #000;"></canvas>
<!--![](images/img_01.jpg)-->
<button dir=2>上</button>
<button dir=6>下</button>
<button dir=0>左</button>
<button dir=4>右</button>
<p></p>
<script>
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');

    //2.绘制图片
    var image = new Image();
    image.src = 'images/girl.png';
    //常量
    var clipWH = 256;
    var index = 0;//累加的变量

    var dir = 0;//设置默认的方向为0;
    image.addEventListener('load',function (){
        //记录this
        var that = this;
        //开启定时器
        setInterval(function (){
            //清屏
            ctx.clearRect(0,0,canvas.width,canvas.height);
            ctx.drawImage(that,index*clipWH,dir*clipWH,clipWH,clipWH,200,200,clipWH,clipWH);
            //累加
            index++;
            //取余---让其无限的循环//让他永远等于 0-7
            index %= 8;
        },200);

    });

    //点击按钮,切换动画
    //获取所有的按钮,根据字符串,获取所有的子元素
    var buttonList = document.querySelectorAll('button');
    for(var i= 0;i<buttonList.length;i++){
        //给所有的按钮添加点击事件
        buttonList[i].addEventListener('click',function (){
            //获取按钮中的dir中的值
            dir = this.getAttribute('dir');
        });
    }
</script>
上一篇 下一篇

猜你喜欢

热点阅读