【问题标题】:Is it possible to set proportional grid columns based on content?是否可以根据内容设置比例网格列?
【发布时间】:2018-07-18 12:30:36
【问题描述】:

使用 Flexbox 或 CSS Grid,是否可以根据其中一列的内容调整列的大小?

这是我想要的:

我有 2 列,一个 ma​​in 和一个 side

|------------------------container--------------------------|
|                                                           |
||----------------------------------------|----------------||
||               main                     |      side      ||
||----------------------------------------|----------------||
|                                                           |
|-----------------------------------------------------------|

我希望 side 根据其内容自动调整大小,并且我希望 ma​​in 的宽度是 side 的两倍, 最低限度。它可以变大,但不能变小。

随着容器的增加,ma​​in 将以相同的速度增长,而 side 保持其自动宽度。

|--------------------------container increases----------------------|
|                                                                   |
||------------------------------------------------|----------------||
||                   main increases               |      side      ||
||------------------------------------------------|----------------||
|                                                                   |
|-------------------------------------------------------------------|

容器可以缩小到 side 的 3 倍大,此时 ma​​in 将是 side 的两倍宽>。我希望这是断点。

|--------------------container----------------------|
|                                                   |
||--------------------------------|----------------||
||               main             |      side      ||
||--------------------------------|----------------||
|                                                   |
|---------------------------------------------------|

如果容器再缩小,我希望列堆叠,两列现在都是 100% 宽度:

|--------------------container--------------------|
|                                                 |
||-----------------------------------------------||
||               main                            ||
||-----------------------------------------------||
||-----------------------------------------------||
||                           side                ||
||-----------------------------------------------||
|                                                 |
|-------------------------------------------------|

这是我尝试过的:

我尝试使用 Flexbox 和 Grid 执行此操作,但我无法让主列根据侧列确定其大小。

.container-grid {
  display: grid;
  grid-template-columns: 1fr auto; /* works, but doesn’t wrap when left column gets too small */
  /* I also tried the repeat() syntax, but that only worked for similarly-sized columns */
}
.container-flex {
  display: flex;
  flex-wrap: wrap;
}
.main { flex: 2; } .side { flex: 1; } /* same problem, doesn’t wrap */
.main ( flex: 0 1 auto; } .side { flex: 0 0 auto; } /* wraps columns too early, any time main is smaller than intrinsic width */

我尝试过的唯一可行的解​​决方案是知道侧栏的固定宽度(我必须在不知道其内容的情况下进行预测),然后使用 3 倍宽度的媒体查询。当然,媒体查询仅适用于窗口宽度,而不适用于容器宽度,因此我必须使用容器的任何父元素来计算媒体查询。

.container-grid {
  display: grid;
  grid-template-columns: 1fr 15em;
}
@media screen and (max-width: 45em) {
  .container-grid {
    grid-template-columns: 1fr;
  }
}

【问题讨论】:

    标签: css layout flexbox css-grid


    【解决方案1】:

    这是一种使用 Flexbox 的解决方案,您使用的 flex-grow 值在 main 上比在 side 上大得多。

    这样,side 将在包装时填充父级,而在宽屏上,main 上的值要高得多,side 上的 flex-growth 将几乎没有。

    结合main 上的min-widthside 大小的两倍,它会在它变小之前换行,为此我们可以使用百分比,因为它基于父级的宽度。

    所以在这种情况下,main 的两倍大小将是父级的 2/3,即 66.666%。

    Fiddle demo

    堆栈sn-p

    .container-flex {
      display: flex;
      flex-wrap: wrap;
    }
    
    .main {
      flex: 10000;
      min-width: 66.666%;
      background: lightblue;
    }
    
    .side {
      flex: 1 0 auto;
      background: lightgreen;
    }
    
    span {
      display: inline-block;
      padding: 20px;
    }
    <div class="container-flex">
    
      <div class="main">
        <span>Fill remain, min. twice the "side"</span>
      </div>
    
      <div class="side">
        <span>Take content size</span>
      </div>
    
    </div>

    【讨论】:

    • 对我来说似乎是一个完美的解决方案......我不明白你的评论我能来的最接近
    • @vals 谢谢...会改变那部分,因为当你这样说时听起来很奇怪:)
    • @vals 我想象“我能来的最接近”的部分,因为它看起来有点老套:将 flex-grow 设置为任意大的数字。但看起来它可能会起作用,所以我愿意试一试。
    • @chharvey 是的,这是正确的。原因是需要将side 上的flex-grow 设置为1,否则包装时它不会填充父级,但是当展开时,main 上的flex-grow 需要足够大所以当计算内容减少后剩余的空间时,main 必须取 all,否则side 也会增长一些。所以从技术上讲,side 将获得 1/10001 的剩余空间,main 获得 10000/10001,这就是为什么我说 最接近 :)
    • @LGSon - 你的逻辑非常合理;在编写 CSS 时,我通常不会这样想。 CSS 中通常有一个属性或值完全符合我的要求……大多数时候。这就是为什么我称你的方法有点“hacky”。但它解决了问题,所以我将其标记为解决方案,直到出现更好的解决方案! (FTR,我使用了 999999,因为它更高更容易输入。)
    猜你喜欢
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2012-05-21
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多