【问题标题】:Use <canvas> as a CSS background使用 <canvas> 作为 CSS 背景
【发布时间】:2018-05-18 21:45:19
【问题描述】:

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

【问题讨论】:

  • 您可以使用画布元素作为背景,但 CSS 与此无关。
  • 是的,你可以!!!! $('body').css({'background-image':"url(" + Canvas.toDataURL("image/png")+ ")" });请参阅下面的答案:一行代码和跨浏览器兼容。
  • 那是将画布作为背景。那就是将画布的内容复制为图像,然后将图像用作背景。

标签: javascript css canvas


【解决方案1】:

自 2008 年以来,这已在 WebKit 中成为可能,请参阅 here

<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

【讨论】:

  • 很好!!我不知道你能做到这一点。我在这里用你的代码做了一个 jsfiddle:http://jsfiddle.net/cRqf6/
  • 我只是想提一下 -moz-element 技巧,但你是第一个。所以,我只是举个例子-jsfiddle.net/U72dt/1
  • 在下面查看我的答案:一行代码,在所有浏览器上交叉兼容
  • document.getCSSCanvasContext() 已被弃用并从所有 Chromium 平台中删除。还有什么可以代替的?
【解决方案2】:

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

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

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

【讨论】:

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

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

【讨论】:

    【解决方案4】:

    过去几周我一直在尝试实现相同的功能,我发现最好的解决方案与 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>
    

    【讨论】:

      【解决方案5】:

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

      -webkit-canvas(name) 用于基于 WebKit 的浏览器中的 CSS background

      【讨论】:

        【解决方案6】:

        您可以使用 CSS Paint API

        .elem {
          backgound: paint(squares);
        }
        

        在此处查看更多详细信息:

        博文:

        https://vitaliy-bobrov.github.io/blog/exploring-the-css-paint-api/ https://vitaliy-bobrov.github.io/blog/css-paint-in-action-bar-chart/

        演示:https://vitaliy-bobrov.github.io/css-paint-demos/

        【讨论】:

        • 这似乎只有 Chrome 支持:caniuse.com/#feat=css-paint-api
        • Chrome 从 v65 开始,Safari 正在开发中(Safari TP)。很容易回退到纯色/bg图像。
        • 不幸的是,这只是 Canvas API 的“受限版本。为什么受限?出于安全原因,您无法从图像中读取像素或渲染文本。但您可以绘制圆弧、矩形、路径, ETC。” (来源:vitaliy-bobrov.github.io/blog/exploring-the-css-paint-api
        【解决方案7】:

        您可以使用z-index 快​​速模拟这种行为而不会降低toDataURL() 的性能(当然,这是一种解决方法,因为 CSS images 4 / CSS Houdini 尚未实现“背景:元素(#mycanvas) “截至 2017 年)))

        在这里工作的 JSFiddle。这不是我写的,所有功劳归Derek Leung

        http://jsfiddle.net/DerekL/uw5XU/

        【讨论】:

          【解决方案8】:

          无法发表评论,因此我将为此创建自己的答案。

          此答案基于 @livedo、@Eric Rowell 和 @shabunc

          http://jsfiddle.net/MDooley47/yj26psdb/

          window.i = 0;
          function draw(w, h) {
              window.i+=5;
              if (window.webkitURL != null) {
                  var ctx = document.getCSSCanvasContext("2d", "squares", 100, 100);
          
          
                  ctx.fillStyle = "rgb(200,0,0)";
                  ctx.fillRect (10, 10, w, h);
          
                  ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
          
                  ctx.fillRect (30, 30, w, h);
              }
              else {
                  var ctxmozc = document.getElementById("squares");
                  var ctxmoz = ctxmozc.getContext("2d");
          
                  ctxmoz.fillStyle = "rgb(200,0,0)";
                  ctxmoz.fillRect (10, 10, w, h);
          
                  ctxmoz.fillStyle = "rgba(0, 0, 200, 0.5)";
          
                  ctxmoz.fillRect (30, 30, w, h);
              }
          }
          setInterval(function(){draw(window.i, window.i);}, 500);
           div {
               background: -webkit-canvas(squares);
               background: -moz-element(#squares) repeat-x;
               width:575px;
               height:475px;
               border:2px solid black
           }
          <body>
              <div></div>
              <canvas id="squares" name="squaresmoz" style="display: none;" ></canvas>
          </body>
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-28
          • 2017-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-22
          • 1970-01-01
          相关资源
          最近更新 更多