【问题标题】:How to put the div tags on canvas如何将 div 标签放在画布上
【发布时间】:2016-01-02 11:33:18
【问题描述】:

我想知道,如何将ajax生成的div标签动态放到画布上。

我只是用 ajax 创建 div 标记并将生成的 div 附加到 jsp 页面上的另一个 div 标记。我想在画布上添加主 div。

提前致谢。

【问题讨论】:

    标签: javascript jquery html css ajax


    【解决方案1】:

    您不能只将 HTML 渲染到画布中。相反,一种方法是使用包含您要呈现的内容的 SVG 图像。

    要绘制 HTML 内容,您可以使用包含 HTML 的 <foreignObject> 元素,然后将该 SVG 图像绘制到您的画布中。

    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    
    var data = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">' +
      '<foreignObject width="100%" height="100%">' +
      '<div xmlns="http://www.w3.org/1999/xhtml" style="font-size:40px">' +
      '<em>I</em> like ' +
      '<span style="color:white; text-shadow:0 0 2px blue;">' +
      'cheese</span>' +
      '</div>' +
      '</foreignObject>' +
      '</svg>';
    
    var DOMURL = window.URL || window.webkitURL || window;
    
    var img = new Image();
    var svg = new Blob([data], {
      type: 'image/svg+xml;charset=utf-8'
    });
    var url = DOMURL.createObjectURL(svg);
    
    img.onload = function() {
      ctx.drawImage(img, 0, 0);
      DOMURL.revokeObjectURL(url);
    }
    
    img.src = url;
    

    您可以找到更多信息here


    限制

    这种方法有很多局限性:

    • Edge 下的 IE 不支持 &lt;foreignObject&gt;,所以这根本不起作用 +它会污染画布,即使结果是空白rect,因为出于安全原因,这些浏览器会在绘制任何 svg 图像后立即执行此操作。

    • 出于安全原因,某些浏览器(至少 Safari 9)在画布上绘制 &lt;foreignObject&gt; 时会污染画布。

    • 有些元素的渲染很奇怪(&lt;button&gt; 在 FF 中没有任何样式,&lt;video&gt; 在某些 UA 上只是一个奇怪的东西......)。

    • 不会将外部资源加载到&lt;img&gt; 元素中,必须先将图像转换为 dataURL,必须将样式直接附加到 svg 中,或内联在 HTML 标签中,字体将具有进行 dataURL 编码。

    因此,如果您不介意使用库,最好的方法仍然是使用html2canvas

    如果您介意使用库,那么您可以尝试做它所做的事情:
    使用本机画布绘制方法绘制每个 HTML 元素及其样式。

    【讨论】:

    • 有趣的方法!
    • 感谢您的回答,但它实际上可能会转换为图像对吗?
    • @Jatin_g:是的。
    • 我不想创建 div 到图像 bcz 我用 jsPlumb 在生成的 div 之间画了线,我在线上应用了一些悬停和单击事件,现在我将它转换为图像那么怎么可能活动工作。?
    • @toskv 刚刚完成了编辑,请查看它,您可能不同意它......另外,我会写信给 MDN 的人,因为这篇文章不应该在这里,这更像是一个 hack而不是真正解决问题。
    【解决方案2】:

    canvas 是一个 HTML 元素,可用于使用脚本(通常是 JavaScript)绘制图形,因此无法在 canvas 元素内添加元素,但您可以使用 css position 来移动画布内的 div

    <div class="container">
    <canvas id="myCanvas" width="200" height="100"></canvas>
    <div id="myDiv"></div>
    </div>
    

    css:

    .container{postion: relative;}
    #myCanvas{background: red;}
    #myDiv{height: 50px;width: 50px;background: blue;
    position: absolute; top:10px;
    }
    

    JSFIDLE

    【讨论】:

    • 感谢您的重播和您的时间。
    • 我的回答对你有用吗?
    • opppppss,不,我想把div标签放到canvs中。
    【解决方案3】:

    画布实际上不能包含 div(或任何其他 HTML 标记),它是您可以在其上绘制的绘图表面。

    但您可以将 div 按 z 顺序放置在画布的顶部,例如:

    // Lower
    var ctx = document.getElementById("lower-canvas").getContext('2d');
    var path = new Path2D();
    path.arc(100, 100, 100, 0, Math.PI * 2, true);
    ctx.fillStyle = ctx.strokeStyle = "blue";
    ctx.fill(path);
    
    // Upper
    ctx = document.getElementById("upper-canvas").getContext('2d');
    path = new Path2D();
    path.arc(75, 75, 50, 0, Math.PI * 2, true);
    ctx.fillStyle = ctx.strokeStyle = "green";
    ctx.fill(path);
    #lower-canvas, #upper-canvas {
      width: 300px;
      height: 300px;
      position: absolute;
      left: 20px;
      top: 20px;
    }
    #upper-canvas {
      z-index: 2;
    }
    #the-div {
      position: absolute;
      left: 20px;
      top: 50px;
      z-index: 1;
      background-color: white;
    }
    <canvas id="lower-canvas" width="300" height="300"></canvas>
    <canvas id="upper-canvas" width="300" height="300"></canvas>
    <div id="the-div">This is the div</div>

    在该示例中,我们甚至不需要z-index,因为 div 是绝对定位的,但画布不是,并且默认情况下,定位元素位于比非定位元素“更接近”查看器的图层上。如果您正在定位画布,您需要添加类似 z-index: 10 的内容(使用任何合适的值)以确保 div 按定位层的顺序“更靠近”查看器。

    【讨论】:

    • 在这里,您在画布上绘制弧线。但是如果我们想把上面的 div 放在画布上。?
    • @Jatin_g:然后它就变得丑陋了,你需要单独的画布来存放你想要在 div 上的位和你想要在它下面的位。
    • 但是我还有一些其他的要求,需要按照我说的去做。
    • @Jatin_g:那么你至少需要两张画布。这很好,我们一直使用多个元素,真的,不是吗? :-)
    • 我可以用canvas替换div吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2015-03-24
    • 2012-06-02
    • 1970-01-01
    相关资源
    最近更新 更多