我可以使用动态数量的单元格/行的CSS网格吗?

art*_*pov 32 css css-grid

我想做的是制作一个动态数量的单元CSS网格.为简单起见,我们假设每行总有四个单元格.我可以指定具有这种动态行数的网格吗?

为了更容易,这是Flexbox实现:

const COLORS = [
  '#FE9',
  '#9AF',
  '#F9A',
  "#AFA",
  "#FA7"
];

function addItem(container, template) {
  let color = COLORS[_.random(COLORS.length - 1)];
  let num = _.random(10000);
  
  container.append(Mustache.render(template, { color, num }));
}

$(() => {
  const tmpl = $('#item_template').html()
  const container = $('#app');
  
  for(let i=0; i<5; i++) { addItem(container, tmpl); }
  
  $('#add_el').click(() => {
    addItem(container, tmpl);
  })
  
  container.on('click', '.del_el', (e) => {
    $(e.target).closest('.item').remove();
  });
});
Run Code Online (Sandbox Code Playgroud)
.container {
  width: 100%;
  display: flex;
  flex-flow: row wrap;
  justify-content: flex-start;
}
.container .item {
  flex: 0 0 calc(25% - 1em);
  min-height: 120px;
  margin: 0.25em 0.5em;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/mustache.js/2.3.0/mustache.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="app" class="container">
</div>

<button id="add_el">Add element</button>

<template id="item_template">
  <div class="item" style="background: {{color}}">
    <p>{{ num }}</p>
    <p>
      <button class="del_el">Delete</button>
    </p>
  </div>
</template>
Run Code Online (Sandbox Code Playgroud)

PS显然,我第一次不够清楚...我想使用最新的CSS Grid Layout重新创建这个效果.

Ale*_*ese 29

只需使用下面的代码自动生成网格列

.container {
  display: grid;
  grid-auto-flow: column;
}
Run Code Online (Sandbox Code Playgroud)

  • 但这种变化给出了几乎相同的宽度。我们怎样才能让它根据子列宽度进行渲染。假设我的第一列是“220px”,我想要的第二列是“auto”或者说“200px auto auto”或“220px auto 220px”? (2认同)

art*_*pov 27

好的,在阅读了MDN参考资料后,我找到了答案!动态行(或列)的关键是repeat属性.

const COLORS = [
  '#FE9',
  '#9AF',
  '#F9A',
  "#AFA",
  "#FA7"
];

function addItem(container, template) {
  let color = COLORS[_.random(COLORS.length - 1)];
  let num = _.random(10000);
  
  container.append(Mustache.render(template, { color, num }));
}

$(() => {
  const tmpl = $('#item_template').html()
  const container = $('#app');
  
  for(let i=0; i<5; i++) { addItem(container, tmpl); }
  
  $('#add_el').click(() => {
    addItem(container, tmpl);
  })
  
  container.on('click', '.del_el', (e) => {
    $(e.target).closest('.item').remove();
  });
});
Run Code Online (Sandbox Code Playgroud)
.container {
  width: 100%;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(auto-fill, 120px);
  grid-row-gap: .5em;
  grid-column-gap: 1em;
}

.container .item {
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/mustache.js/2.3.0/mustache.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="app" class="container">
</div>

<button id="add_el">Add element</button>

<template id="item_template">
  <div class="item" style="background: {{color}}">
    <p>{{ num }}</p>
    <p>
      <button class="del_el">Delete</button>
    </p>
  </div>
</template>
Run Code Online (Sandbox Code Playgroud)

PS或者您可以在我的特定示例中使用grid-auto-rows.

  • 将 `grid-auto-flow` 设置为 `column` 有帮助吗?https://codepen.io/art-solopov/pen/xLNYVw (3认同)
  • grid-template-columns:repeat(自动填充,Xpx); ...最后我找到了:)谢谢! (2认同)

Vic*_*yew 9

对于那些在这里登陆寻找一种方式,有一种动态表的,与项目包装到新行,同时在整个行对齐,一个不错的解决方案是使用flexflex-wrapflex: 1所有元素:

.container {
  width: 100%;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
}

.container .item {
  flex: 1;
}
Run Code Online (Sandbox Code Playgroud)

  • 也可以按照这篇好文章使用 css 网格来完成:https://css-tricks.com/auto-sizing-columns-css-grid-auto-fill-vs-auto-fit/ (3认同)

far*_*eri 9

太长了;grid-template-columns: repeat(auto-fit, minmax(200px, 1fr))

我要寻找的是如何让浏览器计算适当的列数,同时保持行拉伸。我在mdn 文档中找到了答案。

重要的是设置列的最小宽度。在我的示例中,我使用了 200px。

有趣的事实:您可以使用 200px 来代替,min(200px, 100%)当容器空间不足时,它可以让项目缩小得更小。如同min-width: 100%

.container {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}

.container:has(+input:checked) {
  grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr));
}


.fancy-colors {
  border: 2px solid #f76707;
  border-radius: 5px;
  background-color: #fff4e6;
  width: 600px;
  resize: horizontal;
  overflow: auto;
  position: relative;
  &::after {
    position: absolute;
    bottom: 0;
    right: 10px;
    content: "Resize me!";
    color: grey;
    font-size: 0.8em;
  }
  > * {
    border: 2px solid #ffa94d;
    border-radius: 5px;
    background-color: #ffd8a8;
    padding: 0.8em;
    color: #d9480f;
  }
}
Run Code Online (Sandbox Code Playgroud)
<div class="container fancy-colors">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
  <div>Four</div>
  <div>Five</div>
  <div>Six</div>
  <div>Seven</div>
</div>

<input type="checkbox">min(200px, 100%)</input>
Run Code Online (Sandbox Code Playgroud)