canvas详解00-认识canvas

news2025/1/16 8:49:11

身为一个WEB开发人员,肯定都是想着能够开发出酷炫和激动人心的应用程序来。可以很多动画特效,例如黑客帝国的数字,彩色炫酷的例子动效。也可以实现各种图画面板,如实现类似于photoshop的web在线图像编辑。各种酷炫的表单等等。

#案例

画布是H5中一个重要的概念,它面向开发人员提供了非常底层的绘图接口,使得绘制速度可以大幅提高,这对游戏等领域极为重要。

本次课程中将非常系统和全面的详解canvas的各种属性和项目中的应用。并且以实战的案例如刮刮卡、抽奖转盘、表单饼图、画板、粒子特效等案例帮助大家真正掌握canvas并能写出各种特效和动画。

#canvas元素

<canvas id="tutorial" width="150" height="150"></canvas>

canvas看起来和 img 元素很相像,唯一的不同就是它并没有 src 和 alt 属性。实际上,canvas 标签只有两个属性**——** width和height。这些都是可选的,并且同样利用 DOM properties 来设置。

当没有设置宽度和高度的时候,canvas 会初始化宽度为 300 像素和高度为 150 像素。该元素可以使用CSS来定义大小,但在绘制时图像会伸缩以适应它的框架尺寸:如果 CSS 的尺寸与初始画布的比例不一致,它会出现扭曲。

如果你绘制出来的图像是扭曲的,尝试用 width 和 height 属性为canvas明确规定宽高,而不是使用 CSS。

id属性并不是canvas元素所特有的,而是每一个 HTML 元素都默认具有的属性(比如 class 属性)。给每个标签都加上一个 id 属性是个好主意,因为这样你就能在我们的脚本中很容易的找到它。

canvas元素可以像任何一个普通的图像一样(有margin,border,background等等属性)被设计。然而,这些样式不会影响在 canvas 中的实际图像。我们将会在一个专门的章节里看到这是如何解决的。当开始时没有为 canvas 规定样式规则,其将会完全透明。

#替换内容

canvas元素与img标签的不同之处在于,就像video,audio,或者 picture元素一样,很容易定义一些替代内容。由于某些较老的浏览器(尤其是 IE9 之前的 IE 浏览器)或者文本浏览器不支持 HTML 元素"canvas",在这些浏览器上你应该总是能展示替代内容。

这非常简单:我们只是在canvas标签中提供了替换内容。不支持canvas的浏览器将会忽略容器并在其中渲染后备内容。而支持canvas的浏览器将会忽略在容器中包含的内容,并且只是正常渲染 canvas。

举个例子,我们可以提供对 canvas 内容的文字描述或者是提供动态生成内容相对应的静态图片,如下所示:

<canvas id="stockGraph" width="150" height="150">
  current stock price: $3.15 +0.15
</canvas>

<canvas id="clock" width="150" height="150">
  <img src="images/clock.png" width="150" height="150" alt=""/>
</canvas>

#结束标签不可省

与 img元素不同,canvas 元素需要结束标签 (</canvas>)。如果结束标签不存在,则文档的其余部分会被认为是替代内容,将不会显示出来。

如果不需要替代内容,一个简单的<canvas id="foo" ...></canvas>在所有支持 canvas 的浏览器中都是完全兼容的。

#渲染上下文(The rendering context)

<canvas> 元素创造了一个固定大小的画布,它公开了一个或多个渲染上下文,其可以用来绘制和处理要展示的内容。我们将会将注意力放在 2D 渲染上下文中。其他种类的上下文也许提供了不同种类的渲染方式;比如, WebGL 使用了基于OpenGL ES的 3D 上下文 ("webgl") 。

canvas 起初是空白的。为了展示,首先脚本需要找到渲染上下文,然后在它的上面绘制。<canvas> 元素有一个叫做 getContext() 的方法,这个方法是用来获得渲染上下文和它的绘画功能。getContext()接受一个参数,即上下文的类型。对于 2D 图像而言,如本教程,你可以使用 CanvasRenderingContext2D。

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

代码的第一行通过使用 document.getElementById() 方法来为<canvas>元素得到 DOM 对象。一旦有了元素对象,你可以通过使用它的 getContext() 方法来访问绘画上下文。

#检查支持性

替换内容是用于在不支持<canvas>标签的浏览器中展示的。通过简单的测试 getContext() 方法的存在,脚本可以检查编程支持性。上面的代码片段现在变成了这个样子:

var canvas = document.getElementById('tutorial');

if (canvas.getContext){
  var ctx = canvas.getContext('2d');
  // drawing code here
} else {
  // canvas-unsupported code here
}

#一个模板骨架

这里的是一个最简单的模板,我们之后就可以把它作为之后的例子的起点。

<html>
  <head>
    <title>Canvas tutorial</title>
    <script type="text/javascript">
      function draw(){
        var canvas = document.getElementById('tutorial');
        if (canvas.getContext){
          var ctx = canvas.getContext('2d');
        }
      }
    </script>
    <style type="text/css">
      canvas { border: 1px solid black; }
    </style>
  </head>
  <body onload="draw();">
    <canvas id="tutorial" width="150" height="150"></canvas>
  </body>
</html>

上面的脚本中包含一个叫做 draw() 的函数,当页面加载结束的时候就会执行这个函数。通过使用在文档上加载事件来完成。只要页面加载结束,这个函数,或者像是这个的,同样可以使用 window.setTimeout()(en-US), window.setInterval()(en-US),或者其他任何事件处理程序来调用。

模板看起来会是这样。如这里所示,它最初是空白的。

#一个简单例子

一开始,让我们来看个简单的例子,我们绘制了两个有趣的长方形,其中的一个有着 alpha 透明度。我们将在接下来的例子里深入探索一下这是如何工作的。

<html>
  <head>
    <script type="application/javascript">
      function draw() {
        var canvas = document.getElementById("canvas");
        if (canvas.getContext) {
          var ctx = canvas.getContext("2d");

          ctx.fillStyle = "rgb(200,0,0)";
          ctx.fillRect (10, 10, 55, 50);

          ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
          ctx.fillRect (30, 30, 55, 50);
        }
      }
    </script>
  </head>
  <body onload="draw();">
    <canvas id="canvas" width="150" height="150"></canvas>
  </body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/678714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

专项练习10

目录 一、选择题 1、执行以下程序&#xff0c;下列说法中&#xff0c;正确的是&#xff08;&#xff09; 2、下面有关JavaScript中系统方法的描述&#xff0c;错误的是&#xff1f; 3、以下 JavaScript 代码&#xff0c;在浏览器中运行的结果是 4、假设DOM结构为 二、编程题 …

[ruby on rails] rails中使用graphQL

1. 添加gem gem graphql’是主要提供server的, gem graphiql-rails’是用来生成一个graphiql查询页面IDE,自己用来测试的group :development dogem graphiql-rails endgem graphql2.使用命令生成模板文件 rails g graphql:install在API only中,routes不会自动填充graphiql路…

chatgpt赋能python:Python的下载方法——从官网到第三方渠道

Python的下载方法——从官网到第三方渠道 Python 是一种翻译式、面向对象的、动态数据类型的高级程序设计语言&#xff0c;被广泛应用于数据分析、人工智能、物联网等领域。相信大多数程序员都知道 Python&#xff0c;并且使用它编写程序。那么&#xff0c;如何下载 Python&am…

人工智能(1):机器学习工作流程

1 什么是机器学习 机器学习是从数据中自动分析获得模型&#xff0c;并利用模型对未知数据进行预测。 2 机器学习工作流程 机器学习工作流程总结 1 获取数据 2 数据基本处理 3 特征工程 4 机器学习(模型训练) 5 模型评估 结果达到要求&#xff0c;上线服务没有达到要求&a…

程序编译连接加载过程详解

程序加载过程详解 可重定位的elf文件格式简介 首先我们打开目标文件看一下 上面的图就是目标文件的格式了&#xff0c;这里使用的是010editer&#xff0c;这个二进制编辑器很好用 可以看到大致分为三部分&#xff0c;首先是header&#xff0c;然后是sectionheader&#xff0…

MIT 6.S081 (BOOK-RISCV-REV1)教材第四章内容 -- Trap -- 下

MIT 6.S081 教材第四章内容 -- Trap -- 下 引言从内核空间陷入页面错误异常Page Fault BasicsLazy page allocationZero Fill On DemandCopy On Write ForkDemand PagingMemory Mapped Files 真实世界 引言 MIT 6.S081 2020 操作系统 本文为MIT 6.S081课程第四章教材内容翻译…

Windows编译OpenSSL Win10系统 vs2010

近期因为项目需要&#xff0c;需要用到openssl动态库&#xff0c;现在将编译的过程记录一下&#xff1b; 操作系统&#xff1a;Win10 64位 编译器&#xff1a;VS2010 编译步骤如下&#xff1a; 1、下载openssl版本&#xff08;下载地址&#xff1a;​http://www.openssl.or…

chatgpt赋能python:Python分割——字符串处理中的必备技能

Python分割——字符串处理中的必备技能 如果你曾经遇到过需要将一个字符串根据一定规则切割成多个子串的情况&#xff0c;那么你一定会发现&#xff0c;Python中的分割功能能够让这个任务变得非常简单。 什么是Python分割&#xff1f; Python中的分割是指将一个字符串根据特…

端午节安康,佬们都了解端午节的哪些知识呢(附粽子大作战小游戏)

前言&#xff1a; 端午节假期&#xff0c;首先祝各位小伙伴儿们端午节安康。参考了一些资料&#xff0c;本篇文章将和大家分享关于端午节的由来&#xff0c;习俗&#xff0c;以及关于端午节的一个代码小游戏–粽子大作战。 希望大家看完此篇文章能对端午节有收获&#xff0c;也…

如何在gitee上托管项目

1、如果想要将一个项目托管到gitee上,第一步找到gitee官网&#xff1a; https://gitee.com/?utm_sourcebaidu&utm_mediumsem&utm_termgitee%CB%BD%D3%D0%B2%BF%CA%F0&utm_campaignenterprise&utm_contentcompetition&wl_kwid260644677393&wl_creativ…

chatgpt赋能python:用Python绘制区域图,探索数据背后的故事

用Python绘制区域图&#xff0c;探索数据背后的故事 随着大数据时代的到来&#xff0c;数据可视化变得越来越受到重视。而区域图&#xff08;Area chart&#xff09;是一种常用的数据可视化图表类型之一。它可以说明一个数量随着时间的变化而发生的趋势&#xff0c;以及各类数…

chatgpt赋能python:Python的不确定尾数:如何处理和解决?

Python的不确定尾数&#xff1a;如何处理和解决&#xff1f; Python是一种流行的编程语言&#xff0c;被广泛用于开发Web应用程序、数据分析、人工智能、机器学习等领域。但是&#xff0c;Python在处理浮点数时可能存在精度问题&#xff0c;尤其是当尾数不确定时&#xff0c;会…

简单几步写出第一个C++程序

编写一个C程序总共分为4个步骤 创建项目创建文件编写代码运行程序 创建项目 ​ Visual Studio是我们用来编写C程序的主要工具&#xff0c;我们先将它打开 创建文件 右键源文件&#xff0c;选择添加->新建项 给C文件起个名称&#xff0c;然后点击添加即可。 编写代码 #i…

使用shedlock实现分布式定时任务锁【防止task定时任务重复执行】

第一步&#xff1a;引入shedlock相关依赖 <!--集成shedlock解决定时任务重复执行的问题--><dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-spring</artifactId><version>2.2.1</version></d…

Nginx网站服务二

目录 编译安装Nginx服务 2.安装依赖包 3.创建运行用户、组&#xff08;Nginx 服务程序默认以 nobody 身份运行&#xff0c;建议为其创建专门的用户账号&#xff0c;以便更准确地控制其访问权限&#xff09; 4.编译安装Nginx 5.检查、启动、重启、停止 nginx服务 6.添加 N…

前端Vue自定义tabbar底部tabbar凸起tabbar兼容苹果刘海屏小程序和APP

前端Vue自定义tabbar底部tabbar凸起tabbar兼容苹果刘海屏小程序和APP&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13167 效果图如下&#xff1a; # cc-myTabbar #### 使用方法 使用方法 <!-- tabBarShow&#…

Flutter Dart函数(方法)异常

目录 函数(方法) 可选命名参数 「required」 可选位置参数 默认参数值 匿名方法 函数是一等对象 异常 函数(方法) Dart 是一个真正的面向对象语言&#xff0c;方法也是对象并且具有一种 类型 Function。 这意味着&#xff0c;方法可以赋值给变量&#xff0c;也可以当做…

读发布!设计与部署稳定的分布式系统(第2版)笔记10_自动化和缓慢的响应

1. 工业机器人 1.1. 具有多层防护措施&#xff0c;防止对人员、机器和设施造成损害 1.2. 防护措施能限制机器人的动作和传感器的感知 1.3. 机械臂的旋转范围会远远小于它可以达到的全部运动范围 2. 自动化 2.1. 它更像是工业机器人 2.1.1. 掌握控制层感知系统的当前状态 …

chatgpt赋能python:Python的分割函数:split的介绍和使用方法

Python的分割函数&#xff1a;split的介绍和使用方法 在Python编程中&#xff0c;我们经常需要对字符串进行操作。其中&#xff0c;分割字符串是一项常见的任务。Python中的split()函数可以用于将字符串按照指定的分隔符进行拆分。本文将介绍split()函数的使用方法以及注意事项…

0019-TIPS-2019-tokyowesterns-gnote : switch(jump-table) Doubule Fetch

漏洞源码 #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/proc_fs.h> #include <linux/string.h> #include <linux/slab.h> #include <asm/uaccess.h>…