关于canvas

news/2024/7/8 5:43:22 标签: canvas, 图形

canvas是h5的标签,该标签定义图形,比如图表和其他图像。该标签是行级元素。标签只是图形容器,必须使用脚本来绘制图形canvas标签是h5新增的标签,对于很多浏览器都具有兼容性,虽然具有兼容性,但通过canvas标签可以制作许多图形和好看的图表、图像以及一些动画效果,甚至可以只使用canvas标签来制作一款小游戏。在说canvas之前先说一说面向对象中的自定义事件。
我们都知道,无论是面向对象还是其他,DOM元素都具有一些事件,比如:onclick、onmousedown…等。这些都是系统自带的,若开发人员想要自己定义事件和自定义事件绑定该如何实现?那么,这次自定义事件或许对你会有一些帮助。那么,我们就用一些例子来和大家说一说自定义事件。
例:

<body>
    <div id="div"></div>
    <script>
        var div=document.getElementsByTagName("div")[0];
        function addEvent(element,type,fn){
            element.obj=element.obj||{};
            element.obj[type]=element.obj[type]||[];
            element.obj[type].push(fn);
        }
        function firEvent(element,type){
            var arr=element.obj[type];
            for(var i=0;i<arr.length;i++){
                arr[i]();
            }
        }
        addEvent(div,"abc",function(){...});
        fireEvent(div,"abc");
    </script>
    //JQuery
    $("#div").on("hello",function(){...});
    $("#div").trigger("hello");//绑定自定义事件
</body>

书归正传,接下来和大家来唠一唠canvas。我们依然还是以一个例子来解析一下canvas.
例:

<body>
<canvas id="canvas"></canvas>
<script>
        var canvas = document.getElementById('canvas');
        canvas.width = 500;
        canvas.height = 500;
        canvas.style.background = "hotpink";
        var ctx = canvas.getContext("2d");
        ctx.beginPath();
        ctx.moveTo(100,100);
        ctx.lineTo(400,400);
        ctx.closePath();
        ctx.strokeStyle = "yellow";
        ctx.lineWidth = "10";
        ctx.stroke();
        ctx.fillStyle="blue"
        ctx.fill();
</script>
</body>

以上面例子来解析一下canvas中各个语法和属性的含义。
canvas坐标系中,从最左上角的0,0开始,x向右增大,y向下增大
(1)wideth:设置canvas的宽。canvas的默认宽为300px。设置canvas的宽高只能通过canvas.width的方式来进行对canvas宽高的设置和修改。
(2)height:设置canvas的高。canvas的默认高为150px。
(3)getContext(“2d”):得到canvas的上下文场景(获得画布的控制权),2d表示为平面效果。若想要3d效果,则将2d设置成webgl.只有获得画布的控制权才可以在canvas画布上绘制。
(4)moveTo(x,y):设置绘制路径的起点,相当于移动画笔到某个位置
(5)lineTo(x,y):从上一点绘制一条直线到x,y这个坐标点
(6)stroke():描边,根据路径绘制线,路径只是草稿,真正绘制线必须执行stroke
(7)fill():填充,是将闭合的路径的内容填充具体的颜色
(8)lineWidth:绘制线的宽度
(9)beginPath():开始路径
(10)closePath():闭合路径
(11)strokeStyle:描边的样式
(12)fillStyle:填充的样式
下面通过几个案例来和大家看一下通过canvas绘制图形

例1:绘制表格

<canvas></canvas>
<script>
    var canvas=document.getElementsByTagName("canvas")[0];
    var ctx=canvas.getContext("2d");
    canvas.width=500;
    canvas.height=500;
    for(var i=0;i<=500;i+=25){
        ctx.moveTo(i,0);
        ctx.lineTo(i,500);
        ctx.moveTo(0,i);
        ctx.lineTo(500,i);
    }
    ctx.stroke();
</script>

效果图:
这里写图片描述
例2:
矩形1:

<canvas></canvas>
<script type="text/javascript">
            var canvas=document.getElementsByTagName("canvas")[0];
            var ctx=canvas.getContext("2d");
            canvas.width=500;
            canvas.height=500;
            ctx.rect(100,200,300,400);//rect(x,y,width,height),可以直接绘制矩形
            ctx.strokeStyle="black";
            ctx.stroke();
            ctx.fillStyle="aquamarine";
            ctx.fill();
</script>

矩形2

        <canvas></canvas>
    <script type="text/javascript">
        var canvas=document.getElementsByTagName("canvas")[0];
        var ctx=canvas.getContext("2d");
        canvas.width=500;
        canvas.height=500;
        ctx.strokeStyle="black";
        ctx.strokeRect(100,200,300,400);//绘制矩形路径的同时也描边
        ctx.fillStyle="aquamarine";
        ctx.fillRect(100,200,300,400);//绘制矩形路径的同时填充
    </script>

效果图:
这里写图片描述
例3:圆弧

<canvas></canvas>
<script type="text/javascript">
        var canvas=document.getElementsByTagName("canvas")[0];
        var ctx=canvas.getContext("2d");
        canvas.width=400;
        canvas.height=400;
        ctx.beginPath();
        ctx.arc(200,200,200,0,Math.PI/2,false);//arc(x,y,r:半径,sAngle:开始的角度,eAngle:结束角度,counterclockwise:是否是逆时针,true是逆时针,false是顺时针,默认为false),绘制圆弧
        ctx.stroke();
</script>

效果图:
这里写图片描述

例4:饼图

<canvas></canvas>
<script type="text/javascript">
        var data=[
        {
            value:0.1,
            color:"#9370db"
        },
        {
            value:0.3,
            color:"#6495ed"
        },
        {
            value:0.2,
            color:"#ffe4b5"
        },
        {
            value:0.3,
            color:"#f08080"
        },
        {
            value:0.1,
            color:"#556b2f"
        }
        ];
        var canvas=document.getElementsByTagName("canvas")[0];
        var ctx=canvas.getContext("2d");
        canvas.width=500;
        canvas.height=500;
         var start=0;
         var end=0;
         for(var i=0;i<data.length;i++){
            end=start+Math.PI*2*data[i].value;
            ctx.beginPath();
            ctx.moveTo(250,250);
            ctx.arc(250,250,200,start,end);
            ctx.fillStyle=data[i].color;
            ctx.fill();
            start=end;
         }
</script>

效果图:
这里写图片描述
通过canvas还可以绘制很多图形,大家可以自己回去试一试。


http://www.niftyadmin.cn/n/1202832.html

相关文章

Webpack 4教程:为什么要优化代码

2019独角兽企业重金招聘Python工程师标准>>> 转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 原文出处&#xff1a;https://wanago.io/2018/07/30/webpack-4-course-part-five-built-…

Node.js(一)

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型&#xff0c;使其轻量又高效。 一、模块 1、核心模块&#xff1a;node.exe文件中已经编译好了的模块 2、文件模块&#xff1a;根据业务需求来编写的 .js文件 …

Node.js(二)

由Node.js&#xff08;一&#xff09;可以得知&#xff0c;通过fs中的readFile和writeFile可以复制一个文件&#xff0c;但若是进行大文件的拷贝&#xff0c;使用readFile和writeFile会出现内存溢出问题&#xff0c;那又该如何解决呢&#xff1f;为了能够进行大文件的复制&…

Egg 2.19.0 发布,阿里开源的企业级 Node.js 框架

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; Egg 2.19.0 发布了&#xff0c;Egg 是阿里开源的企业级 Node.js 框架&#xff0c;为企业级框架和应用而生。团队的架构师和技术负责人可以非常容易地基于自身的技术架构在其基础上扩展出适合自身…

媒体查询--移动设备

随着技术的发展&#xff0c;时代的进步&#xff0c;智能手机已经成为了这个社会的最普遍的通讯设备。伴随着智能手机发展起来的移动端app也成为了这个时代的一个标志。身为一名IT行业人员&#xff0c;如今接触到的软件开发大多都已不再是PC端而是转向了移动端。移动端的出现方便…

chrome设置--disable-web-security解决跨域

我们可以通过使用chrome命令行启动参数来改变chrome浏览器的设置&#xff0c;具体的启动参数说明参考这篇介绍。https://code.google.com/p/xiaody/wiki/ChromiumCommandLineSwitches 这里介绍的是–disable-web-security参数。这个参数可以降低chrome浏览器的安全性&#xff…

Vue 中使用 jQuery

编译报错&#xff1a;$ is undefined or no-undef $ is not defined&#xff0c;or Jquery undefined 假设你已经使用vue-cli搭建好了开发的脚手架&#xff0c;接下来&#xff0c;看下面。。。 安装 jQuery&#xff0c;项目根目录下运行以下代码 npm install jquery --save …

脏读,不可重复读,幻读讲解

首先我们先讨论一下问题&#xff0c;是不是在ACID的保护下&#xff0c;数据就一定不会产生不一致的现象呢&#xff1f;在关系数据库库系统中&#xff0c;多个会话可以访问同一个数据库的同一个表的同一行&#xff0c;这样&#xff0c;对于数据而言&#xff0c;就意味着在同一个…