私は初期の動作と回避策の両方の理由を見つけました-そしてそれはすべてamCharts固有です(SVG自体とは関係ありません)ので、それに応じてタイトルを言い換えています。
何が起こるかというと、amChartsがSVGを作成するとき、絶対的な用語で幅と高さを定義する必要があります(または少なくとも決定する必要があります)。offsetWidth
これらは、およびoffsetHeight
プロパティを介して取得されたターゲットdivのサイズに基づいています。
非アクティブなタブにはdisplay: none
プロパティが設定されており、その結果、DOMのこの部分もレンダリングされないため、両方のサイズのプロパティに対してゼロが返されます。chart.write
これにより、非表示のdivに対してが呼び出されたときに、amChartsが0x0SVGチャートを作成することになります。
onresize
各チャートは、チャートのhandleResize
メソッドを呼び出すウィンドウイベントにリスナーを登録するため、サイズ変更により問題が修正されます。これにより、divの新しい(現在の)寸法に基づいて幅と高さが再計算されます。
したがって、結論として、これを処理するための2つの代替方法があると思います。
chart.write
タブが表示されたときにのみチャートを呼び出します。
handleResize
タブが変更されたら、各チャートのメソッドを呼び出します。
(最初のオプションは、非表示のグラフをレンダリングする最初のヒットを回避しますが、タブが変更されるたびに完全に再描画します。後者は前もってヒットしますが、その後は速くなる可能性があります。ボーナスマークの場合、最善の解決策は次のとおりです。各チャートを各サイズ変更の間に1回だけレンダリングし、最初に表示されるようにしますが、デフォルトのイベントリスナーなどに干渉するため、これははるかに複雑です。)
更新:非表示のグラフのレンダリングにはさらに複雑な問題があります。特に、ドメイン軸に必要なスペースが考慮されていないため、チャートをそのdivから引き伸ばす高さの計算に問題があることがわかりました。これは電話で修正されませんでしたhandleResize
-measureMargins
事前に電話をかけるとうまくいくように見えましたが、うまくいきませんでした。(この後、それを機能させるために呼び出すことができる別のメソッドがおそらくありますresetMargins
が、この時点でそれは非常に不安定に感じ始めました...)
そのため、非表示のdivで初めてグラフをレンダリングするのは実用的ではないと思うので、上記の箇条書きをいくつか組み合わせて使用しました。グラフのタブが初めて表示されるのを聞いてからchart.write
、適切なグラフオブジェクトを呼び出します。タブが変更されるたびに、以前にレンダリングされたすべてのグラフがサイズ変更を処理するように指示されます。