La bibliothèque renvoie une image vide lorsque le corps du document fait plus de 30 000 pixels. Vous essaieriez de capturer un élément de 100 x 100. Mais vous obtenez une image vierge de l'élément sur un grand corps.
Voici un violon qui démontre cette erreur.
https://jsfiddle.net/fvo1xh8b/2/
Vous pouvez changer la taille du corps à moins de 30 000 et cela fonctionne bien.
J'ai exactement le même problème que toi. Avez-vous trouvé une solution à cela?
euh, j'ai le même problème, mais finalement, j'ai compris !
dans mon cas, voici ma solution:
mettre un iframe dans votre élément de corps, comme
<html>
<head>
#canvas_handler {
position:absolute;
left: -10000px;
}
</head>
<body>
<iframe id="canvas_handler" />
</body>
</html>
et chaque élément que vous devez convertir en canvas, vous pouvez les copier et les mettre dans cet iframe, et utiliser html2canvas, puis le supprimer, comme ceci
const copy_ele = origin_ele.cloneNode(true);
canvas_handler.appendChild(copy_ele);
canvas_handler.style.height = origin_ele.scrollHeight;
canvas_handler.style.width = origin_ele.scrollWidth;
html2canvas(copy_ele, {
useCORS: true,
}).then((canvas) => {
// do your things
});
canvas_handler.removeChild(table_ele);
Ce problème a été automatiquement fermé car il n'y a pas eu de réponse à notre demande d'informations supplémentaires de la part de l'auteur d'origine. Avec seulement les informations qui sont actuellement dans le problème, nous n'avons pas assez d'informations pour prendre des mesures. Veuillez nous contacter si vous avez ou trouvez les réponses dont nous avons besoin afin que nous puissions approfondir nos recherches.
salut, lorsque j'essaie de filtrer un iframe avec une caméra ip interne, cela renvoie une image vide, pouvez-vous m'aider s'il vous plaît?
@niklasvh C'est difficile mais c'est en fait dû aux limitations de la taille de la toile. Je pense que cela doit être réouvert pour discuter de la façon de mettre en œuvre les bons comportements. Une image blanchie à la chaux n'est certainement pas le comportement correct.
Dans mon cas, je clone tout le corps et je définis simplement la largeur/hauteur maximale : html2canvas(el, {height: 3000, width: 3000})
.
@toadkicker frère, tu
@toadkicker Merci !
euh, j'ai le même problème, mais finalement, j'ai compris !
dans mon cas, voici ma solution:
mettre un iframe dans votre élément de corps, comme<html> <head> #canvas_handler { position:absolute; left: -10000px; } </head> <body> <iframe id="canvas_handler" /> </body> </html>
et chaque élément que vous devez convertir en canvas, vous pouvez les copier et les mettre dans cet iframe, et utiliser html2canvas, puis le supprimer, comme ceci
const copy_ele = origin_ele.cloneNode(true); canvas_handler.appendChild(copy_ele); canvas_handler.style.height = origin_ele.scrollHeight; canvas_handler.style.width = origin_ele.scrollWidth; html2canvas(copy_ele, { useCORS: true, }).then((canvas) => { // do your things }); canvas_handler.removeChild(table_ele);
J'ai essayé cette méthode, mais ne fonctionne pas exactement. À ma façon, fonctionnera avec le code ci-dessous :
const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
useCORS: true,
}).then((canvas) => {
// do your things
canvas_handler.removeChild(copy_ele);
});
Et si vous souhaitez appliquer votre style CSS de la même manière que dans le document actuel, vous devez également copier le style dans l'iframe :
// add style
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'your_style_file_url.css';
canvas_handler.contentDocument.head.appendChild(link);
const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
useCORS: true,
}).then((canvas) => {
// do your things
canvas_handler.removeChild(copy_ele);
});
Encore une fois, il s'agit d'une limitation dans le navigateur lui-même et cette bibliothèque ne gère pas correctement l'erreur. Aucune solution de codage en dehors de la limitation du nombre de pixels capturés ne le changera.
euh, j'ai le même problème, mais finalement, j'ai compris !
dans mon cas, voici ma solution:
mettre un iframe dans votre élément de corps, comme<html> <head> #canvas_handler { position:absolute; left: -10000px; } </head> <body> <iframe id="canvas_handler" /> </body> </html>
et chaque élément que vous devez convertir en canvas, vous pouvez les copier et les mettre dans cet iframe, et utiliser html2canvas, puis le supprimer, comme ceci
const copy_ele = origin_ele.cloneNode(true); canvas_handler.appendChild(copy_ele); canvas_handler.style.height = origin_ele.scrollHeight; canvas_handler.style.width = origin_ele.scrollWidth; html2canvas(copy_ele, { useCORS: true, }).then((canvas) => { // do your things }); canvas_handler.removeChild(table_ele);
J'ai essayé cette méthode, mais ne fonctionne pas exactement. À ma façon, fonctionnera avec le code ci-dessous :
const copy_ele = origin_ele.cloneNode(true); canvas_handler.contentDocument.body.appendChild(copy_ele); canvas_handler.height = origin_ele.scrollHeight; canvas_handler.width = origin_ele.scrollWidth; html2canvas(canvas_handler.contentDocument.body, { useCORS: true, }).then((canvas) => { // do your things canvas_handler.removeChild(copy_ele); });
Et si vous souhaitez appliquer votre style CSS de la même manière que dans le document actuel, vous devez également copier le style dans l'iframe :
// add style const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = 'your_style_file_url.css'; canvas_handler.contentDocument.head.appendChild(link); const copy_ele = origin_ele.cloneNode(true); canvas_handler.contentDocument.body.appendChild(copy_ele); canvas_handler.height = origin_ele.scrollHeight; canvas_handler.width = origin_ele.scrollWidth; html2canvas(canvas_handler.contentDocument.body, { useCORS: true, }).then((canvas) => { // do your things canvas_handler.removeChild(copy_ele); });
dans mon cas, tous les éléments sont de style svg ou en ligne, je n'ai donc pas besoin d'ajouter de feuille de style. mais oui, vous devriez ajouter votre feuille de style si besoin
J'ai été confronté au même problème. J'avais besoin de faire une image à partir de la fenêtre modale (avec position fixe). J'ai toujours reçu une image blanche. Le problème était dans la position de défilement. Ce code fonctionne pour moi :
const el = document.getElementById('html-to-canvas-area')
const area = el.getBoundingClientRect()
html2canvas(el, {
scrollX: 0,
scrollY: 0,
width: area.width,
height: area.height
})
A fonctionné pour moi comme un charme! Merci pour la solution intelligente!
@invisor bouée de sauvetage ! C'est la seule chose qui a fonctionné pour moi.
Ces options peuvent également être une solution pour faire défiler les cas liés
{
scrollX: 0,
scrollY: -window.scrollY
}
Commentaire le plus utile
@niklasvh C'est difficile mais c'est en fait dû aux limitations de la taille de la toile. Je pense que cela doit être réouvert pour discuter de la façon de mettre en œuvre les bons comportements. Une image blanchie à la chaux n'est certainement pas le comportement correct.
Dans mon cas, je clone tout le corps et je définis simplement la largeur/hauteur maximale :
html2canvas(el, {height: 3000, width: 3000})
.