能够将普通元素临时转换为canvas
会非常有用。例如,假设我有一个经过样式化的div
元素,我想要翻转它。我需要动态创建一个画布,将HTMLElement
渲染到画布中,隐藏原始元素并动画显示画布。
这个能做到吗?
有一个库试图实现你所说的功能。
可以查看这些示例并获取代码:
http://hertzen.com/experiments/jsfeedback/
http://html2canvas.hertzen.com/
它会读取HTML中的DOM,并将其呈现在画布上,虽然在某些情况下可能会失败,但总体上是有效的。
看一下这个在MDN上的教程:https://developer.mozilla.org/en/HTML/Canvas/Drawing_DOM_objects_into_a_canvas (已存档)
它的关键技巧是:
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;
也就是说,它使用了一个临时的SVG图像将HTML内容作为“外部元素”包含进来,然后将该SVG图像渲染到画布元素中。然而,在这种方式下,你可以在SVG图像中包含的内容受到重要的限制。(有关详细信息,请参见“安全性”部分-基本上由于隐私和跨域问题,它比iframe或AJAX更受限制。)
抱歉,浏览器无法将HTML渲染到画布中。
如果可以的话,这可能会成为一个潜在的安全风险,因为HTML可以包含来自第三方网站的内容(特别是图像和iframes)。如果canvas
可以将HTML内容转换为图像,然后读取图像数据,您可能会从其他网站提取特权内容。
要从HTML获取画布,您基本上必须使用drawImage
和fillText
编写自己的HTML渲染器,这是一个潜在的巨大任务。有一种尝试在此处,但它有点不安全,并且离完整还有很长的路要走。(它甚至尝试从头开始解析HTML/CSS,我认为这太疯狂了!最好从已应用样式的真实DOM节点开始,并使用getComputedStyle
读取样式以及使用offsetTop
等相对位置来读取其部分。)
<iframe src="https://example-online-bank.com/mystatement">
将目标页面包含在我的文档中,但我没有通过DOM访问该页面的任何内容,并且不应该能够通过截屏来访问该信息。 - bobince您可以使用dom-to-image库(我是维护者)。
以下是您解决问题的方法:
var parent = document.getElementById('my-node-parent');
var node = document.getElementById('my-node');
var canvas = document.createElement('canvas');
canvas.width = node.scrollWidth;
canvas.height = node.scrollHeight;
domtoimage.toPng(node).then(function (pngDataUrl) {
var img = new Image();
img.onload = function () {
var context = canvas.getContext('2d');
context.translate(canvas.width, 0);
context.scale(-1, 1);
context.drawImage(img, 0, 0);
parent.removeChild(node);
parent.appendChild(canvas);
};
img.src = pngDataUrl;
});
基于natevw引用的Mozdev文章,我开始了一个小项目,可以在Firefox、Chrome和Safari中将HTML渲染到画布上。因此,例如,您可以简单地执行以下操作:
rasterizeHTML.drawHTML('<span class="color: green">This is HTML</span>'
+ '<img src="local_img.png"/>', canvas);
源代码和更详细的示例在这里。
抱歉,没有这样的东西。
尽管规范说明:
未来版本的2D上下文API可能会提供一种将使用CSS呈现的文档片段直接渲染到画布上的方法。
这可能是你能得到的最接近的东西了。
很多人想要像 ctx.drawArbitraryHTML/Element
这样的功能,但是没有内置的功能可以实现。
唯一的例外是Mozilla独有的 drawWindow
,它将DOM窗口的内容快照绘制到画布上。该功能仅适用于具有Chrome(“本地”)特权的代码。在普通的HTML页面中不允许使用它。因此,您可以将其用于编写类似于此示例中的FireFox扩展,但仅限于此。
<div>
和<ol>
以及任何你想要的HTML标记,这样就不需要进行转换了。以下是一些演示和源代码解释,让你看到并学习:http://www.webdesignerwall.com/trends/47-amazing-css3-animation-demos/
下面的代码可以用于两种模式,模式1将HTML代码保存为图像,模式2将HTML代码保存为画布。
此代码与库一起使用:https://github.com/tsayen/dom-to-image
*“id_div”是要转换的HTML元素的ID。
**“canvas_out”是包含画布的div的ID,因此请尝试此代码。
function Guardardiv(id_div){
var mode = 2 // default 1 (save to image), mode 2 = save to canvas
console.log("Process start");
var node = document.getElementById(id_div);
// get the div that will contain the canvas
var canvas_out = document.getElementById('canvas_out');
var canvas = document.createElement('canvas');
canvas.width = node.scrollWidth;
canvas.height = node.scrollHeight;
domtoimage.toPng(node).then(function (pngDataUrl) {
var img = new Image();
img.onload = function () {
var context = canvas.getContext('2d');
context.drawImage(img, 0, 0);
};
if (mode == 1){ // save to image
downloadURI(pngDataUrl, "salida.png");
}else if (mode == 2){ // save to canvas
img.src = pngDataUrl;
canvas_out.appendChild(img);
}
console.log("Process finish");
});
}
所以,如果你想保存图片,只需添加这个函数:
function downloadURI(uri, name) {
var link = document.createElement("a");
link.download = name;
link.href = uri;
document.body.appendChild(link);
link.click();
}
使用示例:
<html>
<head>
</script src="/dom-to-image.js"></script>
</head>
<body>
<div id="container">
All content that want to transform
</div>
<button onclick="Guardardiv('container');">Convert<button>
<!-- if use mode 2 -->
<div id="canvas_out"></div>
</html>
如果这个有效,请发表评论。
如果对您有帮助,请留言 :)
function convert() {
dom = document.getElementById('divname');
var script,
$this = this,
options = this.options,
runH2c = function(){
try {
var canvas = window.html2canvas([ document.getElementById('divname') ], {
onrendered: function( canvas ) {
window.open(canvas.toDataURL());
}
});
} catch( e ) {
$this.h2cDone = true;
log("Error in html2canvas: " + e.message);
}
};
if ( window.html2canvas === undefined && script === undefined ) {
} else {.
// html2canvas already loaded, just run it then
runH2c();
}
}