如何根据容器尺寸的变化调整 Morris.js 图表的大小

Posted

技术标签:

【中文标题】如何根据容器尺寸的变化调整 Morris.js 图表的大小【英文标题】:How to resize Morris.js chart on changes to container dimensions 【发布时间】:2016-05-29 22:44:22 【问题描述】:

我尝试将 Morris js 圆环图放入带有 2 个 flex 项的 flex 容器中,我希望 flex: 1 容器中的图表会调整大小,但事实并非如此。有谁知道如何使图表在弹性项目中响应?

这是我的示例 example 尝试调整它的大小

JS:

$(function () 
    Morris.Donut(
        element: 'container',
        resize: true,
        data: [
            label: "Download Sales", value: 12,
            label: "In-Store Sales", value: 30,
            label: "Mail-Order Sales", value: 20
        ]
    );

CSS:

html, body 
height: 100%;
margin: 0;


body 
    display: -webkit-flex;


#container 
  flex: 1;


.flex1 
  flex: 1;
  border: 1px solid red;

【问题讨论】:

【参考方案1】:

我的解决方案是监听调整大小事件。如果您在过去一秒内有任何调整大小事件,则调整图表大小。这样您就不会错过任何窗口调整大小。

var haveToResizeCharts = false;

$(window).resize(function() 
    haveToResizeCharts = true;
);

setInterval(function() 
    if(haveToResizeCharts) 
        chart1.redraw();
        chart2.redraw();
        haveToResizeCharts = false;
    
, 1000);

thedarklord47 的回答部分错误,因为如果您在过去 200 毫秒内已经调整大小,则最终调整大小无效!

【讨论】:

【参考方案2】:

添加一个$(window).on('resize', ...) 事件处理程序,然后调用图形redraw() 函数。

如果有一个动态 UI 元素导致布局根据用户输入“弹性”,您将需要在那里调用 redraw() 并且无法直接监听 div 的大小调整。

这是你的小提琴,已更新修复。

jsFiddle

另外,这是来自 Morris.js 开发者的注释

注意:我建议您谨慎调用 redraw(),因为它是一项相当昂贵的操作。尝试使用 setTimeout 技巧或类似技巧来避免在中间调整大小事件中调用它。

注意这个建议的方法如下:

$(window).on('resize', function() 
   if (!window.recentResize) 
      window.m.redraw();
      window.recentResize = true;
      setTimeout(function() window.recentResize = false; , 200);
   
);

这是一个实现的小提琴:

jsFiddle

【讨论】:

很高兴我能帮上忙!另外,由于您似乎是 *** 的新手,我只是想提醒一下答案左侧有一个灰色复选标记。单击它会将其变为绿色,这是表示答案已解决您的问题的方式。选择一个答案会给你和回答的人带来声誉点数:)

以上是关于如何根据容器尺寸的变化调整 Morris.js 图表的大小的主要内容,如果未能解决你的问题,请参考以下文章

当视图宽度发生变化时,如何使 UILabel 正确调整其尺寸?

WPF的窗口中的所有内容随窗口大小变化而同步变化

chemdraw两部分链接的大小不一样怎么调整

使用 HTML 和 CSS 打印标签。如何根据标签的高度和宽度调整标签和容器的大小?

弹性盒布局display:flex详解

随着屏幕尺寸的变化不断调整元素尺寸