2

I have a grid where I want it to work somewhat like it is except when there are only 1 or 2 cells I want it to auto size and not be a set of 3 with the last one holding its cell space. When I set repeat(3, 100px) value to auto-fit then it kills the column layout. I still need it to wrap at 3.

.parent {
  background: #f4f4f5;
  font-size:2em;
  border: 1px solid black;
  padding: 20px 0;
  text-align: center;
  width: 100%;
}
.parent .wrapper {
  display: inline-grid;
  grid-template-columns: repeat(3, 100px);
  box-shadow: 1px 0px 5px 0px rgba(0,0,0,0.75);
  grid-auto-flow: row;
  background-color: white;
}

.cell {
  border: 1px solid gray;
  background-color: white;
}

.cell .inner {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100px;
  height: 100px;
  text-align: center;
}
<div class="parent">
  <div class="wrapper">
    <div class="cell">
      <div class="inner">Cell 1</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 2</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 3</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 4</div>
    </div>
  </div> 
</div>
TylerH
  • 20,799
  • 66
  • 75
  • 101
me-me
  • 5,139
  • 13
  • 50
  • 91
  • Unless you want to use JS, I think media queries are your best bet. Ideally, [quantity queries](https://alistapart.com/article/quantity-queries-for-css) would provide the easy fix, but it's just a concept at this point. – Michael Benjamin Mar 23 '19 at 01:46
  • maybe I didn't understand you properly, but why not `grid-template-columns: repeat(auto-fit, minmax(100px, 1fr))` and set `width: 300px` on the `wrapper`? – kukkuz Mar 23 '19 at 04:20
  • Then the columns would expand to fill the 300px width of the container. They would not be 300px. https://jsfiddle.net/qxa0ts95/1/ – Michael Benjamin Mar 23 '19 at 14:46

1 Answers1

0

So you want to make the grid-container auto-sized less that 3 items and wrap after that - here's a solution that uses implicit grids.

  • use a single column inline grid container:

    display: inline-grid;
    grid-template-columns: 100px;
    grid-template-rows: 100px;
    
  • size your implicit grids as 100px x 100px using:

    grid-auto-columns: 100px;
    grid-auto-rows: 100px;
    
  • place your second item to the second row using grid-column: 2; and your third item to the third row using grid-column: 3

Now you will have a 3 x 3 grid - see demo below:

* {
  box-sizing: border-box;
}

.parent {
  background: #f4f4f5;
  font-size: 2em;
  border: 1px solid black;
  padding: 20px 0;
  text-align: center;
  width: 100%;
}

.parent .wrapper {
  display: inline-grid;
  grid-template-columns: 100px; /* one column layout */
  grid-template-rows: 100px; /* sizes the rows */
  grid-auto-columns: 100px; /* sizing columns of implicit grid */
  grid-auto-rows: 100px; /* sizing rows of implicit grid */
  box-shadow: 1px 0px 5px 0px rgba(0, 0, 0, 0.75);
  grid-auto-flow: row;
  background-color: white;
}

.cell:nth-child(2) {
  grid-column: 2; /* places it in the second column */
}

.cell:nth-child(3) { 
  grid-column: 3; /* places it in the third column */
}

.cell {
  border: 1px solid gray;
  background-color: white;
}

.cell .inner {
  display: flex;
  justify-content: center;
  align-items: center;
  /* width: 100px; */
  /* height: 100px; */
  height: 100%; /* added */
  text-align: center;
}
<div class="parent">
  <div class="wrapper">
    <div class="cell">
      <div class="inner">Cell 1</div>
    </div>
  </div>
</div>

<div class="parent">
  <div class="wrapper">
    <div class="cell">
      <div class="inner">Cell 1</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 2</div>
    </div>
  </div>
</div>

<div class="parent">
  <div class="wrapper">
    <div class="cell">
      <div class="inner">Cell 1</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 2</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 3</div>
    </div>
  </div>
</div>

<div class="parent">
  <div class="wrapper">
    <div class="cell">
      <div class="inner">Cell 1</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 2</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 3</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 4</div>
    </div>
  </div>
</div>

<div class="parent">
  <div class="wrapper">
    <div class="cell">
      <div class="inner">Cell 1</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 2</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 3</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 4</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 5</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 6</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 7</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 8</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 9</div>
    </div>
    <div class="cell">
      <div class="inner">Cell 10</div>
    </div>
  </div>
</div>
kukkuz
  • 41,512
  • 6
  • 59
  • 95