<template> <div style="width: 100%;height: 100%;"> <div class="contentcenter"> <canvas width="600" height="600" id="mycanvas" style="border: 1px solid black"></canvas> </div> </div> </template> <script> export default { name: "index", methods: { initview() { var canvas = document.getElementById('mycanvas'); var ctx = canvas.getContext("2d"); /* 概念 1、画布坐标轴与传统数学坐标轴,关于X轴对称。意味着:X轴正常,Y轴相反,弧度相反 */ /* 矩形 // 填充色 ctx.fillStyle = "rgb(255,0,0)"; // 填充矩形选区(起点X轴坐标,起点Y轴坐标,矩形宽度,矩形高度) ctx.fillRect(600, 600, -300, -300); // 笔划色 ctx.strokeStyle = "rgb(0,255,0)"; // 笔划矩形选区(起点X轴坐标,起点Y轴坐标,矩形宽度,矩形高度) ctx.strokeRect(600, 300, -300, -300); // 清除矩形选区(起点X轴坐标,起点Y轴坐标,矩形宽度,矩形高度) ctx.clearRect(375, 375, 150, 150); */ /* 三角形 // 开启路径 ctx.beginPath(); // 至坐标 ctx.moveTo(150, 150); // 直线至坐标 ctx.lineTo(450, 450); ctx.lineTo(450, 150); // 闭合路径 ctx.closePath(); ctx.fillStyle = "rgb(255,0,0)"; // 填充 ctx.fill(); ctx.strokeStyle = "rgb(0,255,0)"; // 笔划 ctx.stroke(); */ /* 圆弧 // 开启路径 ctx.beginPath(); // 圆弧(圆心X轴坐标,圆心Y轴坐标,半径,起始弧度,结束弧度,是否逆时针) ctx.arc(300, 300, 300, 0, -Math.PI / 2, true); // 笔划 ctx.stroke(); */ /* 贝塞尔曲线 // 开启路径 ctx.beginPath() // 至坐标 ctx.moveTo(0, 300) // 直线至坐标 ctx.lineTo(150, 300) // 贝塞尔曲线(参数1、2控制点1坐标,参数3、4控制点2坐标,...) ctx.quadraticCurveTo(300, 300, 300, 450) ctx.lineTo(300, 600) // 笔划 ctx.stroke() */ /* 直线 ctx.beginPath() ctx.moveTo(150, 300) ctx.lineTo(300, 300) ctx.lineTo(300, 450) // 线宽 ctx.lineWidth = 10 // 端点样式 var lineCap_valarr = ["butt", "round", "square"] ctx.lineCap = lineCap_valarr[1] // 拐点样式 var lineJoin_valarr = ["round", "bevel", "miter"] ctx.lineJoin = lineJoin_valarr[1] // 虚线([实线长度,虚线长度]) ctx.setLineDash([0, 10]) ctx.stroke() */ /* 文本 ctx.beginPath() ctx.moveTo(0, 150) ctx.lineTo(600, 150) ctx.moveTo(200, 0) ctx.lineTo(200, 600) ctx.moveTo(0, 450) ctx.lineTo(600, 450) ctx.stroke() // 字体样式 ctx.font = "bolder 32px 微软雅黑" // 字体左右对齐方式 var textAlign_valarr = ["left", "center", "right"] ctx.textAlign = textAlign_valarr[0] // 字体上下对齐方式 var textBaseline_valarr = ["top", "middle", "bottom", "hanging", "alphabetic"] ctx.textBaseline = textBaseline_valarr[3] // 填充文本(文本内容,文本X轴坐标,文本Y轴坐标) ctx.fillText("宁静致远", 200, 150) // 笔划文本(文本内容,文本X轴坐标,文本Y轴坐标) ctx.strokeText("淡泊明志", 200, 450) */ /* 图片 var img = new Image(); img.src = require("../static/tly.jpg"); img.onload = function () { // 画图(图片对象,图片起始X轴坐标,图片起始Y轴坐标) ctx.drawImage(img, 0, 0); // 画图(图片对象,图片起始X轴坐标,图片起始Y轴坐标,图片缩放宽度,图片缩放高度) ctx.drawImage(img, 0, 0, 300, 300); // 画图(图片对象,原图裁剪起始X轴坐标,原图裁剪起始Y轴坐标,原图裁剪宽度,原图裁剪高度,裁剪图起始X轴坐标,裁剪图起始Y轴坐标,裁剪图缩放宽度,裁剪图缩放高度) ctx.drawImage(img, 0, 0, 300, 300, 300, 0, 300, 300); } */ /* 状态的保存和恢复 ctx.fillStyle = "#ff0000" // save相当于数组的push,存储状态(strokeStyle、fillStyle、translate...) ctx.save() ctx.fillRect(0, 0, 100, 100) ctx.fillStyle = "#00ff00" ctx.save() ctx.fillRect(100, 100, 100, 100) ctx.fillStyle = "#0000ff" ctx.save() ctx.fillRect(200, 200, 100, 100) // restore相当于数组的pop,返回最后一个push的状态 ctx.restore() ctx.fillRect(300, 300, 100, 100) ctx.restore() ctx.fillRect(400, 400, 100, 100) ctx.restore() ctx.fillRect(500, 500, 100, 100) */ /* 变形 ctx.save() // 偏移(X轴偏移距离,Y轴偏移距离) ctx.translate(100, 100) ctx.fillRect(0, 0, 100, 100) ctx.restore() ctx.save() // 旋转(旋转角度) ctx.rotate(Math.PI / 4) ctx.fillRect(Math.pow(80000, 0.5), 0, 100, 100) ctx.restore() ctx.save() // 缩放(X轴缩放大小,Y轴缩放大小) ctx.scale(2, 2) ctx.fillRect(150, 150, 100, 100) */ /* 路径裁剪 ctx.beginPath(); ctx.arc(300, 300, 100, 0, -Math.PI * 2, true); // 裁剪要在填充(fill)或笔划(stroke)之前 ctx.clip(); ctx.fillStyle = "#ff0000"; ctx.fillRect(200, 200, 200, 200); */ /* 动画 */ let count = 0 requestAnimationFrame(function animate() { ctx.clearRect(0, 0, 600, 600) ctx.save() ctx.fillRect(count, count, 100, 100) ctx.fillStyle = "red" ctx.fillRect(count + 25, count + 25, 50, 50) ctx.restore() count++ requestAnimationFrame(animate) }) } }, mounted() { this.initview() } } </script> <style scoped> .contentcenter { width: 100%; height: 100%; display: flex; flex-direction: row; justify-content: center; align-items: center; } </style>