我已经找到了初始行为和解决方法的原因——而且都是 amCharts 特定的(与 SVG 本身无关),所以我相应地改写了标题。
发生的情况是,当 amCharts 创建 SVG 时,它需要(或至少决定)以绝对值定义宽度和高度。这些基于目标 div 的大小,通过offsetWidth
和offsetHeight
属性获得。
非活动选项卡具有display: none
属性集,因此这部分 DOM 甚至没有被渲染,因此对于两个 size 属性都返回零。这最终导致 amCharts 在chart.write
调用隐藏 div 时创建一个 0x0 SVG 图表。
调整大小可以解决问题,因为每个图表都会为窗口事件注册一个侦听器,该onresize
事件会调用图表的handleResize
方法。这会根据 div 的新(当前)尺寸强制重新计算宽度和高度。
所以总而言之,我认为有两种替代方法可以处理这个问题:
chart.write
当且仅当其选项卡可见时才调用图表。
handleResize
选项卡更改时调用每个图表的方法。
(第一个选项避免了渲染不可见图表的初始命中,但每次更改选项卡时都会重新绘制。后者会预先受到影响,但之后可能更快。对于奖励分数,最好的解决方案是在每次调整大小之间仅呈现每个图表一次,第一次变得可见,但这要复杂得多,因为它会涉及干扰默认事件侦听器等。)
更新:渲染不可见图表还有进一步的复杂性;特别是,我发现高度计算的问题没有考虑域轴所需的空间,因此将图表从其 div 中拉伸出来。这不是通过调用来解决的handleResize
-measureMargins
事先调用看起来应该可以工作,但没有。(可能还有另一种方法可以在此之后调用以使其工作,resetMargins
但此时它开始感觉非常不稳定......)
因此,我认为第一次在不可见的 div 上渲染图表是不切实际的,所以我结合了上面的项目符号。我倾听第一次可见图表的选项卡,然后调用chart.write
适当的图表对象 - 并且只要制表符更改,就会告知所有以前呈现的图表来处理调整大小。