使用<canvas>作为CSS背景

Ben*_*ock 56 javascript css canvas

我可以将canvas元素用作css背景吗?

小智 62

自2008年以来,WebKit已经可以实现这一点,请参见此处.

<html>
 <head>
 <style>
 div { background: -webkit-canvas(squares); width:600px; height:600px; border:2px solid black }
 </style>

 <script type="application/x-javascript">
function draw(w, h) {
 var ctx = document.getCSSCanvasContext("2d", "squares", w, h);

 ctx.fillStyle = "rgb(200,0,0)";
 ctx.fillRect (10, 10, 55, 50);

 ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
 ctx.fillRect (30, 30, 55, 50);
}
 </script>
 </head>
 <body onload="draw(300, 300)">
   <div></div>
 </body>

</html>
Run Code Online (Sandbox Code Playgroud)

目前,Firefox 4包含一项功能,允许您以这种方式使用任何元素(包括画布)作为CSS背景:

<p id="myBackground1" style="background: darkorange; color: white;  width: 300px; height: 40px;">
  This element will be used as a background.
</p>
<p style="background: -moz-element(#myBackground1); padding: 20px 10px; font-weight: bold;">
  This box uses #myBackground1 as its background!
</p>
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Mozilla hacks.

  • `document.getCSSCanvasContext()`已被弃用并从所有Chromium平台中删除.还有什么可以用呢? (2认同)
  • 不推荐使用,这里:https://bugs.chromium.org/p/chromium/issues/detail?id=161699 (2认同)

fre*_*hie 58

是!!!!您可以在CSS背景中放置画布.

var Canvas = document.createElement("canvas");
... do your canvas drawing....
$('body').css({'background-image':"url(" + Canvas.toDataURL("image/png")+ ")" });
Run Code Online (Sandbox Code Playgroud)

我知道这是一个非常古老的问题,但我想为那些访问此页面的人发布我的答案,因为这是正确的答案,只需一行代码,使用该.toDataURL功能.它适用于支持画布的每个浏览器.

  • 唯一的问题是画布在设置为背景后无法修改. (6认同)
  • @frenchie其他答案击败了你的单行,因为:在你做之前18个月,已经在其他答案中提出了使用toDataURL.它也没有回答这个问题.这是一个解决方案.您的代码不会在CSS背景中放置画布.它将来自画布的瞬时图像数据放在CSS背景中. (6认同)
  • 如果需要,可以使用简单的解决方法.只需创建一个画布副本并将其存储为全局,这样当你应用.toDataURL()时,仍然可以使用画布.总的来说,我看不出其他任何提议的答案如何能够击败这种单线解决方案. (2认同)
  • 这甚至不能使画布成为背景.它正在制作画布内容的图像,然后将图像用作背景.这个解决方案如果用于不断更新(可以说是人们通常需要画布背景的原因)将使用大量的CPU和内存.假设你有一个完整的窗口画布.所以调用toDataUrl会停止图形管道,拉出4-8meg的像素,zip压缩它,将其转换为base64字符串.该字符串被复制,转换回二进制,解压缩,重新转换为像素,然后复制到GPU.真是一团糟. (2认同)

bca*_*cat 11

我认为你可以得到的最接近的是渲染成a canvas,调用toDataUrl()它来检索作为图像的内容,并将结果分配给所需元素的background-image属性.但这只会给出静态背景.canvas但是,如果您希望能够进一步更新,那么您需要将画布放在另一个元素后面,就像Johan已经建议的那样.