Версия: 1.0.0-alpha.9
Проблема: похоже, что классы, применяемые к элементам SVG (и их дочерним элементам), не применяются к экспортированным изображениям.
Однако, если эти стили применяются во встроенном атрибуте style, они применяются правильно.
Я заметил, что с шрифтом, цветом и заливкой возникают проблемы.
скрипка: http://jsfiddle.net/patgoins/2d90yop3/
--Примеры--
Экспортированное изображение:
Просмотр HTML:
У меня очень похожая проблема с некоторыми диаграммами SVG, которые есть в моем приложении.
Мне просто интересно, знает ли кто-нибудь из команды HTML2Canvas или кто-либо на этом форуме, почему возникает эта проблема?
Я не знаю, можно ли назвать это «исправлением», но я придумал обходной путь для этой проблемы.
Суть этого обходного пути состоит в выявлении проблемных свойств CSS, которые не отображаются, а затем в сканировании dom и встраивании этих стилей везде, где они находятся в элементе.
Следующий код - это TypeScript, но его можно легко изменить для ванильного JS. Я вызываю этот метод непосредственно перед вызовом метода html2canvas (..):
private setInlineStyles(targetElem: HTMLElement) {
const transformProperties = [
'fill',
'color',
'font-size',
'stroke',
'font'
];
let svgElems = Array.from(targetElem.getElementsByTagName("svg"));
for (let svgElement of svgElems) {
recurseElementChildren(svgElement);
}
function recurseElementChildren(node: SVGSVGElement | HTMLElement) {
if (!node.style)
return;
let styles = getComputedStyle(node);
for (let transformProperty of transformProperties) {
node.style[transformProperty] = styles[transformProperty];
}
for (let child of Array.from(node.childNodes)) {
recurseElementChildren(child as SVGSVGElement);
}
}
}
targetElem
- это просто ссылка на элемент html и может быть отдельным элементом SVG или даже целым элементом <body>
если вы захотите
У меня аналогичная проблема, но разница в том, что содержимое svg, которое выходит из элемента svg, не отображается, по умолчанию в "таблице стилей пользовательского агента" указано, что переполнение svg скрыто, но у меня есть класс для элемента svg, где у меня есть замените свойство переполнения на «overflow: visible! important;». но все же, хотя я пытался применить свойство переполнения во время выполнения непосредственно перед вызовом функции html2canvas (...), похоже, это не сработало.
Обход более чем хорош, но я думаю, что эту проблему не следует закрывать.
Да, кстати, по какой-то странной причине (август 2020 г.) стили классов отлично работают для firefox и chrome. Только Safari здесь остается проблемным
такая же проблема здесь. Firefox и Chrome в порядке. Но у сафари есть такая проблема.
Самый полезный комментарий
Я не знаю, можно ли назвать это «исправлением», но я придумал обходной путь для этой проблемы.
Суть этого обходного пути состоит в выявлении проблемных свойств CSS, которые не отображаются, а затем в сканировании dom и встраивании этих стилей везде, где они находятся в элементе.
Следующий код - это TypeScript, но его можно легко изменить для ванильного JS. Я вызываю этот метод непосредственно перед вызовом метода html2canvas (..):
targetElem
- это просто ссылка на элемент html и может быть отдельным элементом SVG или даже целым элементом<body>
если вы захотите