【问题标题】:Arrange some items in last row using grid instead of flex使用grid而不是flex在最后一行排列一些项目
【发布时间】: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/…

标签: css layout css-grid


【解决方案1】:

minmax 语句中使用SVG_WIDTH 代替45%

至于出现大值的溢出问题,有一个描述为here 的解决方法,虽然它有点hacky。根据您的情况调整,最少两列:

@media (max-width: ${SVG_WIDTH * 2 + 10}px) {
  .container { grid-template-columns: repeat(2, 1fr); }
}

10 是您的grid-gap。并且.container 采用页面的全宽,body 边距重置为 0。否则,还添加 body 标签的默认边距(左右 8px)和侧边栏宽度(如果有的话)。如果您的侧边栏或布局是自适应的,您也可以使用 CSS calc(),但目前在媒体查询 is limited 中对 calc() 的支持适用于最近的浏览器。

【讨论】:

  • 我编辑了我的主要问题,添加了有关使用您的建议的详细信息。它不起作用
  • @beth,你确定它应用正确吗?如果没有,可能需要在数字后面添加px
  • @beth:你可以在浏览器开发者工具的 Inspector 中查看。找到div 元素并确保该属性在那里,它没有被删除并且它的值是正确的。它应该有100px(或任何宽度)代替45%
  • 谢谢,还是有问题。我希望你能帮助我。我再次更改了主要信息
  • 感谢您的更新。我正在使用 React,那么我该如何使用您的代码?我不能把它放在 css 文件中,因为在那个文件中我没有 SVG_WIDTH 变量。通常我在组件js文件中创建一个变量const style = {something in css},然后我以这种方式使用它&lt;div style={style}/&gt;。在这种情况下如何使用媒体查询样式规则?
猜你喜欢
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 2019-01-05
  • 2019-07-19
  • 2016-07-21
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多