一篇canvas带你画出整个特效世界

news2024/10/6 2:27:19

目录

一,canvas是啥?

1.初识canvas

2.路径绘制

3.拆分画法

4.清除画布 

5.绘制圆形笑脸

6.贝塞尔曲线

①二次贝塞尔曲线

②三次贝塞尔曲线


一,canvas是啥?

Canvas是HTML5中新出的一个元素,我们可以在上面绘制一系列图形。Canvas 在HTML文件中的写法很简单: <canvasid="canvas" width="宽度" height="高度"></canvas>,三个重要的属性,id,高度,宽度(这里就是指的你要在多宽多高的画布上来进行操作),canvas翻译过来就是画布的意思,所以我们也可以称他为画布

1.初识canvas

既然有画布了,那就得有画笔,所以我们的操作步骤为,创建画布,拿到该画布的元素,然后再拿起画笔,这里我们先画一个小矩形来看一下小效果,使用的是fillRect,参数分别为(x,y,w,h)这第一对参数啊就是坐标点,在哪一个坐标点开始画,第二对参数就是你画的东西多大,如果参数分别为(0,0,100,100)就是从远点开始,画一个宽高为100 的正方形

<body>
    <canvas id="c1" width="600" height="400"></canvas>
    <script>
    // 1.找到画布
    var c1 = document.querySelector('#c1');
    // 2.获取画笔
    var ctx = c1.getContext('2d');
    // 3.绘制图形 画一个矩形fillRect(位置x,位置y,宽度,高度)
    ctx.fillRect(400,100,100,100)
    </script>
</body>

2.路径绘制

路径顾名思义就是只把该图形的路径画出来,也就是不进行内部填充,只进行边框的绘制,这里使用的是strokeRect 他的参数和fillRect的参数一样

<body>
    <canvas id="c1" width="600" height="400">该浏览器不支持canvas</canvas>
    <script>
    var c1 = document.querySelector('#c1');
    var ctx = c1.getContext('2d');
    // 路径绘制矩形
    ctx.strokeRect(100,100,100,100)
    </script>
</body>

3.拆分画法

步骤为: beginPath开始绘制,rect绘制图形,绘制方式(fill、stroke)closePath绘制结束

<body>
    <canvas id="c1" width="600" height="400">该浏览器不支持canvas</canvas>
    <script>
        var c1 = document.querySelector('#c1');
        var ctx = c1.getContext('2d');
        // 拆分路径绘制矩形
        // 这里要使用beginPath,closePath
        ctx.beginPath();// 开始绘画
        ctx.rect(100, 100, 200, 100);
        ctx.stroke();
        ctx.closePath();// 绘画结束
        // 拆分填充绘制矩形
        ctx.beginPath();
        ctx.rect(200, 150, 200, 100);
        ctx.fill();
        ctx.closePath();
    </script>
</body>

绘制效果 

4.清除画布 

甲:画完了之后,我感觉效果并不是很好,我不想要的我想重新绘制,该咋办呢?

乙:这还不简单啊,直接选中del不就好啦

山鱼:简单粗暴(๑•̀ㅂ•́)و✧,但是呢这里有个比较文雅的方式使用clearRect,清除画布

不仅可以清除画布,配合定时器还能实现动态效果呢,ok先来看一下clearRect里面的参数,仨,分别是(x,y,清除谁,清除多少),这里是从整个画布的远点开始清除,清除c1这个画布的高度,每次清除高度++,开启一个定时器就能获得动态清除的效果啦

<body>
    <canvas id="c1" width="600" height="400">该浏览器不支持canvas</canvas>
    <script>
        var c1 = document.querySelector('#c1');
        var ctx = c1.getContext('2d');
        // 路径绘制矩形
        ctx.strokeRect(100, 100, 200, 100);
        ctx.fillRect(200, 150, 200, 100);
        // 逐渐的清除绘制的内容
        let height = 0;
        let t1= setInterval(() => {
            height++;
            ctx.clearRect(0, 0, c1.clientHeight,height);
            if(height >c1.clientHeight){
                clearInterval(t1);
            }
        },10)
    </script>
</body>

清除效果

5.绘制圆形笑脸

方块可以绘制那么圆形也肯定能绘制,接下来就进行圆形笑脸的绘制 ,先来绘制一个圆弧,使用的是arc这个参数为六个(x,y,半径,起始角度,结束角度,顺/逆时针【默认的是顺时针】)经过绘制就能得到一个⚪,一个圆为360度也就是2π所以结束的度数为Math.PI*2

    <canvas id="c1" width="600" height="400"></canvas>
    <script>
        var c1 = document.querySelector('#c1');
        var ctx = c1.getContext('2d');
        // 使用arc()绘制圆形他有6个参数分别为
        // 圆心x,圆心y,半径,起始角度,结束角度,顺/逆时针(默认为顺时针)
        // false是顺时针true是逆时针
        ctx.arc(300, 200, 50, 0, Math.PI*2,false);
        ctx.stroke();
    </script>

 

开始绘制笑脸,这里使用的是moveTo和arc来共同完成的,moveTo() 方法把路径移动到画布中的指定点,不创建线条。绘制步骤为:创建画布,获取画布,获取画笔,开始绘制,绘制脸部

<body>
    <canvas id="c1" width="600" height="400"></canvas>
    <script>
        var c1 = document.querySelector('#c1');
        var ctx = c1.getContext('2d');
        // 使用arc()绘制圆形他有6个参数分别为
        // 圆心x,圆心y,半径,起始角度,结束角度,顺/逆时针(默认为顺时针)
        // false是顺时针true是逆时针
        // 1.绘制脸部
        ctx.beginPath();
        ctx.arc(75,75,50,0,Math.PI*2);
        ctx.moveTo(110,75);
        // 2.绘制嘴巴
        ctx.arc(75,75,35,0,Math.PI);
        ctx.moveTo(65,65);
        // 3.绘制眼睛
        // 左眼
        ctx.arc(60,65,5,0,Math.PI*2)
        ctx.moveTo(95,65);
        // 右眼
        ctx.arc(90,65,5,0,Math.PI*2);
        ctx.stroke();
        ctx.closePath();
    </script>
</body>

 

6.贝塞尔曲线

①二次贝塞尔曲线

使用二次贝塞尔曲线画一个气泡框

二次曲线:quadraticCurveTo (cp1x, cp1y, x, y) 贝塞尔曲线:bezierCurveTo (cp1x, cp1y, cp2x, cp2y, x, y) 画圆弧:arcTo (x1,y1,x2,y2,radius);

<body>
    <canvas id="c1" width="600" height="400"></canvas>
    <script>
        var c1 = document.querySelector('#c1');
        var ctx = c1.getContext('2d');
        ctx.beginPath();
        ctx.moveTo(200,300);
        ctx.quadraticCurveTo(150,300,150,200);
        ctx.quadraticCurveTo(150,100,300,100);
        ctx.quadraticCurveTo(450,100,450,200);
        ctx.quadraticCurveTo(450,300,250,300);
        ctx.quadraticCurveTo(250,350,150,350);
        ctx.quadraticCurveTo(200,350,200,300);
        ctx.stroke();
        ctx.closePath();
    </script>
</body>

 

 

②三次贝塞尔曲线

使用三次贝塞尔曲线画一个小爱心

<body>
    <canvas id="c1" width="600" height="400"></canvas>
    <script>
        var c1 = document.querySelector('#c1');
        var ctx = c1.getContext('2d');
        ctx.beginPath();
        // 起初点
        ctx.moveTo(300,200);
        // 两个控制点
        ctx.bezierCurveTo(350,150,400,200,300,300);
        ctx.bezierCurveTo(200,200,250,150,300,200);
        ctx.stroke();
        ctx.closePath();
    </script>
</body>

我是Aic山鱼,感谢您的支持
​原 创 不 易 ✨还希望支持一下
点赞👍:您的赞赏是我前进的动力!
收藏⭐:您的支持我是创作的源泉!
评论✍:您的建议是我改进的良药!
山鱼🦈社区:山鱼社区💌💌

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

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

相关文章

为什么redis中提供hash数据类型?

目录 1.什么是哈希表&#xff1f;缺点是什么&#xff1f; 2.Redis的数据类型&#xff08;type、encoding&#xff09; 3.比较常用命令、使用场景、实现方式 1.什么是哈希表&#xff1f;缺点是什么&#xff1f; 把关键字key映射到表中记录的地址。映射关系是散列函数&#x…

图表控件LightningChart.NET 入门教程(六):许可证管理介绍(上)

LightningChart.NET SDK 是一款高性能数据可视化插件工具&#xff0c;由数据可视化软件组件和工具类组成&#xff0c;可支持基于 Windows 的用户界面框架&#xff08;Windows Presentation Foundation&#xff09;、Windows 通用应用平台&#xff08;Universal Windows Platfor…

初学Java web(十)Filter 和 Listener

Filter和Listener 一.Filter 概念&#xff1a;Filter表示过滤器&#xff0c;是JavaWeb三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。 过滤器一般完成一些通用的操作&#xff0c;比如&#xff1a;权限控…

Nuttx学习入门

Nuttx学习 NuttX 是一个实时操作系统 (RTOS)&#xff0c;强调标准合规性和占用空间小。可从 8 位扩展到 64 位微控制器环境&#xff0c;NuttX 中的主要管理标准是 POSIX 和 ANSI 标准。 NuttX 的主要环境依赖性是 (1) GNU make&#xff0c;(2) bash 脚本&#xff0c;和 (3) L…

第三十四章 数论——高斯消元解线性方程组

第三十四章 数论——高斯消元解线性方程组一、高斯消元1、线性方程组2、高斯消元步骤&#xff08;1&#xff09;数学知识铺垫增广矩阵和阶梯矩阵初等变换&#xff08;2&#xff09;高斯消元步骤二、代码模板1、问题&#xff1a;2、代码一、高斯消元 1、线性方程组 我们在小学…

P3884 [JLOI2009]二叉树问题

题目 如下图所示的一棵二叉树的深度、宽度及结点间距离分别为&#xff1a; 深度&#xff1a;44宽度&#xff1a;44结点 8 和 6 之间的距离&#xff1a;88结点 7 和 6 之间的距离&#xff1a;33 其中宽度表示二叉树上同一层最多的结点个数&#xff0c;节点 u, vu,v 之间的距离…

算法工程师需要学习的基础

文章目录应该早点系统地了解算法工程师需要学习的东西的&#xff0c;B站上的up主&#xff1a;梁唐讲的很好&#xff0c;大家可以去看一下&#xff0c;只截了一部分图做一个记录

MySQL5.7 多主一从(多源复制)同步配置

主从复制有如下一些优势&#xff1a; 分担负载&#xff1a;对业务进行读写分离&#xff0c;减轻主库I/O负载&#xff0c;将部分压力分担到从库上&#xff0c;缩短客户查询响应时间。 增加健壮性&#xff1a;在主库出现问题时&#xff0c;可通过多种方案将从库设置为主库&#…

100%全国产龙芯2K1000设计方案

国产工业处理器&#xff0c;龙芯2K1000主板&#xff0c;100%全国产化方案 可实现100%国产元器件方案&#xff0c;国产处理器 信迈2k1000开发板采用龙芯 2k1000处理器&#xff0c;处理器集成 2 个 GS264 处理器核&#xff0c;主频 1GHz&#xff0c;64 位 DDR3 控制器&#xff…

Vue与VueComponent的内置关系

上一节讲到了 Vue.extend 与 VueComponent 的区别&#xff0c;这一节讲一讲 Vue 与 VueComponent的内置关系。 原型与原型链 这里需要用到原型与原型链中的知识点&#xff0c;具体文章链接在这里。js中的原型与原型链 这里只需要理解一个点&#xff0c;那就是构造函数的protot…

【idea2022.3】安装教程2022-12

教程目录教程简介所需环境和版本软件下载执行过程安装激活开始使用前的配置结束语教程简介 换电脑了&#xff0c;又经历了一遍软件和环境的安装&#xff0c;已经安装好了jdk和对应版本的maven&#xff0c;所以接下来该安装idea等软件了 所需环境和版本 系统&#xff1a;win1…

软件测试人员30K的月薪,是个什么段位?

大家可以参照BAT等一线大厂的职级&#xff0c;一般是高级测试工程师和资深测试开发工程师的职位&#xff0c;下面是在字节跳动年薪40W的测试工程师 掌握的技能树主要包含哪个方面&#xff1f; 现在的行情&#xff0c;大家想要拿到30k这个薪资&#xff0c;不妨审视自己&#xf…

跨平台备份工具Duplicati

本文软件得到了网友 冷心 的推荐&#xff1b; 什么是 Duplicati &#xff1f; Duplicati 是一个免费的开源备份客户端&#xff0c;可将加密的、增量的、压缩的备份安全地存储在云存储服务和远程文件服务器上。支持 Amazon S3、IDrive e2、Backblaze (B2)、Box、Dropbox、FTP、G…

【Flask框架】——27 SQLAlchemy高级

1、排序 order_by方法排序&#xff1a;可以指定根据模型中某个属性进行排序&#xff0c;"模型名.属性名.desc()"代表的是降序排序。 # 根据年龄降序 lst session.query(Student).order_by(Student.age.desc()).all() # 根据年龄升序 lst session.query(Student).…

WinNTSetup V5.3.0 Bata5 单文件版

前言 WinNTSetup 是一款Windows系统硬盘安装器&#xff0c;支持从PE和本地安装系统&#xff0c;支持支持NT内核的系统。 WinNTSetup 包括XP、Win7、Win8、Win8.1、Win10等这些系统。直接从硬盘安装系统&#xff0c;不需要光盘。WinNTSetup 还附加一些系统优化功能&#xff0…

Android---简易的底部导航栏

目录 一、activity_main.xml布局 二、给ViewPager2 创建适配器 三、ViewPager2 数据源 四、MainActivity.java类 1、初始化数据源。 2、ViewPager2 页面改变监听 3、BottomNavigationView 的每个 item 点击的监听 这里简单演示实现效果&#xff0c;实现快速开发&#xff…

mmdetection从入门到精通(一)-汇总目录

&#xff11;.简介 MMDetection 是商汤出品的集成了目标检测&#xff0f;实例分割分割&#xff0f;全景分割几个方面顶级模型组合的,模块化的&#xff0c;基于 PyTorch 的目标检测开源工具箱。是深度学习工作者的必备工具&#xff0c;非常有必要深入掌握。 近期汇总一下从入…

今年最后一场官方活动

阅读本文大概需要 1.6 分钟。2022 年 12 月 26&#xff0c;新型冠状病毒肺炎正式更名为了新型冠状病毒感染&#xff0c;不再纳入《中华人民共和国国境卫生检查疫法》 规定的检疫传染病管理。文字层面上&#xff0c;这意味着我们口中的疫情&#xff0c;结束了。然而我却认为并没…

Django学习 Day9

1.F对象 一个F对象代表数据库中某条记录的字段的信息。 作用&#xff1a; 通常是对数据库中的字段的值在不获取的情况下进行操作 用于类属性&#xff08;字段&#xff09;之间的比较。 语法&#xff1a; From django.db.models import F F(‘列名’)例子: 所有Book数据表中的…

云游戏的2022:破局、新生、元宇宙

文|智能相对论 作者|青月 如果说2021年是「元宇宙元年」&#xff0c;那么2022年更像是元宇宙的「祛魅之年」&#xff0c;在这一年里&#xff0c;原本处在狂奔状态下的元宇宙正在褪去虚火。 在这样的大环境下&#xff0c;由于在实时性、兼容性、无限开创等关键特性的理念上的…