首页 > 其他分享 >画布canvas基础 01

画布canvas基础 01

时间:2024-05-12 09:19:03浏览次数:11  
标签:canvas 01 浏览器 600 ctx 画布 100

1. 什么是canvas

canvas是用来绘制图形的.它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。

<canvas width="500" height="500">
当前的浏览器版本不支持,请升级浏览器
</canvas>

判断浏览器是否支持 画布 cnavas

canvas的标签属性只有两个,width和height,表示的是canvas画布的宽度和高度,不要用css来设置,而是用属性来设置,画布会失真变形。

标签的innerContent是用来提示低版本浏览器(IE6、7、8)并不能正常使用canvas,高版本的浏览器是看不到canvas标签内部的文字的。

 

上下问  -- 2d的上下文和3d的上下文

// 得到画布的上下文,上下文有两个,2d的上下文和3d的上下文
// 所有的图像绘制都是通过ctx属性或者是方法进行设置的,和canvas标签没有关系了
const ctx = myCanvas.getContext("2d")
if(ctx !== null) {
// 设置颜色
ctx.fillStyle = 'green'
// 绘制矩形
ctx.fillRect(100, 100, 200, 50)
}

绘制一个天空蓝的矩形

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <canvas id="context" width="500" height="600">当前的浏览器版本不支持,请升级浏览器</canvas>
    <script >
        const dom  = document.querySelector("#context");
        // console.log(dom.getContext);
        if(!dom.getContext) {
            alert("当前浏览器不支持")
        }
        const ctx = dom.getContext("2d");  // 获取2D上下文
        if(ctx != null) {
            ctx.fillStyle = "skyblue";  // 设置颜色
            // 绘制图形
            ctx.fillRect(100,100,100,100);
        }
    </script>
</body>
</html>

通过上面的代码我们发下canvas本质上就是利用代码在浏览器的页面上进行画画,比如上面的代码fillRect就代表在页面中绘制矩形,一共四个属性,前两个100,100代表(x, y), 即填充起始位置,200代表宽,50代表高,单位都是px。

canvas轻量化和flash重量化的比较

轻量化的原因:不能修改了,只能重新清除所有内容,然后重新渲染。

我们用canvas绘制了一个图形,一旦绘制成功了,canvas就像素化了他们。canvas没有能力,从画布上再次得到这个图形,也就是我们没有能力去修改已经在画布上的内容,这个就是canvas比较轻量的原因,Flash重的原因之一就有它可以通过对应的api得到已经上“画布”的内容然后再次绘制

如果我们想要这个canvas图形移动,必须按照:清屏——更新——渲染的逻辑进行编程。总之,就是重新再画一次

 

canvas的动画思想

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <canvas id="context" width="500" height="600">当前的浏览器版本不支持,请升级浏览器</canvas>
    <script >
        const dom  = document.querySelector("#context");
        // console.log(dom.getContext);
        if(!dom.getContext) {
            alert("当前浏览器不支持")
        }
        const ctx = dom.getContext("2d");  // 获取2D上下文
        if(ctx != null) {
            ctx.fillStyle = "skyblue";  // 设置颜色
            // 绘制图形
            let left = -200;
            setInterval(() => {
            // 清除画布,0,0代表从什么位置开始,600,600代表清除的宽度和高度
                ctx.clearRect(0,0,600,600); // 清屏
                // 更新信号量
                left++
                // 如果已经走出画布,则更新信号量为初始位置
                if(left > 600) {
                    left = -200
                }
                ctx.fillRect(left, 100, 200, 200)
            },10)
        }
    </script>
</body>
</html>

实际上,动画的生成就是相关静态画面连续播放,这个就是动画的过程。我们把每一次绘制的静态话面叫做一帧,时间的间隔(定时器的间隔)就是表示的是帧的间隔。

 

使用面向对象的思维制作动画

// 得到画布
const myCanvas:HTMLCanvasElement = document.getElementById("main_canvas") as HTMLCanvasElement
 
// 获取上下文
const ctx = myCanvas.getContext("2d")
 
class Rect {
    // 维护状态
    constructor(
        public x: number,
        public y: number, 
        public w: number, 
        public h: number, 
        public color: string
    ) {  
    }
    // 更新的方法
    update() {
        this.x++
        if(this.x > 600) {
            this.x = -200
        }
    }
    // 渲染
    render(ctx: CanvasRenderingContext2D) {
        // 设置颜色
        ctx.fillStyle = this.color
        // 渲染
        ctx.fillRect(this.x, this.y, this.w, this.h)
    }
}
 
// 实例化
let myRect1: Rect = new Rect(-100, 200, 100, 100, 'purple')
let myRect2: Rect = new Rect(-100, 400, 100, 100, 'pink')
 
// 动画过程
 
// 更新的办法
setInterval(() => {
    // 清除画布,0,0代表从什么位置开始,600,600代表清除的宽度和高度
    if(ctx !== null) {
        // 清屏
        ctx.clearRect(0,0,600,600)
        // 更新方法
        myRect1.update()
        myRect2.update()
        // 渲染方法
        myRect1.render(ctx)
        myRect2.render(ctx)
    }
},10)

 

标签:canvas,01,浏览器,600,ctx,画布,100
From: https://www.cnblogs.com/zhulongxu/p/18187493

相关文章

  • WPF Canvas在Image 图像上绘图,自适应缩放.
    效果如图  实现了绘图,自适应缩放核心代码如下<Window.InputBindings><KeyBindingKey="Z"Modifiers="Ctrl"Command="{BindingUndoCommand}"/></Window.InputBindings><i:Interaction.Triggers>......
  • 采用flex布局,父组件width为百分比,解决子组件canvas画布width自适应问题
     创建EleResize.js文件(拷贝以下代码即可)varEleResize={ _handleResize:function(e){  varele=e.target||e.srcElement  vartrigger=ele.__resizeTrigger__  if(trigger){   varhandlers=trigger.__z_resizeListeners   if......
  • buuctf-pwn-ciscn_2019_es_2
    checksecida我们看到在vul函数中,有两个read函数,每个都读取了0x30(48)大小的字符,并放入字符数组s中,也就是说我们能溢出的只有8个字节,刚好覆盖到ebp和返回地址所以我们需要栈迁移,使我们能溢出更多字节首先利用第一个read,输入40字节的数据,刚好覆盖到ebp,然后printf就会顺带打印......
  • Windows Server 2012 R2 新增D盘分区
    (小众游戏塔防迷宫动作剧情类等)16款游戏源码Javaswing五子棋联网版源代码Javaswing贪吃蛇游戏开发教程+源码Javaswing超级玛丽游戏Javaswing俄罗斯方块项目源码Javaswing飞机大战游戏源码Javaswing雷电游戏源码Javaswing连连看游戏源码Javaswing模拟写字板源码......
  • 01 创建项目
    通过HBuilderX创建在HBuilderX工具里面直接创建即可安装uni-appvue3编译器插件如果是小程序,还需要下面的一些配置设置微信开发者工具安装地址开启服务端口命令行创建uni-app项目1创建:创建以typescript开发的工程npxdegitdcloudio/uni-preset-vu......
  • KBU1010-ASEMI新能源专用KBU1010
    编辑:llKBU1010-ASEMI新能源专用KBU1010型号:KBU1010品牌:ASEMI封装:KBU-4最大重复峰值反向电压:1000V最大正向平均整流电流(Vdss):10A功率(Pd):中小功率芯片个数:4引脚数量:4类型:插件整流桥、整流扁桥正向浪涌电流:300A正向电压:1.10V最大输出电压(RMS):封装尺寸:如图工作温度:-55......
  • m2_day01 [集合内容回顾]
    课程内容:集合复习集合复习Java集合框架JCF​ CollectionMap​List   SetSortedMap​SortedSet各类集合的特点List:[有序不唯一]Set:[唯一]SortedSet:[有序唯一]Map:[主键......
  • 数据结构学习01--栈
    栈栈的特性栈的基本结构我们可以把栈想象成一个装有弹珠的瓶子,先放进去的弹珠在瓶子底部,每次只能将顶部的弹珠倒出。栈的特点由图可以很好的知道后进先出栈的实际应用简单栈栈的概念非常简单,但把这个数据结构运用得当是需要充分理解的。应用1:判断字符串是否合法特殊情......
  • AGC001E BBQ Hard
    题意简述给定序列\(\{a_n\},\{b_n\}\),求\(\sum_{1\lei<j\len}\dbinom{a_i+b_i+a_j+b_j}{a_i+b_i}\)。\(n\le2\times10^5,a_i,b_i\le2\times10^3\)。分析发现我们要求的\(\dbinom{a_i+b_i+a_j+b_j}{a_i+a_j}\)包含两个参数\(i,j\),如果直接求的话枚举\(i,j\)的复杂度......
  • 苹果再失资深设计师,Jony Ive 团队基本离开;OpenAI 或于下周发布 AI 搜索丨 RTE 开发者
      这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,欢迎大家留言......