【发布时间】:2019-08-13 15:44:45
【问题描述】:
之前我做了this question。
我尝试了已经提出的类似问题中链接的解决方案(使用grid 而不是flex),但我遇到了一些问题。
我必须建立一个图表网格(条形图)。我的数据集可以按天或按月聚合。 显然,如果数据按月汇总,则柱的数量远小于按天汇总数据时的柱数。 图的宽度与条的数量成正比。
为了显示我的问题,我创建了这些简单的图像:每个矩形代表一个条形图(就像一个占位符)。 较大的矩形表示按天汇总数据时的条形图,较窄的条形图表示按月汇总数据时的条形图。
在这个例子中,我假设我的数据集由 6 个图表组成。 我知道图表的宽度,因为它只是条形宽度的条形数。 我希望自动定位数据。
每行中的图表不能超过两个,一个图表和另一个图表之间必须有一些空间,并且最后一行(如果不完整)必须使图表向左对齐。最后一个请求是使用Flex不正确的原因,所以我切换到了Grid。
所以,如果数据按天聚合,我希望图表如下:
如果数据按月份汇总,图表如下:
我尝试使用以下代码使用 CSS 网格:
<div
className="relative ba b--black"
style={{
display: 'grid',
gridTemplateColumns: `repeat(auto-fit, minmax(45%, 1fr))`,
gridAutoRows: SVG_HEIGHT,
gridGap: '10px 5px', // space h, space v
}}
>
{
data.map((plot, plotIdx) => {
return (
<div
key={plotIdx}
className="ba b--black overflow-x-auto"
onScroll={this.handleHorizontalScroll(plotIdx)}
>
<svg
width={SVG_WIDTH}
height={CHART_HEIGHT + MARGINS.bottom + MARGINS.top}
>
// other code...
</svg>
</div>
)
})
}
</div>
(每个图表可以有很大的宽度,所以有一个水平滚动)。
现在的问题是,如果图表小于容器,即使实际尺寸,每个绘图的单元格始终相同。
按天汇总的数据:
按月份汇总的数据:
如果我在minmax 语句中使用SVG_WIDTH 代替45%,我得到:
如果数据是按天汇总的,而这个数据是按月汇总的:
我没有使用px,谢谢!现在它适用于按月聚合的情况,但不适用于按天聚合的情况。
按天(不起作用):
按月(作品):
问题是每个图都应该有一个水平滚动实际上如果SVG_WIDTH大于父亲div的大小,那么我需要添加一个滚动。
这是我使用的代码:
<div
className="relative ba b--black"
style={{
display: 'grid',
gridTemplateColumns: `repeat(auto-fit, minmax(${SVG_WIDTH}px, 1fr))`,
gridAutoRows: PLOT_HEIGHT,
gridGap: '10px 5px', // space h, space v
}}
>
{data.map((plot, plotIdx) => {
const yScale = this.yScale(plot)
const yAxisTicks = yScale.ticks(4)
return (
<div
key={plotIdx}
ref={plotElem => (this.plots[plotIdx] = plotElem)}
className="ba b--black overflow-x-auto"
onScroll={this.handleHorizontalScroll(plotIdx)}
>
// ...
</div>
)}
)}
</div>
【问题讨论】:
-
请澄清您的具体问题或添加其他详细信息以准确突出您的需要。正如目前所写的那样,很难准确地说出你在问什么。
-
@Paulie_D 当然!我编辑了我的主要信息,添加了很多信息。谢谢
-
就个人而言,我会为此使用两种不同的样式,一种有 2 列,另一种有 4 列,并根据来源每天或每月设置不同的类名。
-
@arieljuod 感谢您的建议,但我的数据确实多变,我不喜欢使用硬编码解决方案
-
@arieljuod 是的,有两种可能的来源:每天和每月。数据可能会有所不同,这意味着图表上的条数可能会有很大差异(从 2 到 3000 或更多),因此布局列的数量也可能会有所不同,至少每行必须有两个图表,但它们可以还有3、4、5、6等
flex不好这个原因:stackoverflow.com/questions/42176419/…