博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HTML5 Canvas 基础笔记
阅读量:3948 次
发布时间:2019-05-24

本文共 8433 字,大约阅读时间需要 28 分钟。

HTML5 Canvas 基础笔记

HTML5 Canvas

  • Canvas 是 HTML5 中提供的画布,通过 JS 代码可以实现控制各种图形、制作动画、远程可视化展示等应用

Canvas 绘图的基本流程

  • 创建画布区域获取Canvas元素
  • 获取Canvas的上下文环境对象
  • 使用上下文环境对象绘制图形

Canvas 绘图的基本语法

  • HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像
  • 画布是一个矩形区域,可以控制其每一像素
  • canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法
  • canvas 元素本身是没有绘图能力的,所有的绘制工作必须在 JavaScript 内部完成
-- 规定元素的 id、宽度和高度

Canvas 绘图常用属性方法

  • Canvas 绘图常用属性方法 1
属性和方法 描述
strokeStyle 设置边框颜色
strokeRect( ) 设置带边框的矩形
clearRect 清除指定矩形区域的像素
createLinearGradient 创建渐变对象
moveTo( ) 绘制画笔到指定点位置
lineTo( ) 绘制到指定坐标点的直线
arc( ) 绘制圆形
stroke( ) 直线描边
beginPath( )/closePath( ) 图形路径开始和结束
  • Canvas 绘图常用属性方法 2
属性和方法 描述
fillText( ) 填充方式绘制文字
strokeText( ) 描边方式绘制文字
translate( ) 移动
scale( ) 缩放
rotate( ) 旋转
shadowOffsetX/Y 阴影与图形的水平/垂直距离
shadowColor 阴影的颜色
shadowBlur 阴影的模糊值
  • Canvas 绘图常用属性方法 3
属性和方法 描述
drawImage( ) 绘制图像
save( ) 保存已绘制图形
restore( ) 还原保存的图形
toDataURL( ) 还原保存图像到浏览器

Canvas 绘图线段和文字

  • 移动到起点:moveTo( )
  • 绘制路径:lineTo( )
  • 描边:stroke( )
  • 填充:fill( )
  • 开启新路径(新的图形状态): beginPath( )
  • 结束路径:closePath( )
  • 绘制文字:strokeText( )
绘制线段
window.onload = function () {
//1.获取canvas对象 var canvas = document.querySelector('canvas') canvas.style.border = '5px solid #333' //2.创建上下文对象 var ctx = canvas.getContext('2d') //3.绘图 ctx.moveTo(100, 100) //移动到开始位置 ctx.lineTo(800, 100) //绘制线段 ctx.lineTo(800, 300) ctx.lineTo(100, 300) ctx.lineTo(100, 100) ctx.strokeStyle = "red" //设置线段的颜色 ctx.lineWidth = 10 //设置线段的粗细 ctx.stroke() //上色 // ctx.fill() // ctx.beginPath() //开启一个新图形的绘制 ctx.moveTo(100, 400) ctx.lineTo(800, 400) ctx.strokeStyle = 'blue' ctx.stroke()}

在这里插入图片描述

绘制文字
window.onload = function(){
//1.获取canvas对象 var canvas = document.querySelector('canvas') //2.创建上下文对象 var ctx = canvas.getContext('2d') //3.绘图 ctx.font = "18px blod 黑体" //设置字体 ctx.textAlign = "center" // ctx.strokeText('我是Canvas绘制的文字',100,100) ctx.fillText('我是Canvas绘制的文字',100,100)}

在这里插入图片描述

绘制围棋棋盘练习
window.onload = function(){
//1.获取canvas对象 var canvas = document.querySelector('canvas') canvas.style.border = '4px solid #000' //2.创建上下文对象 var ctx = canvas.getContext('2d') //3.绘图 var cellWidth = 10 var cellHeight = 10 for(var i = 0 ; i < 19 ; i++){
//绘制水平线 ctx.moveTo(0,cellHeight * i) ctx.lineTo(180,cellHeight*i) //绘制垂直线 ctx.moveTo(cellWidth * i,0) ctx.lineTo(cellWidth * i ,180) } ctx.lineWidth = 0.5 ctx.stroke()}

在这里插入图片描述

Canvas 绘制图形

  • 描边矩形
    • strokeRect(顶点X坐标顶点Y坐标宽度高度
  • 填充矩形
window.onload = function(){
//1.获取canvas对象 var canvas = document.querySelector('canvas') //2.创建上下文对象 var ctx = canvas.getContext('2d') //3.绘图 ctx.rect(0,0,200,100) ctx.stroke() ctx.beginPath() ctx.rect(0,120,200,100) ctx.fill()}

在这里插入图片描述

  • 绘制圆弧
    • arc(圆心X坐标圆心Y坐标半径开始角度结束角度方向)
    • 角度的计算:顺时针为正,逆时针为负
    • 右侧: 0, 下方: 90, 上方: -90, 左侧: 180(-180)
    • 顺时针: false, 逆时针: true
  • 填充扇形
window.onload = function(){
//1.获取canvas对象 var canvas = document.querySelector('canvas') //2.创建上下文对象 var ctx = canvas.getContext('2d') //3.绘图 // 圆弧 ctx.arc(100,100,50,0,90*Math.PI/180,true) ctx.stroke() ctx.beginPath() // =============================================== // 扇形 ctx.moveTo(200,100) //先移动到圆心 ctx.arc(200,100,50,0,45*Math.PI/180,false) ctx.fill() //弧度:180=PI,360 = 2*PI}

在这里插入图片描述

地球公转练习
window.onload = function () {
//1.获取Canvas对象 var canvas = document.querySelector('#canvas') //2.获取canvas的上下文环境对象 var context = canvas.getContext('2d') //3.定时器绘图 setInterval(function(){
draw(context) },50)}var angel = 0//绘制图形function draw(context){
context.clearRect(0, 0, 500, 500); //清空画布上的内容 //1.绘制太阳 context.beginPath(); context.arc(250,250,30,0,360 * Math.PI / 180) context.fillStyle = "#f00" context.fill(); context.closePath(); //2.绘制轨迹 context.beginPath(); context.strokeStyle = '#fff' context.arc(250,250,200,0,360 * Math.PI / 180) context.stroke() context.closePath(); //3.绘制地球 context.save() context.translate(250,250) //把原点移到太阳的中心点 context.rotate(angel * Math.PI / 180) //旋转画布 context.beginPath(); context.arc(200,0,10,0,360 * Math.PI / 180) //在新的画布坐标系中绘制地球 context.fillStyle = "#00f" context.fill(); context.closePath(); context.restore(); //将画布坐标系还原为原来的状态 angel++}

在这里插入图片描述

扇形统计图练习
window.onload = function () {
var data = [ {
value: 0.15, name: '视频广告', color: '#f00', dist:100 }, {
value: 0.20, name: '联盟广告', color: '#000', dist:120 }, {
value: 0.20, name: '邮件营销', color: '#f0f', dist:130 }, {
value: 0.18, name: '直接访问', color: '#ff0', dist:150 }, {
value: 0.27, name: '搜索引擎', color: '#0ff', dist:180 } ] var startAngel = -90; var context = document.querySelector('#canvas').getContext('2d') for (var i = 0; i < data.length; i++) {
var angel = data[i].value var angelName = data[i].name var angelColor = data[i].color var angelDist = data[i].dist context.beginPath(); context.moveTo(300,300); context.fillStyle = angelColor; context.arc(300,300,angelDist,startAngel*Math.PI/180, (startAngel+angel*360)*Math.PI/180) context.fill() var txtAngel = startAngel + (angel*360 / 2) var x = 300 + Math.cos(txtAngel * Math.PI/180) * (angelDist + 20) var y = 300 + Math.sin(txtAngel * Math.PI/180) * (angelDist + 20) context.beginPath() context.moveTo(300,300) context.lineTo(x,y); context.strokeStyle = angelColor; context.stroke() context.textBaseline='middle'; if(txtAngel > -90 && txtAngel < 90){
context.textAlign='left'; }else{
context.textAlign='right'; } context.fillText(angelName + (angel*100) + '%', x, y); context.fill() startAngel += angel*360 }}

在这里插入图片描述

Canvas 样式设置

  • 阴影设置
    • shadowOffsetX/Y(形状与阴影的水平/竖直距离)
    • shadowColor(阴影颜色)
    • shadowBlur(阴影的模糊级别)
  • 渐变设置
    • createLinearGradient(x0,y0,x1,y1)(线性渐变)
      • x0 (渐变开始点的 x 坐标)
      • y0 (渐变开始点的 y 坐标)
      • x1 (渐变结束点的 x 坐标)
      • y1 (渐变结束点的 y 坐标)
    • createRadialGradient(x0,y0,r0,x1,y1,r1)(放射状/环形渐变)
      • x0 (渐变开始圆的 x 坐标)
      • y0 (渐变开始圆的 y 坐标)
      • r0 (开始圆的半径)
      • x1 (渐变的结束圆的 x 坐标)
      • y1 (渐变的结束圆的 y 坐标)
      • r1 (结束圆的半径)
window.onload = function(){
//1.获取canvas对象 var canvas = document.querySelector('canvas') //2.创建上下文对象 var ctx = canvas.getContext('2d') //3.绘图 ctx.rect(0,0,100,100) ctx.shadowOffsetX = 10 ctx.shadowOffsetY = 10 ctx.shadowColor = 'red' ctx.shadowBlur = 15 //设置线性渐变 var color = ctx.createLinearGradient(0,0,0,100) color.addColorStop(0,'#f00') color.addColorStop(0.5,'#00f') color.addColorStop(1,'#0f0') ctx.fillStyle = color ctx.fill()}

在这里插入图片描述

Canvas 绘制图片

  • cxt.drawImage(image,dx,dy)
    • image是具体的图像
    • dx,dy是图像的参考点坐标
  • cxt.drawImage(image,dx,dy,dw,dh)
    • dw,dh是图像缩放后的宽度和高度
  • cxt.drawImage(image,sx,sy,sw,sh,dx,dy,dw,dh)
    • 前四个参数是指截取的源图像参考点和宽高
window.onload = function(){
//1.获取canvas对象 var canvas = document.querySelector('canvas') //2.创建上下文对象 var ctx = canvas.getContext('2d') //3.绘图 var img = document.createElement('img') // img.src = 'images/map.jpg' // ctx.drawImage(img,0,0) // 异步问题 img.src = 'images/up.png' //图片动态创建加载,需要设置load事件 img.onload = function(){
// 图片加载成功后 // ctx.drawImage(img,0,0) //1.不考虑图片和canvas容器的差异,以canvas容器的尺寸为标准 // ctx.drawImage(img,0,0,1000,800) //完整显示图片内容,根据参数进行缩放 ctx.drawImage(img,0,0,105,105,100,100,105,105) //截取图片中部分内容,放入canvas的指定位置 }}

Canvas 变换

  • 平移

    • context.translate(x,y)
    • 添加到水平坐标(x)上的值
    • 添加到垂直坐标(y)上的值
  • 旋转

    • context.rotate(angle)
    • rotate() 方法旋转当前的绘图
  • 缩放

    • context.scale(scalewidth,scaleheight)
    • scalewidth (缩放当前绘图的宽度 (1=100%, 0.5=50%, 2=200%, 依次类推))
    • scaleheight (缩放当前绘图的高度 (1=100%, 0.5=50%, 2=200%, etc))
  • 保存状态

    • save()
    • 保存当前环境的状态
  • 恢复状态

    • restore()
    • 返回之前保存过的路径状态和属性
window.onload = function(){
//1.获取canvas对象 var canvas = document.querySelector('canvas') //2.创建上下文对象 var ctx = canvas.getContext('2d') //3.绘图 ctx.rect(0,0,100,100) ctx.stroke() ctx.clearRect(0,0,110,110) //清除原来的图形 ctx.save() //保存当前坐标系 ctx.beginPath() ctx.translate(300,0) //坐标系往右移动300px ctx.rotate(45*Math.PI/180) // 旋转45度 ctx.scale(1,2) // 放大 ctx.rect(0,0,100,100) ctx.stroke() ctx.restore() //还原之前的坐标系 ctx.rect(0,0,50,50) ctx.stroke() //保存canvas的整体图像到base64 var imgStr = canvas.toDataURL('image/jpg') document.querySelector('img').src = imgStr}

在这里插入图片描述

总结

  • HTML5 Canvas 功能强大,做个学习笔记

转载地址:http://kcqwi.baihongyu.com/

你可能感兴趣的文章
5620系列密码清除
查看>>
vncsever-centos&debian
查看>>
华为snmp模板
查看>>
kvm&xen挂载镜像文件
查看>>
SQL Server Union等操作时解决不同数据库字符集冲突的问题
查看>>
Linq GroupJoin(二)
查看>>
递归:访问页面的控件或文件夹的下文件
查看>>
DataGridView分頁控件
查看>>
Linq 使用entity framework查询视图返回重复记录的问题(转)
查看>>
项目中得到执行文件版本或其它信息
查看>>
WinForm DatagridView绑定大量数据卡顿的问题
查看>>
DataGridView或 DataTable导出到excel
查看>>
Ilist To DataTable
查看>>
SQL @@IDENTITY, IDENT_CURRENT,SCOPE_IDENTITY
查看>>
簡單工廠模式
查看>>
SQL Server的數據類型
查看>>
php的正则表达式&nbsp;&#039;/\b\w…
查看>>
ThinkPHP的标签制作及标签调用解析…
查看>>
thrift的lua实现
查看>>
编写高性能的Lua代码
查看>>