1.画布大小

  • canvas默认的大小是 300*150,通过操作width/height属性可以设置画布的大小,属性值只能是具体是像素值,而不能是百分比。
<body>
<div class="box">
<!-- 在标签中设置画布大小 -->
<canvas width="400" height="200"></canvas>
</div>
</body>
//js设置画布大小
var canvas = document.querySelector("canvas")
// 方法一
canvas.setAttribute("width",400)
canvas.setAttribute("height",200)
//方法二
canvas.width = 400
canvas.height = 200
  • 注意:css样式里面width/height只是将画布整体缩放而已(连同画布的坐标),并不是设置画布的大小

2.绘制直线

  • 在画布中作图的第一步是获取绘图工具,接着描点,最后将描点的轨迹绘制展现出来,要用到的API:
语法 说明
canvas.getContext("2d") 获取绘图工具
ctx.moveTo(x,y) 将画笔移动到相关坐标
ctx.lineTo(x,y) 画一条直线到相关坐标
ctx.strokeStyle 设置描边的颜色
ctx.lineWidth 设置直线的宽度
ctx.stroke() 将前面画笔的移动轨迹进行描边
<script>
var canvas = document.querySelector("canvas")
// 设置画布大小
canvas.width = 400
canvas.height = 200
// 获取绘图工具
var ctx = canvas.getContext("2d")
// 将画笔移动到相关坐标
ctx.moveTo(100,100)
// 画一条直线到相关坐标
ctx.lineTo(300,100)
// 再画一条直接到相关坐标
ctx.lineTo(300,150)
// 设置描边的颜色
ctx.strokeStyle = "blue"
// 设置直线的宽度
ctx.lineWidth = 5
// 将前面画笔的移动轨迹进行描边
ctx.stroke()
</script>

  • 注意:绘制直线时,如果坐标是整数,则画出来的直线偏粗
<script>
//获取容器
var box = document.querySelector('canvas')
//获取画笔
var ctx = box.getContext('2d')
//设置直线宽度
ctx.lineWidth = 1
//颜色
ctx.strokeStyle = 'black' //粗直线(整数坐标)
ctx.moveTo(50,50)
ctx.lineTo(500,50)
//绘制
ctx.stroke() ctx.beginPath()
//粗直线(小数坐标)
ctx.moveTo(50,100.5)
ctx.lineTo(500,100.5)
//绘制
ctx.stroke()
</script>

3.设置新的绘制起点

  • 相关语法:ctx.stroke()
  • 由来:重复执行绘制语句时,相关绘制属性会被后面的覆盖(描边颜色,描边宽度等),例如
<script>
var canvas = document.querySelector("canvas")
// 获取绘图工具
var ctx = canvas.getContext("2d") // 绘制一条蓝色的直线
ctx.moveTo(100,100)
ctx.lineTo(300,100)
ctx.strokeStyle = "blue"
ctx.lineWidth = 5
ctx.stroke() // 再绘制一条绿色的直线
ctx.moveTo(100,150)
ctx.lineTo(300,150)
ctx.strokeStyle = "green"
ctx.stroke()
</script>

  • 正确示例:使用ctx.beginPath()可以设置新的绘制起点,避免覆盖
<script>
var canvas = document.querySelector("canvas")
// 获取绘图工具
var ctx = canvas.getContext("2d") // 绘制一条蓝色的直线
ctx.moveTo(100,100)
ctx.lineTo(300,100)
ctx.strokeStyle = "blue"
ctx.lineWidth = 5
ctx.stroke() // 再绘制一条绿色的直线
// 设置新的绘制起点
ctx.beginPath()
ctx.moveTo(100,150)
ctx.lineTo(300,150)
ctx.strokeStyle = "green"
ctx.stroke()
</script>

4.填充

  • 设置填充颜色,将轨迹区域进行颜色填充
语法 说明
ctx.fillStyle 设置填充颜色
ctx.fill() 执行填充
  • 注意:填充的时候会将起点和终点自动连接,以形成一个封闭的形状
<script>
var canvas = document.querySelector("canvas")
// 获取绘图工具
var ctx = canvas.getContext("2d") // 绘制一条蓝色的直线
ctx.moveTo(50,50)
ctx.lineTo(150,50)
ctx.lineTo(150,150)
// 描边的直线并没有闭合成一个封闭的形状
ctx.stroke() // 设置填充颜色
ctx.fillStyle = "yellow"
// 填充(将起点和终点自动连接,以形成一个封闭的形状)
ctx.fill()
</script>

5.自动闭合路径

  • 由来:在描边的时候,即使起始点和lineTo结束点的坐标一致,他也无法完全闭合,有缺角
<script>
var canvas = document.querySelector("canvas")
// 获取绘图工具
var ctx = canvas.getContext("2d") // 绘制一条蓝色的直线
ctx.moveTo(50,50)
ctx.lineTo(200,50)
ctx.lineTo(200,200)
ctx.lineTo(50,50)
// 即使起点终点一致,描边时还是有缺角
ctx.lineWidth = 8
ctx.stroke()
</script>

  • 要闭合路径,直接添加 ctx.closePath() ,会自动连接起点和终点,描边时还不会缺角
<script>
var canvas = document.querySelector("canvas")
// 获取绘图工具
var ctx = canvas.getContext("2d") // 绘制一条蓝色的直线
ctx.moveTo(50,50)
ctx.lineTo(200,50)
ctx.lineTo(200,200)
// 自动闭合路径
ctx.closePath()
// 即使起点终点一致,描边时还是有缺角
ctx.lineWidth = 8
ctx.stroke()
</script>

6.非0环绕规则

  • 问题点:如图,通过绘制直线的形式,画了2个正方形,小的正方形嵌套在大正方形的正中央

  • 由来:如果要对这2个正方形进行填充,问题就来了?是2个都进行填充?还是只填充一个?在这里填充有自己的规则,这个规则被称为非0环绕规则

  • 非0环绕规则:看一块区域是否填充,先从这个区域往外拉一条线,看和这条线相交的轨迹,如果是顺时针就+1,逆时针就-1,如果最终值不等于0,则该区域填充。如果等于0,则该区域不填充

<script>
var canvas = document.querySelector("canvas")
// 获取绘图工具
var ctx = canvas.getContext("2d") //绘制两个大小不一的正方形套在一起(200*200 100*100) //大正方形顺时针 200*200
ctx.moveTo(50, 50);
ctx.lineTo(250, 50);
ctx.lineTo(250, 250);
ctx.lineTo(50, 250);
//自动闭合路径
ctx.closePath(); //小正方形逆时针 100*100
ctx.moveTo(100, 100);
ctx.lineTo(100, 200);
ctx.lineTo(200, 200);
ctx.lineTo(200, 100);
//自动闭合路径
ctx.closePath(); ctx.fillStyle = "yellow"
ctx.fill()
</script>

canvas(一)描边与填充的更多相关文章

  1. Canvas绘图中的路径描边与填充

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博客地址为http://www.cnblogs.com/jasonnode/ .网站上有对应每一 ...

  2. Canvas路径、描边、填充

    <script> var context = document.getElementById('canvas').getContext('2d'); context.font = '48p ...

  3. html5 canvas 弧形描边渐变

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 小程序canvas 圆角框带填充颜色

    // ctx: 获取canvas的id  ---  const ctx = wx.createCanvasContext('canvasId') // x 横坐标 y 纵左边 w 框的宽度 h 框的高 ...

  5. HTML5 Canvas 填充与描边(Fill And Stroke)

    HTML5 Canvas 填充与描边(Fill And Stroke) 演示HTML5 Canvas Fill 与Stroke文字效果,基于Canvas如何实 现纹理填充与描边. 一:颜色填充与描边 ...

  6. 图形处理:给 Canvas 文本填充线性渐变

    作者:凹凸曼 - Barrior 在 Canvas 中对文本填充水平或垂直的线性渐变可以轻易实现,而带角度的渐变就复杂很多:就好像下面这样,假设文本矩形宽为 W, 高为 H, 左上角坐标为 X, Y. ...

  7. HTML5 程序设计 - 使用HTML5 Canvas API

    请你跟着本篇示例代码实现每个示例,30分钟后,你会高喊:“HTML5 Canvas?!在哥面前,那都不是事儿!” 呵呵.不要被滚动条吓到,很多都是代码和图片.我没有分开写,不过上面给大家提供了目录,方 ...

  8. HTML5 学习总结(四)——canvas绘图、WebGL、SVG

    一.Canvas canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术.<canvas> 标记和 ...

  9. canvas小结

    前段时间在公司没什么事干,研究了一下canvas,在实际开发中还没正式应用过,但是已经深深感觉到其魅力之处.下面写一写我认为canvas中比较重要的点,如有理解错误,欢迎指正. 首先canvas是h5 ...

  10. javascript的canvas绘图的基本用法

    <canvas>是HTML里面非常强大的元素,利用它结合js可以实现很多动画效果,大大增强交互性.下面,我想用图文并茂的方式阐述一下canvas的绘图机制的基础内容,话不多说,先上代码: ...

随机推荐

  1. [OI] 整体二分

    整体二分可以理解成普通二分改版,其实并没有改多少,并且一般对 check() 函数的复杂度要求更宽松 先来看一道经典题目:求区间排名 给一个数列,若干组询问 \((l,r,k)\),求 \([l,r] ...

  2. 课时04:了解HTTP网络协议

    什么是HTTP协议 HTTP(HyperText Transfer Protocol)叫超文本传输协议,它是web服务器和客户端直接进行数据传输的规则,是一个无状态的应用层协议. HTTP协议工作原理 ...

  3. XYD1006CSPS

    T1 密钥 [关键结论,模拟,枚举] Description 给定两个长度为 \(n\) 的 \(01\) 序列 \(a\),\(b\),每个位置都有一个权值 \(c\), 每次操作可以将 \(a\) ...

  4. markdown.css 设置文章的样式

    返回的详情文章内容是标签加内容文字,使用 markdown,css 渲染样式 : .markdown-body .octicon { display: inline-block; fill: curr ...

  5. vite 搭建项目删除console 和debugger

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  6. KubeSphere 社区双周报|2024.03.15-03.29

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  7. KubeSphere 社区双周报|2024.02.29-03.14

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  8. 5.29 杭州站云原生 Meetup,邀您观看线上同步直播

    5 月 15 日在上海组织的云原生 Meetup,除了现场火爆.人数爆满之外,同步进行的线上直播也同样受到了广大社区小伙伴的关注,在线观看直播人数足有千人之众. 为了能让更多的社区小伙伴能够参与到 M ...

  9. 祝贺开源之夏 2023 KubeSphere 社区项目中选学生!

    日前,开源之夏 2023 所有中选结果已出炉,在此祝贺各位中选的同学! 活动简介 开源之夏是由中科院软件所"开源软件供应链点亮计划"发起并长期支持的一项暑期开源活动,旨在鼓励在校学 ...

  10. keycloak~token配置相关说明

    会话有效期 在 Keycloak 中,"SSO Session Idle" 和 "SSO Session Max" 是用于配置单点登录(SSO)会话的两个参数. ...