# 学习canvas制作一个代码美化截图页面

# 使用canvas

在HTML中插入canvas标签,并添加id为唯一标识方便通过DOM获取。

<canvas id="canvas"></canvas>

用js操作DOM获取canvas标签,并设置宽高,然后拿到canvas上下文。

const canvas = document.getElementById('canvas');
const width = window.innerWidth;
const height = window.innerHeight;
canvas.width = width;
canvas.height = height;
const ctx = canvas.getContext('2d');

完成这一步就可以在页面上使用canvas了,接下来开始绘制图形。

# 绘制图形

以下为已完成图示效果:

canvas图示

# 定义需要的常量及变量

let content =
`
/* 绘制圆角矩形 */
function roundRect(ctx, x, y, width, height, radius, fillColor) {
    if (2 * radius > width || 2 * radius > height) { return width = height = 2 * radius; }
    ctx.save();
    ctx.translate(x, y);
    ctx.beginPath(0);
    ctx.arc(width - radius, height - radius, radius, 0, Math.PI / 2);
    ctx.lineTo(radius, height);
    ctx.arc(radius, height - radius, radius, Math.PI / 2, Math.PI);
    ctx.lineTo(0, radius);
    ctx.arc(radius, radius, radius, Math.PI, Math.PI * 3 / 2);
    ctx.lineTo(width - radius, 0);
    ctx.arc(width - radius, radius, radius, Math.PI * 3 / 2, Math.PI * 2);
    ctx.lineTo(width, height - radius);
    ctx.closePath();
    ctx.shadowBlur = 20;
    ctx.shadowColor = fillColor || "#000";
    ctx.fillStyle = fillColor || "#000";
    ctx.fill();
    ctx.restore();
}
`;
let contentArray = content.split("\n");
let lineHeight = 25;
let fontWidth = 10;
let rectHeight = contentArray.length * lineHeight + 20;
let rectWidth = 0;
for (let index = 0; index < contentArray.length; index++) {
    if (contentArray[index].split("").length * fontWidth > rectWidth) {
        rectWidth = contentArray[index].split("").length * fontWidth
    }
}

这些变量的作用分别是:

  • content:显示在框里的文本
  • contentArray:通过换行符拆分的由行组成的数组
  • lineHeight:显示文本的行高
  • fontWidth:显示文本的字宽
  • rectHeight:框的高度,由行数乘以行高加上20的头部计算得来
  • rectWidth:框的宽度,由每行的字符数乘以字宽计算得来

# 绘制背景

背景为一个与画布相同大小的填充矩形,代码如下:

/* 绘制背景色 */
function background(ctx, x, y, width, height, fillColor) {
    ctx.fillStyle=fillColor || "#fff";
    ctx.fillRect(x,y,width,height);
}
background(ctx,0,0,width,height,"#d2d2d2")

# 绘制圆角矩形框

圆角矩形右四个1/4圆弧和四段线段组成,从右下角开始顺时针画,代码如下:

/* 绘制圆角矩形 */
function roundRect(ctx, x, y, width, height, radius, fillColor) {
    if (2 * radius > width || 2 * radius > height) { return width = height = 2 * radius; }
    ctx.save();
    ctx.translate(x, y);
    ctx.beginPath(0);
    ctx.arc(width - radius, height - radius, radius, 0, Math.PI / 2);
    ctx.lineTo(radius, height);
    ctx.arc(radius, height - radius, radius, Math.PI / 2, Math.PI);
    ctx.lineTo(0, radius);
    ctx.arc(radius, radius, radius, Math.PI, Math.PI * 3 / 2);
    ctx.lineTo(width - radius, 0);
    ctx.arc(width - radius, radius, radius, Math.PI * 3 / 2, Math.PI * 2);
    ctx.lineTo(width, height - radius);
    ctx.closePath();
    ctx.shadowBlur = 20;
    ctx.shadowColor = fillColor || "#000";
    ctx.fillStyle = fillColor || "#000";
    ctx.fill();
    ctx.restore();
}
roundRect(ctx, width/2-rectWidth/2, height/2-rectHeight/2, rectWidth, rectHeight, 8, 'rgb(50,50,50)');

# 绘制左上角小按钮

小按钮为三个填充圆形,代码如下:

/* 绘制左上角三个小按钮 */
function circle(ctx, x, y, radius, fillColor) {
    ctx.beginPath();
    ctx.arc(x, y, radius, 0, Math.PI * 2);
    ctx.closePath();
    ctx.fillStyle = fillColor || "#fff";
    ctx.fill();
}
circle(ctx, width/2-rectWidth/2+20, height/2-rectHeight/2+20, 8, 'rgb(197,79,103)');
circle(ctx, width/2-rectWidth/2+45, height/2-rectHeight/2+20, 8, 'rgb(210,191,77)');
circle(ctx, width/2-rectWidth/2+70, height/2-rectHeight/2+20, 8, 'rgb(103,212,98)');

# 绘制文本

文本为每绘制一行就移动位置,否则会重叠在一起,代码如下:

/* 绘制文本 */
function text(ctx, x, y, lineHeight, contentArray, fillColor) {
    ctx.font = "20px bold 微软雅黑";
    ctx.fillStyle = fillColor || "#fff";
    ctx.textAlign = "left";
    ctx.textBaseline = "middle";
    for (let index = 0; index < contentArray.length; index++) {
        if(contentArray[index].trim() === ""){
            contentArray.splice(index,1)
            index --;
        }else{
            ctx.fillText(contentArray[index], x, y + index * lineHeight);
        }
    }
}
text(ctx, width/2-rectWidth/2+20, height/2-rectHeight/2+60, lineHeight, contentArray, 'rgb(97,175,239)');
发布日期: 1/21/2021, 12:28:52 PM