我今天刚刚遇到了同样的问题 - 不是在移动设备上,而是在第一页加载时窗口大小很小。当页面加载时,图表被隐藏,然后在页面上进行一些选择后,我们创建图表。我们在 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 脚本后加载。