今日、同じ問題に遭遇しました-モバイルではなく、最初のページの読み込み時にウィンドウのサイズが小さくなりました。ページが読み込まれると、チャートは非表示になり、ページでいくつかの選択を行った後、チャートを作成します。css でコンテナーの最小幅と最大幅を設定しましたが、幅は設定していません。
グラフを作成するときは、SVG を作成するための寸法を決定する必要があります。 グラフが非表示になっているため、寸法を適切に取得できないため、コードはグラフ コンテナーを複製し、画面外に配置して本体に追加し、高さ/幅を決定できるようにします。
幅が設定されていないため、複製された div は、設定した最大幅まで、できるだけ多くのスペースを取ろうとします。SVG 要素はその幅を使用して作成されますが、(画面のサイズに基づいて) 現在より小さいグラフ コンテナー div に追加されます。その結果、グラフはコンテナー div の境界を超えて拡張されます。
グラフが最初にレンダリングされた後、画面上の寸法が認識され、クローン関数は呼び出されません。これは、ウィンドウのサイズを変更したり、チャート データをリロードしたりすると、チャートのサイズが正しくなることを意味します。
cloneRenderTo
ディメンションを取得するために div のクローンを作成する Highcharts 関数をオーバーライドすることで、この初期ロードの問題を回避しました。
(function (H) {
// encapsulated variables
var ABSOLUTE = 'absolute';
/**
* override cloneRenderTo to get the first chart display to fit in a smaller container based on the viewport size
*/
H.Chart.prototype.cloneRenderTo = function (revert) {
var clone = this.renderToClone,
container = this.container;
// Destroy the clone and bring the container back to the real renderTo div
if (revert) {
if (clone) {
this.renderTo.appendChild(container);
H.discardElement(clone);
delete this.renderToClone;
}
// Set up the clone
} else {
if (container && container.parentNode === this.renderTo) {
this.renderTo.removeChild(container); // do not clone this
}
this.renderToClone = clone = this.renderTo.cloneNode(0);
H.css(clone, {
position: ABSOLUTE,
top: '-9999px',
display: 'block' // #833
});
if (clone.style.setProperty) { // #2631
clone.style.setProperty('display', 'block', 'important');
}
doc.body.appendChild(clone);
//SA: constrain cloned element to width of parent element
if (clone.clientWidth > this.renderTo.parentElement.clientWidth){
clone.style.width = '' + this.renderTo.parentElement.clientWidth + 'px';
}
if (container) {
clone.appendChild(container);
}
}
}
})(Highcharts);
この関数は、Highchart.js スクリプトが読み込まれた後に読み込まれる別のスクリプト ファイルに保存しました。