【问题标题】:Chart.js in flex element overflows instead of shrinkingflex 元素中的 Chart.js 溢出而不是收缩
【发布时间】:2022-03-09 01:11:46
【问题描述】:

我已经尝试在 chart.js 的包装 div 上将 min-width 设置为 0,但是如果你拖动窗口,图表会增长,然后不会缩小。

我想不通!我唯一能做的就是将宽度设置为 99%,但图表不再与我的其他 div 对齐。我已经为此工作了几天,请帮助!

问:如何让 chart.js 达到 100% 的宽度,并增大/缩小到它的边界大小。

要重现,请转到示例,如果关闭菜单,图表会变大,如果打开它,图表不会缩小。它保持它的大小并向右溢出。

注意:我的实际项目有图表和侧栏两个独立的组件。所以 calc 解决方案在这种情况下不起作用,我不想紧密耦合任何组件以保持良好的做法。

Here is my StackBlitz working example

这里有图片展示复制品:

  1. 图表大小合适,菜单打开

  2. 关闭菜单时图表会变大(大小仍然正确)

  3. 打开菜单,图表向右溢出

【问题讨论】:

  • 你的问题不是很清楚。无法弄清楚您要达到的目标。您是否期待在页面上有两个并排且宽度灵活的 div?或者无论页面上存在什么 div,您都想要一个完整的聊天?
  • 我更新了示例。基本上,如果你关闭菜单,图表会变大,如果你打开它,图表不会缩小。它保持它的大小并向右溢出。
  • 现在更清楚了。看看我的回答。
  • 我无法让 stackblitz 运行(由于 Firefox 中的跟踪保护导致 JS 错误)所以我无法验证这一点(因此评论而不是答案),但我在我的 flex 中遇到了那个确切的问题布局并通过确保在父(和祖先)flex元素上设置overflow: hidden来解决它。粗略查看一下您的 CSS 会发现这仅在 .page-wrapper 上完成。
  • @timclutton 老兄!使用它和 min-width: 0;让它工作!发表你的答案,我会给你一些分数

标签: javascript html css flexbox chart.js


【解决方案1】:

(复制自my comment。)

我无法让 StackBlitz 运行(由于 Firefox 中的跟踪保护导致 JS 错误),所以我无法验证这一点,但我在我的 flex 布局中遇到了那个确切的问题,并通过确保设置了 overflow: hidden 来解决它父(和祖先)弹性元素。粗略查看一下您的 CSS 会发现这仅在 .page-wrapper 上完成。

【讨论】:

  • 您到底是如何设法得到这个解决方案的?你救了我的一天! :)
  • 这不再有效
  • 对我来说它仍然有效,tysm
  • 谁能谈谈为什么会这样?
【解决方案2】:

更新:此解决方案停止使用 chart.js 3

我在使用这样的标记时遇到了类似的问题:

<div style="display: flex; flex-direction: column">
  <h2>...</h2>
  <div class="chart-container" style="position: relative; flex: 1">
    <canvas></canvas>
  </div>
  <span>...</span>
  <span>...</span>
</div>

我最外层的 div 在 css-grid 中,也许这也起到了作用。

无论如何,我诊断出问题是这样的:即使我将{ responsive: true, maintainAspectRatio: false } 应用于chart.js 的选项,图表的大小也是固定的,这导致图表容器不会缩小(即使overflow: hidden被应用了,我不完全明白为什么)。这导致 chartjs 插入的 div 元素检测大小变化时不会改变其高度。

因此解决方案是简单地将画布上的高度覆盖为 100%: canvas {height: 100%!important}

这允许画布容器缩小,从而导致尺寸检测 div 缩小,从而导致重新渲染画布,从而防止出现纵横比问题。

【讨论】:

    【解决方案3】:

    在这里,您的画布在绝对父级内具有宽度,因此建议使用 JavaScript 动态更改值(在您的情况下为角度)。但是由于您正在寻找基于 CSS 的解决方案,您可以在 app.components.css 文件中添加以下内容:

    .sidebar-wrapper.shrink + div.main-wrapper canvas {
      width: calc(100vw - 40px) !important;
    }
    .sidebar-wrapper:not(.shrink) + div.main-wrapper canvas {
      width: calc(100vw - 230px) !important;
    }
    

    这是工作示例:https://chartjs-overflow-ex-vlsqmn.stackblitz.io/

    【讨论】:

    • 啊开枪。有什么办法可以兼容旧版本的IE?几个较旧的浏览器不支持 vw,我可能是错的,但几个较旧的浏览器也不支持 css 中的计算。
    • 是的,% 而不是 wv 可以正常工作,只是你需要稍微调整一下值。
    • @FussinHussin 如果它适合您,请选择答案,如果您对解决方案有任何疑问,请告诉我。谢谢。
    • 我要试试,我有一个问题,因为这些组件在两个单独的文件中。
    • 你知道弹性盒解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    相关资源
    最近更新 更多