首先,我对SVG有点陌生。我刚刚开始为我所在地区支持的产品制定具有甘特式风格的时间表/路线图。每个项目都有一个类别和子类别,然后有多个版本。每个产品最终都作为自己的单独微型图表。SVG是由产生的d3.js
,但是问题似乎与JavaScript无关。
SVG示例在这里:http : //plnkr.co/edit/ipqZIZODDN4lYKVeLt73
从根本上讲g
,应该将两组堆叠在一起。在示例中,分别有红色和蓝色轮廓。蓝色组应位于红色组的正下方。为了定位蓝色组,我使用来测量红色组的高度getBBox
。然后,我transform
在蓝色组上使用该高度和属性。
以下是相关的组:
<g class="product" transform="translate(0,0)" style="outline: thin solid red">...</g>
<g class="product" transform="translate(0,122)" style="outline: thin solid blue">...</g>
注意: 这些组包含在许多其他组中,但是没有转换(除外translate(0,0)
)应用于这些组。
在示例中,如果您使用chrome inspector来测量红色组的高度,则为121像素:
因此,用于translate
蓝色组的122应该很好。但是,渲染时,红色和蓝色组明显重叠:
实际上,如果您在Chrome浏览器中调整数字,则需要143像素的偏移量:transform="translate(0,143)"
,在两组按照我希望的方式对齐之前:
翻译单位不是以像素为单位吗?我没有看到任何明显的理由,除非如此,否则122单位转换不会移动组122像素。它确实在IE11中呈现了相同的方式,因此它一定是关于SVG或我不知道的此标记的。
有人有什么想法吗?
更新今天早上,我拍了一些屏幕截图并测量了盒子的像素值。确实,蓝色框的高度为121像素,getBBox
而我使用过的各种浏览器检查器都建议这样做。然后,我测量了偏移量,发现应该向下转换122像素的像素实际上只有100像素。此外,如果使用手动校正的平移(向下143像素),则将测量正确的121像素偏移:
问题出现在IE11,IE11-Edge(Spartan),Chrome 40和Firefox 36中。在每个现代浏览器呈现几乎相同的效果的情况下,标记必须是问题,对吗?那么缺少的22个像素在哪里呢?
您缺少的概念是SVG组元素(<g>
)没有尺寸。(它们不像HTML<div>
元素。)因此,在组元素上定义的转换只是简单地级联到任何具有大小的元素。为了简单起见,忽略了轴和标签,“底部”图中的“最顶部”元素是条形图:
<rect x="237.36726634488812" y="4" height="15" width="6.529179464677469"></rect>
这<rect>
确实是转化了的122个像素在垂直方向上,你可以在一个屏幕捕获测量翻译。(然后以4像素的ay值定位。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句