使用 <canvas> 作为 CSS 背景

IT技术 javascript css canvas
2021-01-15 22:46:12

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

6个回答

自 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>

目前,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>

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

2021-03-25 22:46:12
好的!!我不知道你能做到这一点。我在这里从你的代码制作了一个 jsfiddle:http : //jsfiddle.net/cRqf6/
2021-03-29 22:46:12
document.getCSSCanvasContext()已弃用并从所有 Chromium 平台中删除。还有什么可以代替?
2021-03-29 22:46:12
请参阅下面的我的答案:一行代码并在所有浏览器上交叉兼容
2021-04-02 22:46:12
我只是想提到 -moz-element 技巧,但你是第一个。所以,我只是举个例子 - jsfiddle.net/U72dt/1
2021-04-13 22:46:12

是的!!!!您可以在 CSS 背景中放置一个画布。

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

我知道这是一个很老的问题,但我想为访问此页面的人发布我的答案,因为这是正确的答案,只需一行代码,使用该.toDataURL函数。它适用于所有支持画布的浏览器。

是的,但如果需要,有一个简单的解决方法。只需创建画布的副本并将其存储为全局,以便在应用 .toDataURL() 时仍然有一个画布可用。总的来说,我看不出任何其他建议的答案如何能击败这种单线解决方案。
2021-03-17 22:46:12
@frenchie 其他答案击败了您的单一答案,因为:在您提出之前 18 个月,其他答案中已经提出了使用 toDataURL 的建议。它也没有回答这个问题。这是一个解决方法。您的代码不会在 CSS 背景中放置画布。它将画布中的瞬时图像数据放在 CSS 背景中。
2021-03-21 22:46:12
我的回答只是将画布与 css 背景分离:插入画布的图像而不是插入实际的画布。实际的画布仍然是可编辑的,并且始终可以通过我的解决方案重新插入背景中。毕竟,目标是在视觉上渲染背景,我认为大多数来这里寻求帮助的人都会欣赏我的解决方案的简单性。
2021-03-22 22:46:12
这甚至不是远程使画布成为背景。它正在制作画布内容的图像,然后将图像用作背景。此解决方案如果用于不断更新(可以说是人们通常想要画布背景的原因)将使用大量 CPU 和内存。假设您有一个完整的窗口画布。所以调用 toDataUrl 会停止图形管道,提取 4-8meg 像素,zip 压缩它,将其转换为 base64 字符串。该字符串是复制的,转换回二进制,解压缩,重新转换为像素,然后复制到 GPU。真是一团糟。
2021-03-24 22:46:12
唯一的问题是画布设置为背景后无法修改。
2021-04-09 22:46:12

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

我一直triying达到过去几周此相同的功能,最好的解决办法,我发现它的提出同样的BCAT

  1. 渲染画布(可见或隐藏)
  2. 使用“canvas.toDataURL”获取画布图像
  3. 将此图像数据指定为元素的背景图像(我使用 MooTools)

坏消息是,静态图像效果很好,但 Chrome 中的动画有时会“闪烁”,而在 Firefox 中会闪烁很多次也许有人知道一种解决方法来摆脱这种“讨厌的眨眼”。

最好的祝福。
普:。

<!DOCTYPE html>
<html>
<head>
<title>Asign canvas to element background</title>
<script type="text/javascript" src="/js/mootools.1.2.4.js"></script>
<style type="text/css">
* {
    outline:0;
    padding:0;
    margin:0;
    border:0;
}
body {
    color:#fff;
    background:#242424;
}
</style>
<script>
window.addEvent('domready',function() {

//GET BODY
var mibodi = $('mibodi');
var viewportSize = mibodi.getSize();

//GET CANVAS
var micanvas = $('micanvas');
var ctx = micanvas.getContext('2d');
var playAnimation = true;

//GET DIV
var midiv = $('midiv');

//VARIABLES
var rotate_angle = 0;
var rotate_angle_inc = 0.05;

//FUNCIÓN DE INICIALIZACIÓN
function init(){

    ctx.clearRect (0, 0, 512, 512); //CLEAR CANVAS
    ctx.fillStyle = 'rgba(128,128,128,1)';
    ctx.strokeStyle = 'rgba(255,255,255,1)';

    if (playAnimation) {
    setInterval(draw,100);//
  }

} //INIT

//FUNCIÓN DE DIBUJADO
function draw() {

    //CLEAR BACKGROUND
    ctx.clearRect (0, 0, 512, 512);

    //DRAW ROTATING RECTANGLE
    ctx.save();
    ctx.translate( micanvas.width / 2, micanvas.height / 2 );
    ctx.rotate( rotate_angle );
    ctx.fillRect(0, 0, 100, 100);
    ctx.restore();

    //GET CANVAS IMAGE
    var dataURL = micanvas.toDataURL("image/png");

    //SET IMAGE AS BACKGROUND OF THE ELEMENTS
    midiv.setStyle('background-image', 'url(' + dataURL + ')');
    mibodi.setStyle('background-image', 'url(' + dataURL + ')');

    //ANGLE INCREMENT
    rotate_angle = rotate_angle + rotate_angle_inc;

} //DRAW

//BEGIN TO DRAW
init();

});//domeady

</script>
</head>
<body id="mibodi" >

<canvas id="micanvas" width="512" height="512" style="float:left;" style="display:none;">
Este texto se muestra para los navegadores no compatibles con canvas.
<br>
Por favor, utiliza Firefox, Chrome, Safari u Opera.
</canvas>

<div id="midiv" style="width:512px;height:512px;background:#f00;float:left;">
    Sample
</div>

</body>
</html>

在 Firefox 中尝试-moz-element(#id)使用 CSS background

-webkit-canvas(name)对CSSbackgroundWebKit的基于浏览器。