【问题标题】:CSS Grid resizable cellCSS Grid 可调整大小的单元格
【发布时间】:2019-09-29 04:08:04
【问题描述】:

在下面的布局中,我想让绿色部分可调整大小。调整大小时,单元格 8 应占用剩余空间,而不会影响其他行中的任何其他单元格。

.App {
  display: grid;
  
  grid-template-columns: 200px 1fr 200px;
  grid-template-rows: 50px 1fr 200px 30px;

  width: 100%;
  height: 100%;
}

.App > div {
  border: 2px solid black;
}

.nav {
  background: green;
}
<div class="App">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div class="nav">7</div>
  <div>8</div>
  <div>9</div>
  <div>10</div>
  <div>11</div>
  <div>12</div>
</div>

尺寸更改将由用户完成。但为了演示,考虑将.nav 元素的width 更改为100px。更改.nav 的大小后,8 个单元格应占用剩余空间并增长。

.nav {
    background: green;
    width: 100px;
}

这种行为可以使用CSS Grid吗?

【问题讨论】:

  • 不...这是 flexbox 的设计初衷。

标签: html css css-grid


【解决方案1】:

您不能更改nav 的宽度并期望它只影响它旁边的元素——它会影响整个第一列。您可以尝试在下面的演示中调整nav 的大小(使用grid-template-columns: auto 1fr 200px)以及足够的min-widthmax-width

.App {
  display: grid;
  grid-template-columns: auto 1fr 200px; /* changed */
  grid-template-rows: 50px 1fr 200px 30px;
}

.App > div {
  border: 2px solid black;
}

.nav {
  background: green;
  width: 100px; /* default width */
  max-width: calc(100vw - 260px); /* do go beyond the third column */
  min-width: 25px; /* min width of nav */
  resize: horizontal; /* resize the div */
  overflow: hidden; /* resize works if overflow not visible */
}
&lt;div class="App"&gt;&lt;div&gt;1&lt;/div&gt;&lt;div&gt;2&lt;/div&gt;&lt;div&gt;3&lt;/div&gt;&lt;div&gt;4&lt;/div&gt;&lt;div&gt;5&lt;/div&gt;&lt;div&gt;6&lt;/div&gt;&lt;div class="nav"&gt;7&lt;/div&gt;&lt;div&gt;8&lt;/div&gt;&lt;div&gt;9&lt;/div&gt;&lt;div&gt;10&lt;/div&gt;&lt;div&gt;11&lt;/div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;

目前的标记可以做到这一点。如果您可以通过将 87 包装到 2 列 grid item 中来更改您的 html 并制作一个 flexbox,那么您可以获得所需的效果 - 请参见下面的演示:

* {
box-sizing: border-box;
}

.App {
  display: grid;
  grid-template-columns: 1fr 1fr 200px;
  grid-template-rows: 50px 1fr 200px 30px;
}

.App > div {
  border: 2px solid black;
}

.nav {
  grid-column: span 2;
  display: flex;
}
.nav > div:first-child {
  background: green;
  resize: horizontal;
  overflow: hidden;
  width: 50%;
}
.nav > div:last-child {
  flex: 1;
  width: 50%;
}
<div class="App">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div class="nav">
    <div>7</div>
    <div>8</div>
  </div>
  <div>9</div>
  <div>10</div>
  <div>11</div>
  <div>12</div>
</div>

您可以在这些帖子中阅读有关带有可调整大小滑块的弹性框的更多信息:

【讨论】:

  • 第一个不是解决方案,因为我不希望更改除第 7 和第 8 个单元格之外的其他行单元格的宽度。 Flex box 解决方案适合我。
猜你喜欢
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 2020-03-19
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多