Search code examples
htmlcssflexbox

Shrink-wrap flexbox with wrapping flex-items so it can be centered


I have a flexbox with wrapping contents. How can I shrinkwrap the flexbox to its contents? The root problem I'm trying to solve is to center the flexbox. This image describes my issue:

enter image description here

How can I achieve this? Is it possible in pure CSS? I don't know beforehand if the flexbox will wrap to 1, 2 or 3 columns. The width of the elements is known. The height would preferably be unknown, but if it makes it a lot easier, I can decide on a constant height.

Neither width:min-content, width:max-content, width:fit-content nor inline-flex appear to solve the problem.

JS Fiddle: https://jsfiddle.net/oznts5bv/

.container {
  display:flex;
  flex-wrap:wrap;
  border:1px dashed magenta;
}

.container div {
  width:100px;
  height:60px;
  border:1px solid black;
}
<div class="container">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
</div>


Solution

  • Created an two examples: with display: flex;, and display: grid;. The second option will probably suit you better:

    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    
    body {
      display: flex;
      flex-direction: column;
      align-items: center;
      overflow-y: scroll;
    }
    
    .container {
      display: flex;
      flex-wrap: wrap;
      border: 1px dashed magenta;
      max-width: min(100%, 302px);
    }
    
    .container div {
      width: 100px;
      height: 60px;
      border: 1px solid black;
    }
    
    .grid {
      display: grid;
      grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
    }
    <input type="range" min="100" max="600" value="302" oninput="document.querySelectorAll('.container').forEach(el => el.style.maxWidth = 'min(100%, ' + this.value + 'px)')">
    <div class="container">
      <div>1</div>
      <div>2</div>
      <div>3</div>
      <div>4</div>
      <div>5</div>
    </div>
    <br>
    <div class="container grid">
      <div>1</div>
      <div>2</div>
      <div>3</div>
      <div>4</div>
      <div>5</div>
    </div>