将 Canvas 分层以制作背景

Posted

技术标签:

【中文标题】将 Canvas 分层以制作背景【英文标题】:layering up Canvas to make a background 【发布时间】:2013-03-22 09:56:46 【问题描述】:

在其他 Stack Overflow 成员的帮助下。我已经创建了我正在构建的网站的动画画布部分。

我对 Canvas 很陌生,我想做的是有一个动画弧/圆

function animate(elementId, endPercent) 
     var canvas = document.getElementById(elementId);
     var context = canvas.getContext('2d');
     var x = canvas.width / 2;
     var y = canvas.height / 2;
     var radius = 43.5;
     var curPerc = 0;
     var counterClockwise = false;
     var circ = Math.PI * 2;
     var quart = Math.PI / 2;

     context.lineWidth = 9;
     context.strokeStyle = '#c51414';
     context.lineCap = 'butt';

     context.shadowOffsetX = 1;
     context.shadowOffsetY = 1;
     context.shadowBlur = 1;
     context.shadowColor = "#c51414";


     function render(current) 
         context.clearRect(0, 0, canvas.width, canvas.height);
         context.beginPath();
         context.arc(x, y, radius, -(quart), ((circ) * current) - quart, false);
         context.stroke();
         curPerc++;
         if (curPerc <= endPercent) 
             requestAnimationFrame(function () 
                 render(curPerc / 100);
             );
         
     
     render();
 

animate('skill1', 90);
animate('skill2', 80);
animate('skill3', 45);
animate('skill4', 92);
animate('skill5', 80);
animate('skill6', 65);

这是我目前正在使用的脚本。在底部它使用

  animate('skill3', 45);

最后的 45 是弧行进的百分比。 这是一个小提琴,使它更容易看到。

http://jsfiddle.net/dLAVe/

我想做的还是用画布,给每条弧线一个完整的背景圆。 这是我想要实现的图像,(我在 Photoshop 中完成了此操作)

我不想使用图像,并将其放在圆弧下方,我已经在画布上使用背景图像尝试过此操作,但我对对齐方式非常不满,它实际上与微像素不同将背景与动画弧对齐。另外我想用 Canvas 来做。

谁能帮我弄明白怎么做?我猜它会将动画弧放在一个静态圆圈的顶部。

请帮忙,因为这让我发疯了!

【问题讨论】:

【参考方案1】:

嗯,这更像是一个 CSS 问题,因为分层画布只是确保它们彼此正确重叠。 一个简单的解决方案是创建一个背景画布(称为#bgCanvas1),将其添加到#myCanvas1 旁边的标记中,并将它们都设置为position: absolute,根据最近的定位祖先放置它们,有效地堆叠他们。为了让一个显示在另一个与其 html 位置无关的上方,您可以将其中一个的 z-index 属性设置为比另一个更高的值。

所以,对于 CSS,应用我所说的:

#myCanvas1, #bgCanvas1 
    position: absolute;

#bgCanvas1 
    z-index: 1;

#myCanvas1 
    z-index: 2;

只是对 HTML 的简单更新:

<canvas id="myCanvas1"  ></canvas> 
<canvas id="bgCanvas1"  ></canvas> 

这是它的小提琴:http://jsfiddle.net/dLAVe/2/

您可能会注意到我已经稍微更新了您的 javascript 函数,以允许传递圆圈的颜色来绘制。以后你可能想更多地自定义它,把它分成不同的功能,这样在背景画布上画一个静态的圆圈就更容易了。

【讨论】:

以上是关于将 Canvas 分层以制作背景的主要内容,如果未能解决你的问题,请参考以下文章

canvas性能优化总结

HTML 5 Canvas 和 Javascript:结合分层画布

Canvas 图表制作实战

如何使用 HTML5 Canvas 制作水波纹效果

canvas入门之时钟的实现

canvas 动态三角面背景