将 Svg 复制路径组从纸张捕捉到纸张 2,适合响应式 div

Posted

技术标签:

【中文标题】将 Svg 复制路径组从纸张捕捉到纸张 2,适合响应式 div【英文标题】:Snapsvg copy path group from paper1 to paper2, fit inside responsive div 【发布时间】:2017-08-31 12:52:55 【问题描述】:

JSFIDDLE here of my issue. 巴西区域应该在模态中加载。

学习snap 并尝试从世界地图中获取一个区域并将其复制到引导模式中。因此,点击一个区域,该区域本身的图像将用于模态。

我已经实现了这一点,但形状偏离了新画布的右侧。我知道这与viewbox 和转换克隆的 svg 组的坐标有关。我如何“使形状适合视图框?

这是我复制图像的代码,这当然行不通。

var m = Snap('#world-map');
var d = Snap('#svg-region');
var regionSVG = m.select('#Brazil');
var p = Snap.parse(regionSVG);
var g = d.append(p);

这可以复制 SVG 内容,但在模态框上不可见。检查时我可以看到它在右边。如何在引导程序的 svg 中将 Brazil svg 组(例如)居中?

【问题讨论】:

您是否将 <g> 放入正确的 SVG XML 代码中?或者只是把它扔在那里,在模态里? 您好,SVG 已正确放置在 html 中。在检查时,我看到“形状”在 svg 视图框的右侧。这是因为它来自一个大地图文件,并且一直位于 0, 0 的右侧。我需要调整它的大小并相对于 0,0 重新定位它。 bbox 的左上角排序 = 0,0 如果你在 jsfiddle 上提供一个最小的例子会很有用。基本上我可能会考虑在元素上做一个 getBBox(),然后考虑它的 x,y,width,height,修改 svg viewBox 以考虑到这一点。 嗨@Ian,我添加了一个JSFiddle。谢谢 【参考方案1】:

首先,您可能想要 clone() 巴西 g 元素,或者可能使用 'use' 元素来引用它。

在这种情况下,我只是简单地克隆了它,并将其添加到模态 svg...

var p = regionSVG.clone();
d.append(p);

然后我们可以得到边界框,并从中创建一个 viewBox...

var bb = regionSVG.getBBox();    
var vb = bb.x + ' ' + bb.y + ' ' + bb.width + ' ' + bb.height;
d.attr( viewBox: vb)

嘿,马上,它现在应该有巴西地图了。

您可能希望每次都对模态元素中的元素执行 remove() 之类的操作以进行清理。

jsfiddle

【讨论】:

嗨@Ian,你摇滚!谢谢你。 嘿@Ian,谢谢。我对 SVG 非常陌生,无法处理概念。您对如何使提取的区域彼此保持相同的比例有什么建议吗?谢谢! 你的意思是纵横比还是比例(所以一个小国家看起来很小)。 我想保留纵横比,但让每个区域都按比例显示。所以小的会变小,大的会更占空间。我正在尝试锁定以模态为中心的 200x200 px 框,然后用 svg 填充此空间,并在 svg 视口中以缩放为中心的区域。我已经做了几个小时了!感谢您的帮助! 有点像设置zoom: 05,然后所有图像都以原始大小的一半相对于彼此渲染。

以上是关于将 Svg 复制路径组从纸张捕捉到纸张 2,适合响应式 div的主要内容,如果未能解决你的问题,请参考以下文章

使用 PrintDocument 打印图像。如何调整图像以适合纸张尺寸

Java PDF页面设置——页面大小页边距纸张方向页面旋转

如何将纸张的宽度扩大到最大宽度但保持灵活性?

[Q]关于不同比例不同纸张大小图纸的批量打印

WebGl简单实践-烧灼纸张效果[转]

在fastReport中怎样使用自定义的纸张大小