如何用javascript操作Canvas进行绘图?【教程】

发布时间 - 2026-01-26 00:00:00    点击率:
Canvas绘图需先获取2D上下文、设置状态、逐条发出指令;漏掉beginPath()或stroke()/fill()则图形不显示;drawRect不存在,应rect()+stroke()/fill();需确保DOM加载完成、正确设置canvas宽高、适配高清屏;路径需显式描边或填充才可见;drawImage需注意参数顺序和图片加载状态;Canvas是状态机,应合理使用save()/restore()。

Canvas 绘图不是“调用一个函数就画出来”,而是需要先获取上下文、设置状态、再逐条发出绘制指令—

—漏掉 beginPath() 或忘记 stroke()/fill(),图形就完全不会显示。

怎么拿到能画画的上下文对象

必须通过 getContext('2d') 获取 2D 渲染上下文;用 getContext('webgl') 是另一套逻辑,不能混用。注意:同一个 元素只应调用一次 getContext,重复获取不会报错,但可能掩盖状态混乱问题。

常见错误:canvas.getContext('2d').drawRect(...) —— drawRect 根本不存在,正确方法是 rect() + stroke()fill()

实操建议:

  • 检查 DOM 是否加载完成,避免在 document.querySelector('canvas') 返回 null 时直接调用 getContext
  • canvas.widthcanvas.height 设置绘图区域(不是 CSS 的 style.width),否则图像会拉伸或模糊
  • 若需高清屏适配,得手动缩放 canvas 像素比,CSS 尺寸不变,仅放大 width/height 属性值

为什么画了线却看不见

Canvas 不自动渲染路径,所有绘图操作(moveTolineToarc 等)只是把指令记进当前路径,真正显示靠 stroke()(描边)或 fill()(填充)。没调用它们,等于写了代码但没执行。

另一个高频原因:路径未闭合且填充色透明,或描边宽度为 0(lineWidth = 0 在多数浏览器下不可见)。

实操建议:

  • 每次开始新图形前,加 ctx.beginPath() —— 否则上次路径残留,stroke() 会把所有旧线一起画出来
  • 确认 ctx.strokeStyle / ctx.fillStyle 已设为非透明色,例如 '#000''rgba(0,0,0,1)'
  • 设置描边宽度至少为 1ctx.lineWidth = 1

drawImage 怎么总画歪或截断

drawImage() 有 3 种参数形式,最容易出错的是 9 参数版本(带裁剪和缩放);传错顺序或数值会导致图像偏移、翻转、只画一小块。

最常用的是 5 参数版:drawImage(image, dx, dy, dWidth, dHeight),其中 dx/dy 是目标画布上的左上角坐标,dWidth/dHeight 是最终绘制尺寸 —— 它们和图片原始宽高无关。

实操建议:

  • 确保 image 已加载完成(监听 img.onload),否则 drawImage 静默失败
  • 用 3 参数版 drawImage(img, x, y) 时,图片按原始尺寸绘制;若 canvas 尺寸小,图片会溢出不可见
  • 调试时临时加 ctx.rect(dx, dy, dWidth, dHeight); ctx.stroke(); 画个框,确认目标区域是否符合预期

Canvas 是状态机模型,不是声明式 API。颜色、线宽、字体、变换矩阵……全都共享同一套上下文状态。画复杂图形时,别依赖“上一步设过”,该保存用 ctx.save(),该重置用 ctx.restore(),否则某次旋转会影响后面所有文字位置。


# css  # javascript  # java  # 浏览器  # 为什么  # canva 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在腾讯云服务器上快速搭建个人网站?  Laravel如何使用Sanctum进行API认证?(SPA实战)  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  JavaScript数据类型有哪些_如何准确判断一个变量的类型  Laravel如何实现用户注册和登录?(Auth脚手架指南)  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  非常酷的网站设计制作软件,酷培ai教育官方网站?  微信小程序 input输入框控件详解及实例(多种示例)  香港服务器部署网站为何提示未备案?  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel模型事件有哪些_Laravel Model Event生命周期详解  香港服务器租用费用高吗?如何避免常见误区?  黑客如何利用漏洞与弱口令入侵网站服务器?  Java解压缩zip - 解压缩多个文件或文件夹实例  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  Python图片处理进阶教程_Pillow滤镜与图像增强  如何用好域名打造高点击率的自主建站?  如何快速生成专业多端适配建站电话?  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  个人网站制作流程图片大全,个人网站如何注销?  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  SQL查询语句优化的实用方法总结  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  香港服务器选型指南:免备案配置与高效建站方案解析  专业商城网站制作公司有哪些,pi商城官网是哪个?  Laravel如何记录自定义日志?(Log频道配置)  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  打造顶配客厅影院,这份100寸电视推荐名单请查收  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  php结合redis实现高并发下的抢购、秒杀功能的实例  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Laravel如何创建自定义中间件?(Middleware代码示例)  如何快速登录WAP自助建站平台?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  英语简历制作免费网站推荐,如何将简历翻译成英文?  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  Laravel如何自定义分页视图?(Pagination示例)