【问题标题】:How can I set the width and max-width of a CSS Grid Column?如何设置 CSS 网格列的宽度和最大宽度?
【发布时间】:2018-05-14 11:55:52
【问题描述】:

是否可以限制 CSS 网格列的宽度?

body {
  margin: 0;
  padding: 0;
}
.container {
    display: grid;
    grid-template-columns: minmax(17.5%, 250px) minmax(31.25%, 480px) auto;
    grid-template-rows: 100vh;
    grid-gap: 0;
}
.menu {
    padding-top: 32px;
    background: linear-gradient(135deg, #837DB5 0%, #364176 100%);
}
.list-view {
    background-color: #F5F5FC;
}
<div class="container">
  <div class="menu"></div>
  <div class="list-view"></div>
  <div class="details"></div>
</div>

在上面的例子中,菜单总是使用 17.5% 的宽度,因为:

"如果max小于min,则忽略max,函数为 视为最小值。”

来源:https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-columns

我想要的是一个宽度为 17.5% 且最大为 250 像素的菜单。这可能吗?

【问题讨论】:

  • 如果我理解正确,您希望宽度随屏幕而增长,因此是百分比值,但在屏幕较小时固定为 250 像素?
  • 不,我猜反过来。我希望它是 17.5%,但是当屏幕更大时固定在 250px。

标签: css css-grid


【解决方案1】:

一种方法可能是声明:

.container {grid-template-columns: 250px 480px auto;}

作为您的标准规则。

然后,在考虑您希望应用于第三列的最窄宽度之后,您可以应用 @media 查询。

假设您要确保第三列不小于100px

250px + 480px + 100px = 830px

所以你需要为830px写一个@media查询:

@media only screen and (max-width: 830px) {

    .container {grid-template-columns: 17.5% 31.25% auto;}
}

工作示例:

body {
  margin: 0;
  padding: 0;
}

.container {
    display: grid;
    grid-template-columns: 250px 480px auto;
    grid-template-rows: 100vh;
    grid-gap: 0;
}

.menu {
    padding-top: 32px;
    background: linear-gradient(135deg, #837DB5 0%, #364176 100%);
}

.list-view {
    background-color: #F5F5FC;
}

@media only screen and (max-width: 830px) {
    
    .container {grid-template-columns: 17.5% 31.25% auto;}
}
<div class="container">
  <div class="menu"></div>
  <div class="list-view"></div>
  <div class="details"></div>
</div>

【讨论】:

  • 是的,我想这也是可能的。希望找到一个 CSS 网格唯一的解决方案。
  • 如果您希望第一列宽度为&lt;body&gt; 宽度的17.5% 直到某个&lt;body&gt; 宽度,然后始终为250px,那么@media 查询是绝对是要走的路。
【解决方案2】:

您希望列的标准宽度为 17.5%,最大宽度为 250 像素。

您不能使用grid-template-columns,因为minmax() 函数在任何时候max 小于min 时计算为min。这意味着 17.5% 将在更宽的屏幕上覆盖 250 像素。

一个干净的解决方法是将grid-template-columns 设置为min-content,这会将列收缩包装到内容的长度。然后在网格项上设置宽度参数。

.container {
  display: grid;
  grid-template-columns: min-content minmax(31.25%, 480px) auto;
}

.menu {
  width: 17.5%;
  max-width: 250px;
}

但是,网格项上的百分比长度在这种情况下不起作用,因为父引用(列)本质上设置为零宽度(min-content)。 (fiddle demo)。

幸运的是,在这种情况下,由于您的容器设置为视口的宽度,因此您可以使用vw 单位轻松解决此问题。

.menu {
  width: 17.5vw;
  max-width: 250px;
}

.container {
  display: grid;
  grid-template-columns: min-content minmax(31.25%, 480px) auto;
  grid-template-rows: 100vh;
  grid-gap: 0;
}

.menu {
  width: 17.5vw;
  max-width: 250px;
  padding-top: 32px;
  background: linear-gradient(135deg, #837DB5 0%, #364176 100%);
}

.list-view {
  background-color: #F5F5FC;
}

body {
  margin: 0;
  padding: 0;
}
<div class="container">
  <div class="menu"></div>
  <div class="list-view"></div>
  <div class="details"></div>
</div>

jsFiddle demo

【讨论】:

  • 现在 17,5% 实际上是列宽的 17,5%。所以紫色的柱子现在真的很小了。
  • 你运行代码sn-p了吗?您实际上会看到 4 列,因为第一列没有完全填充背景颜色
  • 如果内容不是 100% 宽度怎么办?
  • @klaasjansen 在这种情况下,您使用我的答案:p
【解决方案3】:

不确定这种方式是否可行,但另一种方法是使用 flexbox 代替 CSS 网格,您可以轻松实现:

body {
  margin: 0;
  padding: 0;
}

.container {
  display: flex;
  height: 100vh;
}

.menu {
  width: 17.5%;
  max-width: 250px;
  padding-top: 32px;
  background: linear-gradient(135deg, #837DB5 0%, #364176 100%);
}

.list-view {
  width: 32.25%;
  max-width: 480px;
  background-color: #F5F5FC;
}

.details {
  flex: 1;
}
<div class="container">
  <div class="menu"></div>
  <div class="list-view"></div>
  <div class="details"></div>
</div>

【讨论】:

  • 这不能用 css-grid 实现吗?我会这么认为吗?
  • @klaasjansen 实际上我没有找到 CSS-grid 的方法,但让我们等待更多人来;)你可能会得到更多答案
  • 感谢这个解决方案,这是一个很好的后备方案。我实际上正在尝试学习 css-grid,所以这就是我想使用它的原因;)
猜你喜欢
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多